{
        int i;
        int pagecount;
-       unsigned long long pfn;
        struct vmbus_channel_gpadl_header *gpadl_header;
        struct vmbus_channel_gpadl_body *gpadl_body;
        struct vmbus_channel_msginfo *msgheader;
        int pfnsum, pfncount, pfnleft, pfncurr, pfnsize;
 
        pagecount = size >> PAGE_SHIFT;
-       pfn = virt_to_phys(kbuffer) >> PAGE_SHIFT;
 
        /* do we need a gpadl body msg */
        pfnsize = MAX_SIZE_CHANNEL_MESSAGE -
                gpadl_header->range[0].byte_offset = 0;
                gpadl_header->range[0].byte_count = size;
                for (i = 0; i < pfncount; i++)
-                       gpadl_header->range[0].pfn_array[i] = pfn+i;
+                       gpadl_header->range[0].pfn_array[i] = slow_virt_to_phys(
+                               kbuffer + PAGE_SIZE * i) >> PAGE_SHIFT;
                *msginfo = msgheader;
                *messagecount = 1;
 
                         * so the hypervisor gurantees that this is ok.
                         */
                        for (i = 0; i < pfncurr; i++)
-                               gpadl_body->pfn[i] = pfn + pfnsum + i;
+                               gpadl_body->pfn[i] = slow_virt_to_phys(
+                                       kbuffer + PAGE_SIZE * (pfnsum + i)) >>
+                                       PAGE_SHIFT;
 
                        /* add to msg header */
                        list_add_tail(&msgbody->msglistentry,
                gpadl_header->range[0].byte_offset = 0;
                gpadl_header->range[0].byte_count = size;
                for (i = 0; i < pagecount; i++)
-                       gpadl_header->range[0].pfn_array[i] = pfn+i;
+                       gpadl_header->range[0].pfn_array[i] = slow_virt_to_phys(
+                               kbuffer + PAGE_SIZE * i) >> PAGE_SHIFT;
 
                *msginfo = msgheader;
                *messagecount = 1;
  * vmbus_establish_gpadl - Estabish a GPADL for the specified buffer
  *
  * @channel: a channel
- * @kbuffer: from kmalloc
+ * @kbuffer: from kmalloc or vmalloc
  * @size: page-size multiple
  * @gpadl_handle: some funky thing
  */
 
 
        if (net_device->recv_buf) {
                /* Free up the receive buffer */
-               free_pages((unsigned long)net_device->recv_buf,
-                       get_order(net_device->recv_buf_size));
+               vfree(net_device->recv_buf);
                net_device->recv_buf = NULL;
        }
 
                return -ENODEV;
        ndev = net_device->ndev;
 
-       net_device->recv_buf =
-               (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
-                               get_order(net_device->recv_buf_size));
+       net_device->recv_buf = vzalloc(net_device->recv_buf_size);
        if (!net_device->recv_buf) {
                netdev_err(ndev, "unable to allocate receive "
                        "buffer of size %d\n", net_device->recv_buf_size);