int aspace_map_region_anywhere( id_t id, vaddr_t * start, size_t extent, vmflags_t flags, vmpagesize_t pagesz, const char * name, paddr_t pmem ) { int status; retry: if ((status = aspace_find_hole(id, 0, extent, pagesz, start))) return status; if ((status = aspace_add_region(id, *start, extent, flags, pagesz, name))) { if (status == -ENOTUNIQ) goto retry; /* we lost a race with someone */ return status; } if ((status = aspace_map_pmem(id, pmem, *start, extent))) { aspace_del_region(id, *start, extent); return status; } return 0; }
/* * Attach a remote XPMEM address segment */ static int xpmem_try_attach_remote(xpmem_segid_t segid, xpmem_apid_t apid, off_t offset, size_t size, vaddr_t * vaddr) { int status = 0; vaddr_t at_vaddr = 0; /* Find free address space */ status = aspace_find_hole(current->aspace->id, 0, size, PAGE_SIZE, &at_vaddr); if (status != 0) { XPMEM_ERR("aspace_find_hole() failed (%d)", status); return status; } /* Add region to aspace */ status = aspace_add_region(current->aspace->id, at_vaddr, size, VM_READ | VM_WRITE | VM_USER, PAGE_SIZE, "xpmem"); if (status != 0) { XPMEM_ERR("aspace_add_region() failed (%d)", status); return status; } /* Attach to remote memory */ status = xpmem_attach_remote(xpmem_my_part->domain_link, segid, apid, offset, size, (u64)at_vaddr); if (status != 0) { XPMEM_ERR("xpmem_attach_remote() failed (%d)", status); aspace_del_region(current->aspace->id, at_vaddr, size); return status; } *vaddr = at_vaddr; return 0; }
static void* map( paddr_t paddr, size_t extent ) { id_t my_id; int status; vaddr_t vstart; // Debug1( "paddr=%#lx extent=%#lx\n", paddr, extent ); if ( ( status = aspace_get_myid( &my_id ) ) ) { printf("ERROR: aspace_get_myid() status=%d\n", status); return (void*) -1; } if ( ( status = aspace_find_hole( my_id, 0, extent, PAGE_SIZE, &vstart ) ) ) { printf("ERROR: aspace_find_hole() status=%d\n", status); return (void*) -1; } // Debug1("vstart=%#lx\n",vstart); if ( ( status = aspace_add_region( my_id, vstart, extent, VM_READ | VM_WRITE | VM_USER, PAGE_SIZE, "application") ) ) { printf("ERROR: aspace_add_region() status=%d\n", status); return (void*) -1; } if ( ( status = aspace_map_pmem( my_id, paddr, vstart, extent ) ) ) { printf("ERROR: aspace_map_pmem() status=%d\n", status); aspace_del_region( my_id, vstart, extent ); return (void*) -1; } // Debug1( "paddr=%#lx vstart=%#lx len=%#lx\n", paddr, vstart, extent ); return (void*) vstart; }