--- /dev/null
+diff --git a/drivers/xen/v2v/v2vdev.c b/drivers/xen/v2v/v2vdev.c
+index 9a42523..ee50652 100644
+--- a/drivers/xen/v2v/v2vdev.c
++++ b/drivers/xen/v2v/v2vdev.c
+@@ -55,6 +55,7 @@
+
+ #define V2VLISTEN(len) _IOC(_IOC_WRITE, 'V', 0x01, len)
+ #define V2VCONNECT(len) _IOC(_IOC_WRITE, 'V', 0x02, len)
++#define V2VRING(len) _IOC(_IOC_WRITE, 'V', 0x03, len)
+
+ #define L_READ 0
+ #define L_WRITE 1
+@@ -95,10 +96,13 @@ struct v2vdev
+ int recv_blocked;
+ int send_blocked;
+
++ unsigned prod_ring_page_order;
++ unsigned cons_ring_page_order;
+ };
+
+ /* Utils */
+
++#if 0 /* not used right now */
+ static void
+ hexdump (char *prefix, void *_d, int len)
+ {
+@@ -144,6 +148,7 @@ hexdump (char *prefix, void *_d, int len)
+ printk ("\n");
+ }
+ }
++#endif
+
+ /* buffer */
+
+@@ -672,7 +677,11 @@ v2vdev_listen (struct file *f, const char __user * user_path, size_t size)
+
+ path[size] = 0;
+
+- err = v2v_listen (path, &c->channel, 0, 0, 0);
++ err = v2v_listen (path,
++ &c->channel,
++ c->prod_ring_page_order,
++ c->cons_ring_page_order,
++ 0);
+ if (err)
+ return err;
+
+@@ -723,6 +732,23 @@ v2vdev_connect (struct file *f, const char __user * user_path, size_t size)
+ return 0;
+ }
+
++static int
++v2vdev_rings (struct file *f, const char __user * ring_sizes, size_t size)
++{
++ struct v2vdev *c = f->private_data;
++ unsigned *p;
++
++ if (size < 2*sizeof(unsigned))
++ return -EINVAL;
++
++ p = (unsigned*)ring_sizes;
++
++ c->prod_ring_page_order = p[0];
++ c->cons_ring_page_order = p[1];
++
++ return 0;
++}
++
+
+ static long
+ v2vdev_ioctl (struct file *f, unsigned int cmd, unsigned long arg)
+@@ -747,6 +773,9 @@ v2vdev_ioctl (struct file *f, unsigned int cmd, unsigned long arg)
+ case _IOC_NR (V2VCONNECT (0)):
+ rc = v2vdev_connect (f, p, len);
+ break;
++ case _IOC_NR (V2VRING (0)):
++ rc = v2vdev_rings (f, p, len);
++ break;
+ }
+ return rc;
+ }