[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] The hypercall will fail and return EFAULT when the page becomes COW by forking process in linux
Hi, everybody I meet a trouble. in dom0, I call the xc_domain_set_pod_target hypercall in one thread, and meanwhile fork a process in another thread, it will return EFAULT by the function of copy_to_user failed in hypervisor. I see that when forking a process, the page will become COW, copy_to_user will cause a wirte protection page fault and return EFAULT. Is There any ideas for it? I write a simple codes to reproduce it: typedef unsigned long xen_pfn_t; typedef unsigned long uint64_t; typedef unsigned short domid_t; #include <unistd.h> #include <sys/ioctl.h> #include <stdlib.h> #include <assert.h> #include <string.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <sys/types.h> #include <xen/sys/privcmd.h> #include <errno.h> #define BUFFER_SIZE 4096 struct xen_pod_target { /* IN */ uint64_t target_pages; /* OUT */ uint64_t tot_pages; uint64_t pod_cache_pages; uint64_t pod_entries; /* IN */ domid_t domid; }; #define PRIVCMD_INTF "/proc/xen/privcmd" #define XENMEM_get_pod_target 17 #define __HYPERVISOR_memory_op 12 int main (int argc, char *argv[]) { int err; domid_t domid; struct xen_pod_target *pod = NULL; int fd; privcmd_hypercall_t hypercall; fd = open (PRIVCMD_INTF, O_RDWR); assert (0 < fd); pod = (struct xen_pod_target *) memalign(4096, BUFFER_SIZE); memset (pod, 0, BUFFER_SIZE); pod->domid = 0; printf("pid = %d, pod=0x%p\n",getpid(), pod); hypercall.op = __HYPERVISOR_memory_op; hypercall.arg[0] = (unsigned long)XENMEM_get_pod_target; hypercall.arg[1] = (unsigned long)pod; if (0 == fork()) { exit(0); } err = ioctl (fd, IOCTL_PRIVCMD_HYPERCALL, &hypercall); if (0 > err) { printf("Failed get_pod_target dom0, errno = %d\n", errno); } return 0; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |