Re: [XenPPC] [PATCH] [RESEND] Xencomm patch

2007-02-05 Thread Jimi Xenidis


On Feb 2, 2007, at 7:10 PM, Jerone Young wrote:

Sorry guys. Please ignore this patch. I found a bug with it. Will  
submit

a fixed version shortly.


Ok, took a peek though and it seems that not all xencomm_map*() calls  
have there return values checked.
Using ENOSPC for the errno for xencomm_map_no_alloc() seems  
inappropriate, since it ENOSPC is really about devices.  ENOMEM is  
not right because we are not trying to allocate. I do not think  
anything fits perfectly, but I'd go with EINVAL because argsize is  
simply to big and an invalid argument.

Thoughts?

-JX


___
Xen-ppc-devel mailing list
Xen-ppc-devel@lists.xensource.com
http://lists.xensource.com/xen-ppc-devel


[XenPPC] [PATCH] [UPDATE] Xencomm patch

2007-02-05 Thread Jerone Young
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;