[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-users] IOCTL_PRIVCMD_MMAPBATCH can't mmap more than 160 pages?
Hi, I want to map the whole guest memory by xc_map_foreign_range() in libxc, but I failed when the mmaping number of pages exceeded 160 pages (640KB). Can anyone help, 1.figure out the reason; 2.try the same xc_map_foreign_range() codes if you can use IOCTL_PRIVCMD_MMAPBATCH2 and share you result ? Thank you. My configurations: Host: Ubuntu 12.04 64bit Xen 4.1.2 Linux Kernel: 3.5.0-23, support IOCTL_PRIVCMD_MMAPBATCH only, rather than IOCTL_PRIVCMD_MMAPBATCH2. Guest: Windows XP SP2 32bit Source code: #define MEM_PAGE_MAX_MAP (40 * XC_PAGE_SIZE) for (i=0; i < region_num; i++) { unsigned long pfn_offset = i * MEM_PAGE_MAX_MAP / XC_PAGE_SIZE; int map_size = (last_region_size==0||i<region_num-1)?MEM_PAGE_MAX_MAP:last_region_size; printf("foreign_range " "pfn_offset = %ld, map_size = %ld \n" , pfn_offset, map_size); void *memory = xc_map_foreign_range(xchandle, domainid, map_size, PROT_READ, pfn_offset); if (MAP_FAILED == memory || NULL == memory) { dbprint("xc_map_foreign_range failed on pfn_offset=%d\n", pfn_offset); return; } } Output: foreign_range pfn_offset = 0, map_size = 163840 foreign_range pfn_offset = 40, map_size = 163840 foreign_range pfn_offset = 80, map_size = 163840 foreign_range pfn_offset = 120, map_size = 163840 foreign_range pfn_offset = 160, map_size = 16384 xc_map_foreign_range failed on pfn_offset=160 I have debuged libxc, too. And I find that when I have mmaped 160 pages, subsequent invoking of ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx) will set pfn[n] = 140737344202616, never conform to arr[n] any more. libxc code: xc_linux_osdep.c:277 memcpy(pfn, arr, num * sizeof(*arr)); ioctlx.num = num; ioctlx.dom = dom; ioctlx.addr = (unsigned long)addr; ioctlx.arr = pfn; rc = ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx); rc = rc < 0 ? -errno : 0; for ( i = 0; i < num; ++i ) { switch ( pfn[i] ^ arr[i] ) { case 0: err[i] = rc != -ENOENT ? rc : 0; continue; default: err[i] = -EINVAL; continue; } Also, I have tried to look into kernel/drivers/xen/privcmd.c, but the data flow in the ioctl interface seems complex to me. So I haven't figured out the reason even nnow. _______________________________________________ Xen-users mailing list Xen-users@xxxxxxxxxxxxx http://lists.xen.org/xen-users
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |