Re: [XenPPC] [PATCH] [UPDATE] Xencomm patch
pushed.. thanks On Feb 5, 2007, at 5:42 PM, Jerone Young wrote: Yes..another Xencomm patch :-). The last one actually hit a bug that was currently in xen-linux with handling of domain control operation XEN_DOMCTL_shadow_op. This fix is included in the patch. I've also added error handling and changed return codes from xencomm_no_alloc() failure to be EINVAL. Signed-off-by: Jerone Young <[EMAIL PROTECTED]> ___ Xen-ppc-devel mailing list Xen-ppc-devel@lists.xensource.com http://lists.xensource.com/xen-ppc-devel ___ Xen-ppc-devel mailing list Xen-ppc-devel@lists.xensource.com http://lists.xensource.com/xen-ppc-devel
[XenPPC] [PATCH] [UPDATE] Xencomm patch
Yes..another Xencomm patch :-). The last one actually hit a bug that was currently in xen-linux with handling of domain control operation XEN_DOMCTL_shadow_op. This fix is included in the patch. I've also added error handling and changed return codes from xencomm_no_alloc() failure to be EINVAL. Signed-off-by: Jerone Young <[EMAIL PROTECTED]> diff -r ab3b5849331d arch/powerpc/platforms/xen/gnttab.c --- a/arch/powerpc/platforms/xen/gnttab.c Sun Jan 21 08:36:53 2007 -0500 +++ b/arch/powerpc/platforms/xen/gnttab.c Sun Feb 04 12:12:24 2007 -0600 @@ -244,8 +244,8 @@ static void gnttab_post_map_grant_ref( int HYPERVISOR_grant_table_op(unsigned int cmd, void *op, unsigned int count) { - void *desc; - void *frame_list; + void *desc = NULL; + void *frame_list = NULL; int argsize; int ret; @@ -263,8 +263,13 @@ int HYPERVISOR_grant_table_op(unsigned i memcpy(&setup, op, sizeof(setup)); argsize = sizeof(setup); - frame_list = xencomm_create_inline( - xen_guest_handle(setup.frame_list)); + frame_list = xencomm_map( + xen_guest_handle(setup.frame_list), + (sizeof(*xen_guest_handle(setup.frame_list)) + * setup.nr_frames)); + + if (frame_list == NULL) + return -ENOMEM; set_xen_guest_handle(setup.frame_list, frame_list); memcpy(op, &setup, sizeof(setup)); @@ -286,12 +291,18 @@ int HYPERVISOR_grant_table_op(unsigned i return -ENOSYS; } - desc = xencomm_create_inline(op); + desc = xencomm_map_no_alloc(op, argsize); + + if (desc == NULL) + return -ENOSPC; ret = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_grant_table_op), cmd, desc, count); if (cmd == GNTTABOP_map_grant_ref) gnttab_post_map_grant_ref(op, count); + + xencomm_free(frame_list); + xencomm_free(desc); return ret; } diff -r ab3b5849331d arch/powerpc/platforms/xen/hcall.c --- a/arch/powerpc/platforms/xen/hcall.c Sun Jan 21 08:36:53 2007 -0500 +++ b/arch/powerpc/platforms/xen/hcall.c Sun Feb 04 12:08:49 2007 -0600 @@ -54,25 +54,43 @@ int HYPERVISOR_console_io(int cmd, int count, char *str) { - void *desc = xencomm_create_inline(str); - - return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_console_io), + int rc; + + void *desc = xencomm_map_no_alloc(str, count); + + if (desc == NULL) + return -EINVAL; + + rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_console_io), cmd, count, desc); + + xencomm_free(desc); + + return rc; } EXPORT_SYMBOL(HYPERVISOR_console_io); int HYPERVISOR_event_channel_op(int cmd, void *op) { - void *desc = xencomm_create_inline(op); - - return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_event_channel_op), + int rc; + + void *desc = xencomm_map_no_alloc(op, sizeof(evtchn_op_t)); + if (desc == NULL) + return -EINVAL; + + rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_event_channel_op), cmd, desc); + + xencomm_free(desc); + + return rc; + } EXPORT_SYMBOL(HYPERVISOR_event_channel_op); -int HYPERVISOR_xen_version_userspace(int cmd, void *arg) -{ - struct xencomm_desc *desc; +int HYPERVISOR_xen_version(int cmd, void *arg) +{ + void *desc; const unsigned long hcall = __HYPERVISOR_xen_version; int argsize; int rc; @@ -97,7 +115,10 @@ int HYPERVISOR_xen_version_userspace(int argsize = sizeof(xen_platform_parameters_t); break; case XENVER_pagesize: - argsize = (arg == NULL) ? 0 : sizeof(void *); + if (arg == NULL) + argsize = 0; + else + argsize = sizeof(void *); break; case XENVER_get_features: argsize = sizeof(xen_feature_info_t); @@ -107,38 +128,41 @@ int HYPERVISOR_xen_version_userspace(int return -ENOSYS; } - rc = xencomm_create(arg, argsize, &desc, GFP_KERNEL); - if (rc) - return rc; - - rc = plpar_hcall_norets(XEN_MARK(hcall), cmd, xencomm_pa(desc)); - - xencomm_free(desc); + /* desc could be NULL in the case of XENVER_pagesize with NULL arg */ + desc = xencomm_map(arg, argsize); + + rc = plpar_hcall_norets(XEN_MARK(hcall), cmd, desc); + + xencomm_free(desc); + return rc; } EXPORT_SYMBOL(HYPERVISOR_xen_version); -int HYPERVISOR_xen_version(int cmd, void *arg) -{ - if (is_kernel_addr((unsigned long)arg)) { - void *desc = xencomm_create_inline(arg); - return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_xen_version), cmd, desc); - } - return HYPERVISOR_xen_version_userspace(cmd, arg); -} int HYPERVISOR_physdev_op(int cmd, void *op) { - void *desc = xencomm_create_inline(op); - - return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_physdev_op), + void *desc = xencomm_map_no_alloc(op, sizeof(physdev_op_t)); + int rc; + + if (desc == NULL) + return -EINVAL; + + rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_physdev_op), cmd, desc); + + xencomm_free(desc); + + return rc; } EXPORT_SYMBOL(HYPERVISOR_physdev_op); int HYPERVISOR_sched_op(int cmd, void *arg) { - struct xencomm_desc *desc; + int argsize = 0; + int rc; + void *desc; + evtchn_port_t *ports = NULL; switch (cmd) { case SCHEDOP_yield: @@ -148,30 +172,46 @@ int HYPERVISOR_sched_op(int cmd, void *a break; case SCHEDOP_poll: { - evtchn_port_t *ports;
Re: [XenPPC] [PATCH] [UPDATE] Xencomm patch
On Jan 24, 2007, at 1:08 AM, Jerone Young wrote: With all the recommendations here is another udpate to the Xencomm patch. Actually, you missed some.. :) I was unable though to successfully remove xencomm_create & replace it with xencomm_map. It was causing issues when loading of Dom0 that would cause the kernel to blowup. "blowup"? as in "hang", or "trap into xmon" if the later, do you have a traceback? Testing: I have tested it loading xennet driver as a module, though I could not get Xen kernel to load the block device driver (blkfront) as a module in an initrd. Not sure why? No crash, just wouldn't load it. Otherwise kernel loads fine as dom0 & domU. We need to debug this. Signed-off-by: Jerone Young <[EMAIL PROTECTED]> # HG changeset patch # User Jerone Young <[EMAIL PROTECTED]> # Date 1169498835 21600 # Node ID 82e1886955c349ee9c473560ead37f61b787fcd7 # Parent ab3b5849331da89e578ae0813021376d66b7f333 Initial Xencomm patch. Still have to remove xencomm_create usage. diff -r ab3b5849331d -r 82e1886955c3 arch/powerpc/platforms/xen/ gnttab.c --- a/arch/powerpc/platforms/xen/gnttab.c Sun Jan 21 08:36:53 2007 -0500 +++ b/arch/powerpc/platforms/xen/gnttab.c Mon Jan 22 14:47:15 2007 -0600 @@ -263,8 +263,9 @@ int HYPERVISOR_grant_table_op(unsigned i I'm pretty sure this can happen in interrupt so you'll need to use _early. memcpy(&setup, op, sizeof(setup)); argsize = sizeof(setup); - frame_list = xencomm_create_inline( - xen_guest_handle(setup.frame_list)); + frame_list = xencomm_map( + xen_guest_handle(setup.frame_list), + (sizeof(ulong) * setup.nr_frames)); s/sizeof(ulong)/sizeof(*xen_guest_handle(setup.frame_list)/ set_xen_guest_handle(setup.frame_list, frame_list); memcpy(op, &setup, sizeof(setup)); @@ -286,7 +287,7 @@ int HYPERVISOR_grant_table_op(unsigned i return -ENOSYS; } - desc = xencomm_create_inline(op); + desc = xencomm_map(op, argsize); ret = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_grant_table_op), cmd, desc, count); diff -r ab3b5849331d -r 82e1886955c3 arch/powerpc/platforms/xen/ hcall.c --- a/arch/powerpc/platforms/xen/hcall.c Sun Jan 21 08:36:53 2007 -0500 +++ b/arch/powerpc/platforms/xen/hcall.c Mon Jan 22 14:47:15 2007 -0600 @@ -54,7 +54,7 @@ int HYPERVISOR_console_io(int cmd, int count, char *str) { - void *desc = xencomm_create_inline(str); + void *desc = xencomm_map_early(str, count); return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_console_io), cmd, count, desc); @@ -63,19 +63,24 @@ EXPORT_SYMBOL(HYPERVISOR_console_io); int HYPERVISOR_event_channel_op(int cmd, void *op) { - void *desc = xencomm_create_inline(op); + void *desc = xencomm_map_early(op, sizeof(evtchn_op_t)); return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_event_channel_op), cmd, desc); } EXPORT_SYMBOL(HYPERVISOR_event_channel_op); -int HYPERVISOR_xen_version_userspace(int cmd, void *arg) +int HYPERVISOR_xen_version(int cmd, void *arg) { struct xencomm_desc *desc; const unsigned long hcall = __HYPERVISOR_xen_version; int argsize; int rc; + + if (is_phys_contiguous((unsigned long)arg)) { + desc = xencomm_map_early(arg, sizeof(__u64)); + return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_xen_version), cmd, desc); + } But what if cmd is not 8 bytes like the many choices below?! switch (cmd) { case XENVER_version: @@ -118,18 +123,10 @@ int HYPERVISOR_xen_version_userspace(int } EXPORT_SYMBOL(HYPERVISOR_xen_version); -int HYPERVISOR_xen_version(int cmd, void *arg) -{ - if (is_kernel_addr((unsigned long)arg)) { - void *desc = xencomm_create_inline(arg); - return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_xen_version), cmd, desc); - } - return HYPERVISOR_xen_version_userspace(cmd, arg); -} int HYPERVISOR_physdev_op(int cmd, void *op) Interrupt FOR SURE, please use _early. { - void *desc = xencomm_create_inline(op); + void *desc = xencomm_map(op, sizeof(physdev_op_t)); return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_physdev_op), cmd, desc); @@ -138,6 +135,7 @@ EXPORT_SYMBOL(HYPERVISOR_physdev_op); Interrupt FOR SURE, please use _early. int HYPERVISOR_sched_op(int cmd, void *arg) { + int argsize = 0; struct xencomm_desc *desc; switch (cmd) { @@ -151,24 +149,30 @@ int HYPERVISOR_sched_op(int cmd, void *a Interrupt FOR SURE, please use _early. evtchn_port_t *ports; struct sched_poll sched_poll; + argsize = sizeof(struct sched_poll); + memcpy(&sched_poll, arg, sizeof(sched_poll));
[XenPPC] [PATCH] [UPDATE] Xencomm patch
With all the recommendations here is another udpate to the Xencomm patch. I was unable though to successfully remove xencomm_create & replace it with xencomm_map. It was causing issues when loading of Dom0 that would cause the kernel to blowup. Testing: I have tested it loading xennet driver as a module, though I could not get Xen kernel to load the block device driver (blkfront) as a module in an initrd. Not sure why? No crash, just wouldn't load it. Otherwise kernel loads fine as dom0 & domU. Signed-off-by: Jerone Young <[EMAIL PROTECTED]> # HG changeset patch # User Jerone Young <[EMAIL PROTECTED]> # Date 1169498835 21600 # Node ID 82e1886955c349ee9c473560ead37f61b787fcd7 # Parent ab3b5849331da89e578ae0813021376d66b7f333 Initial Xencomm patch. Still have to remove xencomm_create usage. diff -r ab3b5849331d -r 82e1886955c3 arch/powerpc/platforms/xen/gnttab.c --- a/arch/powerpc/platforms/xen/gnttab.c Sun Jan 21 08:36:53 2007 -0500 +++ b/arch/powerpc/platforms/xen/gnttab.c Mon Jan 22 14:47:15 2007 -0600 @@ -263,8 +263,9 @@ int HYPERVISOR_grant_table_op(unsigned i memcpy(&setup, op, sizeof(setup)); argsize = sizeof(setup); - frame_list = xencomm_create_inline( - xen_guest_handle(setup.frame_list)); + frame_list = xencomm_map( + xen_guest_handle(setup.frame_list), + (sizeof(ulong) * setup.nr_frames)); set_xen_guest_handle(setup.frame_list, frame_list); memcpy(op, &setup, sizeof(setup)); @@ -286,7 +287,7 @@ int HYPERVISOR_grant_table_op(unsigned i return -ENOSYS; } - desc = xencomm_create_inline(op); + desc = xencomm_map(op, argsize); ret = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_grant_table_op), cmd, desc, count); diff -r ab3b5849331d -r 82e1886955c3 arch/powerpc/platforms/xen/hcall.c --- a/arch/powerpc/platforms/xen/hcall.c Sun Jan 21 08:36:53 2007 -0500 +++ b/arch/powerpc/platforms/xen/hcall.c Mon Jan 22 14:47:15 2007 -0600 @@ -54,7 +54,7 @@ int HYPERVISOR_console_io(int cmd, int count, char *str) { - void *desc = xencomm_create_inline(str); + void *desc = xencomm_map_early(str, count); return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_console_io), cmd, count, desc); @@ -63,19 +63,24 @@ EXPORT_SYMBOL(HYPERVISOR_console_io); int HYPERVISOR_event_channel_op(int cmd, void *op) { - void *desc = xencomm_create_inline(op); + void *desc = xencomm_map_early(op, sizeof(evtchn_op_t)); return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_event_channel_op), cmd, desc); } EXPORT_SYMBOL(HYPERVISOR_event_channel_op); -int HYPERVISOR_xen_version_userspace(int cmd, void *arg) +int HYPERVISOR_xen_version(int cmd, void *arg) { struct xencomm_desc *desc; const unsigned long hcall = __HYPERVISOR_xen_version; int argsize; int rc; + + if (is_phys_contiguous((unsigned long)arg)) { + desc = xencomm_map_early(arg, sizeof(__u64)); + return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_xen_version), cmd, desc); + } switch (cmd) { case XENVER_version: @@ -118,18 +123,10 @@ int HYPERVISOR_xen_version_userspace(int } EXPORT_SYMBOL(HYPERVISOR_xen_version); -int HYPERVISOR_xen_version(int cmd, void *arg) -{ - if (is_kernel_addr((unsigned long)arg)) { - void *desc = xencomm_create_inline(arg); - return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_xen_version), cmd, desc); - } - return HYPERVISOR_xen_version_userspace(cmd, arg); -} int HYPERVISOR_physdev_op(int cmd, void *op) { - void *desc = xencomm_create_inline(op); + void *desc = xencomm_map(op, sizeof(physdev_op_t)); return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_physdev_op), cmd, desc); @@ -138,6 +135,7 @@ EXPORT_SYMBOL(HYPERVISOR_physdev_op); int HYPERVISOR_sched_op(int cmd, void *arg) { + int argsize = 0; struct xencomm_desc *desc; switch (cmd) { @@ -151,24 +149,30 @@ int HYPERVISOR_sched_op(int cmd, void *a evtchn_port_t *ports; struct sched_poll sched_poll; + argsize = sizeof(struct sched_poll); + memcpy(&sched_poll, arg, sizeof(sched_poll)); - ports = xencomm_create_inline( - xen_guest_handle(sched_poll.ports)); + ports = xencomm_map( +xen_guest_handle(sched_poll.ports), +(sizeof(evtchn_port_t) * sched_poll.nr_ports)); set_xen_guest_handle(sched_poll.ports, ports); memcpy(arg, &sched_poll, sizeof(sched_poll)); } break; case SCHEDOP_shutdown: + argsize = sizeof(struct sched_shutdown); + break; case SCHEDOP_remote_shutdown: + argsize = sizeof(struct sched_remote_shutdown); break; default: printk(KERN_ERR "%s: unknown sched op %d\n", __func__, cmd); return -ENOSYS; } - desc = xencomm_create_inline(arg); + desc = xencomm_map(arg, argsize); return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_sched_op), cmd, desc); diff -r ab3b5849331d -r 82e1886955c3 drivers/xen/core/xencomm.c --- a/drivers/xen/core/xencomm.c Sun Jan 21 08:36:53 2007 -0500 +++ b/drivers/xen/core/xencomm.c Mon Jan 22 14:47:15 2007 -0600 @@ -123,9 +123,89 @@ void *xencomm_create_inline(void *ptr) { unsigned long paddr; - BUG_ON(!is_