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

2007-02-07 Thread Jimi Xenidis

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

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;
 	

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

2007-01-24 Thread Jimi Xenidis


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

2007-01-23 Thread Jerone Young
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_