[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2 of 2] xenpaging: handle GNTST_eagain in kernel drivers



I had a chance to get a environment up and running with the Kernel
tip, so I've ported these patches.  As a requisite, I had to create a
patch that implements MMAP_BATCH_V2 first.  I'll be posting the set to
the mailing list very shortly for comment.

I wanted to revive this thread so there was a bit of context.

Cheers,
-Adin

On Fri, Dec 2, 2011 at 11:50 AM, Konrad Rzeszutek Wilk
<konrad@xxxxxxxxxx> wrote:
> On Fri, Dec 02, 2011 at 07:27:20AM -0800, Andres Lagar-Cavilla wrote:
>> > On Thu, Dec 01, 2011 at 03:51:55PM -0500, Andres Lagar-Cavilla wrote:
>> >>  drivers/xen/blkback/blkback.c              |   6 ++-
>> >>  drivers/xen/blkback/interface.c            |   9 +++-
>> >>  drivers/xen/core/gnttab.c                  |   4 +-
>> >>  drivers/xen/gntdev/gntdev.c                |  49
>> >> +++++++++++++++++------------
>> >>  drivers/xen/netback/interface.c            |   5 +-
>> >>  drivers/xen/netback/netback.c              |  16 ++++++---
>> >>  drivers/xen/scsiback/interface.c           |  10 +++---
>> >>  drivers/xen/scsiback/scsiback.c            |   4 +-
>> >>  drivers/xen/tpmback/interface.c            |   7 +--
>> >>  drivers/xen/tpmback/tpmback.c              |  20 ++++-------
>> >>  drivers/xen/usbback/interface.c            |  16 ++++----
>> >>  drivers/xen/usbback/usbback.c              |   4 +-
>> >>  drivers/xen/xenbus/xenbus_backend_client.c |  10 +++---
>> >>  include/xen/gnttab.h                       |  37 ++++++++++++++++++++++
>> >>  14 files changed, 126 insertions(+), 71 deletions(-)
>> >>
>> >>
>> >> Handle GNTST_eagain status from GNTTABOP_map_grant_ref and
>> >> GNTTABOP_copy operations properly to allow usage of xenpaging without
>> >> causing crashes or data corruption.
>> >>
>> >> Replace all relevant HYPERVISOR_grant_table_op() calls with a retry
>> >> loop. This loop is implemented as a macro to allow different
>> >> GNTTABOP_* args. It will sleep up to 33 seconds and wait for the
>> >> page to be paged in again.
>> >>
>> >> All ->status checks were updated to use the GNTST_* namespace. All
>> >> return values are converted from GNTST_* namespace to 0/-EINVAL, since
>> >> all callers did not use the actual return value.
>> >
>> > Any plans to do this for the pvops tree?
>> Slowly but surely. Working with XCP presently, so pvops is not at the top
>> of my stack. Do you want to get at a specific merge window?
>
> Its more of a review concern. Meaning that if you send for the upstream
> kernel lots of folks are going to be looking at it. So the patches
> will change - which means that the version upstream can be very
> different from the one that you have for XCP - so in the end you will
> have to deal with two different code-bases to maintain.
>
> That can get a bit difficult to manage.
>
> Granted not all of those drivers are in the upstream kernel so might not
> make any difference.
>
>>
>> Andres
>> >
>> >>
>> >> Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
>> >> Acked-by: Patrick Colp <pjcolp@xxxxxxxxx>
>> >>
>> >> This is a port from xenlinux 2.6.18 to the 2.6.32 xcp tree
>> >> Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
>> >>
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/blkback/blkback.c
>> >> --- a/drivers/xen/blkback/blkback.c
>> >> +++ b/drivers/xen/blkback/blkback.c
>> >> @@ -701,11 +701,13 @@ static void dispatch_rw_block_io(blkif_t
>> >>    BUG_ON(ret);
>> >>
>> >>    for (i = 0; i < nseg; i++) {
>> >> -          if (unlikely(map[i].status != 0)) {
>> >> +          if (unlikely(map[i].status == GNTST_eagain))
>> >> +                 
>> >>  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &map[i]);
>> >> +          if (unlikely(map[i].status != GNTST_okay)) {
>> >>                    DPRINTK("grant map of dom %u gref %u failed: status 
>> >> %d\n",
>> >>                            blkif->domid, req->seg[i].gref, map[i].status);
>> >>                    map[i].handle = BLKBACK_INVALID_HANDLE;
>> >> -                  ret |= 1;
>> >> +                  ret = 1;
>> >>                    continue;
>> >>            }
>> >>
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/blkback/interface.c
>> >> --- a/drivers/xen/blkback/interface.c
>> >> +++ b/drivers/xen/blkback/interface.c
>> >> @@ -95,7 +95,7 @@ static int map_frontend_pages(blkif_t *b
>> >>    struct vm_struct *area = blkif->blk_ring_area;
>> >>    struct gnttab_map_grant_ref op[BLKIF_MAX_RING_PAGES];
>> >>    unsigned int i;
>> >> -  int status = 0;
>> >> +  int status = GNTST_okay;
>> >>
>> >>    for (i = 0; i < nr_shared_pages; i++) {
>> >>            unsigned long addr = (unsigned long)area->addr +
>> >> @@ -110,7 +110,10 @@ static int map_frontend_pages(blkif_t *b
>> >>            BUG();
>> >>
>> >>    for (i = 0; i < nr_shared_pages; i++) {
>> >> -          if ((status = op[i].status) != 0) {
>> >> +          if (op[i].status == GNTST_eagain)
>> >> +                 
>> >>  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &op[i]);
>> >> +          if (op[i].status != GNTST_okay) {
>> >> +                  status = op[i].status;
>> >>                    blkif->shmem_handle[i] = INVALID_GRANT_HANDLE;
>> >>                    continue;
>> >>            }
>> >> @@ -120,7 +123,7 @@ static int map_frontend_pages(blkif_t *b
>> >>
>> >>    blkif->nr_shared_pages = nr_shared_pages;
>> >>
>> >> -  if (status != 0) {
>> >> +  if (status != GNTST_okay) {
>> >>            DPRINTK(" Grant table operation failure !\n");
>> >>            unmap_frontend_pages(blkif);
>> >>    }
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/core/gnttab.c
>> >> --- a/drivers/xen/core/gnttab.c
>> >> +++ b/drivers/xen/core/gnttab.c
>> >> @@ -773,7 +773,7 @@ static int gnttab_map(unsigned int start
>> >>            return -ENOSYS;
>> >>    }
>> >>
>> >> -  BUG_ON(rc || setup.status);
>> >> +  BUG_ON(rc || (setup.status != GNTST_okay));
>> >>
>> >>    if (shared.raw == NULL)
>> >>            shared.raw = arch_gnttab_alloc_shared(gframes);
>> >> @@ -901,7 +901,7 @@ int gnttab_copy_grant_page(grant_ref_t r
>> >>    err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_and_replace,
>> >>                                    &unmap, 1);
>> >>    BUG_ON(err);
>> >> -  BUG_ON(unmap.status);
>> >> +  BUG_ON(unmap.status != GNTST_okay);
>> >>
>> >>    write_sequnlock_irq(&gnttab_dma_lock);
>> >>
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/gntdev/gntdev.c
>> >> --- a/drivers/xen/gntdev/gntdev.c
>> >> +++ b/drivers/xen/gntdev/gntdev.c
>> >> @@ -503,7 +503,7 @@ static int gntdev_mmap (struct file *fli
>> >>    uint64_t ptep;
>> >>    int ret;
>> >>    int flags;
>> >> -  int i;
>> >> +  int i, exit_ret;
>> >>    struct page *page;
>> >>    gntdev_file_private_data_t *private_data = flip->private_data;
>> >>
>> >> @@ -578,6 +578,7 @@ static int gntdev_mmap (struct file *fli
>> >>    vma->vm_mm->context.has_foreign_mappings = 1;
>> >>  #endif
>> >>
>> >> +  exit_ret = -ENOMEM;
>> >>    for (i = 0; i < size; ++i) {
>> >>
>> >>            flags = GNTMAP_host_map;
>> >> @@ -598,14 +599,18 @@ static int gntdev_mmap (struct file *fli
>> >>            ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
>> >>                                            &op, 1);
>> >>            BUG_ON(ret);
>> >> -          if (op.status) {
>> >> -                  printk(KERN_ERR "Error mapping the grant reference "
>> >> -                         "into the kernel (%d). domid = %d; ref = %d\n",
>> >> -                         op.status,
>> >> -                         private_data->grants[slot_index+i]
>> >> -                         .u.valid.domid,
>> >> -                         private_data->grants[slot_index+i]
>> >> -                         .u.valid.ref);
>> >> +          if (op.status != GNTST_okay) {
>> >> +                  if (op.status != GNTST_eagain)
>> >> +                          printk(KERN_ERR "Error mapping the grant 
>> >> reference "
>> >> +                                     "into the kernel (%d). domid = %d; 
>> >> ref = %d\n",
>> >> +                                     op.status,
>> >> +                                     private_data->grants[slot_index+i]
>> >> +                                     .u.valid.domid,
>> >> +                                     private_data->grants[slot_index+i]
>> >> +                                     .u.valid.ref);
>> >> +                  else
>> >> +                          /* Propagate instead of trying to fix it up */
>> >> +                          exit_ret = -EAGAIN;
>> >>                    goto undo_map_out;
>> >>            }
>> >>
>> >> @@ -674,14 +679,17 @@ static int gntdev_mmap (struct file *fli
>> >>                    ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
>> >>                                                    &op, 1);
>> >>                    BUG_ON(ret);
>> >> -                  if (op.status) {
>> >> +                  if (op.status != GNTST_okay) {
>> >>                            printk(KERN_ERR "Error mapping the grant "
>> >> -                                 "reference into user space (%d). domid "
>> >> -                                 "= %d; ref = %d\n", op.status,
>> >> -                                 private_data->grants[slot_index+i].u
>> >> -                                 .valid.domid,
>> >> -                                 private_data->grants[slot_index+i].u
>> >> -                                 .valid.ref);
>> >> +                                     "reference into user space (%d). 
>> >> domid "
>> >> +                                     "= %d; ref = %d\n", op.status,
>> >> +                                     private_data->grants[slot_index+i].u
>> >> +                                     .valid.domid,
>> >> +                                     private_data->grants[slot_index+i].u
>> >> +                                     .valid.ref);
>> >> +                          /* GNTST_eagain (i.e. page paged out) sohuld 
>> >> never happen
>> >> +                           * once we've mapped into kernel space */
>> >> +                          BUG_ON(op.status == GNTST_eagain);
>> >>                            goto undo_map_out;
>> >>                    }
>> >>
>> >> @@ -705,9 +713,10 @@ static int gntdev_mmap (struct file *fli
>> >>            }
>> >>
>> >>    }
>> >> +  exit_ret = 0;
>> >>
>> >>    up_write(&private_data->grants_sem);
>> >> -  return 0;
>> >> +  return exit_ret;
>> >>
>> >>  undo_map_out:
>> >>    /* If we have a mapping failure, the unmapping will be taken care of
>> >> @@ -725,7 +734,7 @@ undo_map_out:
>> >>
>> >>    up_write(&private_data->grants_sem);
>> >>
>> >> -  return -ENOMEM;
>> >> +  return exit_ret;
>> >>  }
>> >>
>> >>  static pte_t gntdev_clear_pte(struct vm_area_struct *vma, unsigned long
>> >> addr,
>> >> @@ -777,7 +786,7 @@ static pte_t gntdev_clear_pte(struct vm_
>> >>                    ret = HYPERVISOR_grant_table_op(
>> >>                            GNTTABOP_unmap_grant_ref, &op, 1);
>> >>                    BUG_ON(ret);
>> >> -                  if (op.status)
>> >> +                  if (op.status != GNTST_okay)
>> >>                            printk("User unmap grant status = %d\n",
>> >>                                   op.status);
>> >>            } else {
>> >> @@ -794,7 +803,7 @@ static pte_t gntdev_clear_pte(struct vm_
>> >>            ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
>> >>                                            &op, 1);
>> >>            BUG_ON(ret);
>> >> -          if (op.status)
>> >> +          if (op.status != GNTST_okay)
>> >>                    printk("Kernel unmap grant status = %d\n", op.status);
>> >>
>> >>
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/netback/interface.c
>> >> --- a/drivers/xen/netback/interface.c
>> >> +++ b/drivers/xen/netback/interface.c
>> >> @@ -381,10 +381,9 @@ static int map_frontend_pages(struct xen
>> >>    gnttab_set_map_op(&op, (unsigned long)comms->ring_area->addr,
>> >>                      GNTMAP_host_map, ring_ref, domid);
>> >>
>> >> -  if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> >> -          BUG();
>> >> +  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &op);
>> >>
>> >> -  if (op.status) {
>> >> +  if (op.status != GNTST_okay) {
>> >>            DPRINTK(" Gnttab failure mapping ring_ref!\n");
>> >>            free_vm_area(comms->ring_area);
>> >>            return op.status;
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/netback/netback.c
>> >> --- a/drivers/xen/netback/netback.c
>> >> +++ b/drivers/xen/netback/netback.c
>> >> @@ -419,11 +419,13 @@ static int netbk_check_gop(int nr_copy_s
>> >>
>> >>    for (i = 0; i < nr_copy_slots; i++) {
>> >>            copy_op = npo->copy + npo->copy_cons++;
>> >> +          if (copy_op->status == GNTST_eagain)
>> >> +                  gnttab_check_GNTST_eagain_while(GNTTABOP_copy, 
>> >> copy_op);
>> >>            if (copy_op->status != GNTST_okay) {
>> >> -                          DPRINTK("Bad status %d from copy to DOM%d.\n",
>> >> -                                  copy_op->status, domid);
>> >> -                          status = NETIF_RSP_ERROR;
>> >> -                  }
>> >> +                  DPRINTK("Bad status %d from copy to DOM%d.\n",
>> >> +                          copy_op->status, domid);
>> >> +                  status = NETIF_RSP_ERROR;
>> >> +          }
>> >>    }
>> >>
>> >>    return status;
>> >> @@ -1020,7 +1022,11 @@ static int netbk_tx_check_mop(struct xen
>> >>
>> >>    /* Check status of header. */
>> >>    err = mop->status;
>> >> -  if (unlikely(err)) {
>> >> +  if (err == GNTST_eagain) {
>> >> +          gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, 
>> >> mop);
>> >> +          err = mop->status;
>> >> +  }
>> >> +  if (unlikely(err != GNTST_okay)) {
>> >>            pending_ring_idx_t index;
>> >>            index = pending_index(netbk->pending_prod++);
>> >>            txp = &pending_tx_info[pending_idx].req;
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/scsiback/interface.c
>> >> --- a/drivers/xen/scsiback/interface.c
>> >> +++ b/drivers/xen/scsiback/interface.c
>> >> @@ -69,18 +69,18 @@ static int map_frontend_page( struct vsc
>> >>                            GNTMAP_host_map, ring_ref,
>> >>                            info->domid);
>> >>
>> >> -  err = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
>> >> -  BUG_ON(err);
>> >> +  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &op);
>> >>
>> >> -  if (op.status) {
>> >> -          printk(KERN_ERR "scsiback: Grant table operation failure !\n");
>> >> +  if (op.status != GNTST_okay) {
>> >> +          printk(KERN_ERR "scsiback: Grant table operation failure 
>> >> %d!\n",
>> >> +                                                  (int) op.status);
>> >>            return op.status;
>> >>    }
>> >>
>> >>    info->shmem_ref    = ring_ref;
>> >>    info->shmem_handle = op.handle;
>> >>
>> >> -  return (GNTST_okay);
>> >> +  return 0;
>> >>  }
>> >>
>> >>  static void unmap_frontend_page(struct vscsibk_info *info)
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/scsiback/scsiback.c
>> >> --- a/drivers/xen/scsiback/scsiback.c
>> >> +++ b/drivers/xen/scsiback/scsiback.c
>> >> @@ -287,7 +287,9 @@ static int scsiback_gnttab_data_map(vscs
>> >>            for_each_sg (pending_req->sgl, sg, nr_segments, i) {
>> >>                    struct page *pg;
>> >>
>> >> -                  if (unlikely(map[i].status != 0)) {
>> >> +                  if (unlikely(map[i].status == GNTST_eagain))
>> >> +                         
>> >>  gnttab_check_GNTST_eagain_while(GNTTABOP_map_grant_ref, &map[i]);
>> >> +                  if (unlikely(map[i].status != GNTST_okay)) {
>> >>                            printk(KERN_ERR "scsiback: invalid buffer -- 
>> >> could not remap
>> >> it\n");
>> >>                            map[i].handle = SCSIBACK_INVALID_HANDLE;
>> >>                            err |= 1;
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/tpmback/interface.c
>> >> --- a/drivers/xen/tpmback/interface.c
>> >> +++ b/drivers/xen/tpmback/interface.c
>> >> @@ -86,11 +86,10 @@ static int map_frontend_page(tpmif_t *tp
>> >>    gnttab_set_map_op(&op, (unsigned long)tpmif->tx_area->addr,
>> >>                      GNTMAP_host_map, shared_page, tpmif->domid);
>> >>
>> >> -  if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> >> -          BUG();
>> >> +  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &op);
>> >>
>> >> -  if (op.status) {
>> >> -          DPRINTK(" Grant table operation failure !\n");
>> >> +  if (op.status != GNTST_okay) {
>> >> +          DPRINTK(" Grant table operation failure %d!\n", (int) 
>> >> op.status);
>> >>            return op.status;
>> >>    }
>> >>
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/tpmback/tpmback.c
>> >> --- a/drivers/xen/tpmback/tpmback.c
>> >> +++ b/drivers/xen/tpmback/tpmback.c
>> >> @@ -256,15 +256,13 @@ int _packet_write(struct packet *pak,
>> >>            gnttab_set_map_op(&map_op, idx_to_kaddr(tpmif, i),
>> >>                              GNTMAP_host_map, tx->ref, tpmif->domid);
>> >>
>> >> -          if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
>> >> -                                                 &map_op, 1))) {
>> >> -                  BUG();
>> >> -          }
>> >> +          gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, 
>> >> &map_op);
>> >>
>> >>            handle = map_op.handle;
>> >>
>> >> -          if (map_op.status) {
>> >> -                  DPRINTK(" Grant table operation failure !\n");
>> >> +          if (map_op.status != GNTST_okay) {
>> >> +                  DPRINTK(" Grant table operation failure %d!\n",
>> >> +                                          (int) map_op.status);
>> >>                    return 0;
>> >>            }
>> >>
>> >> @@ -394,13 +392,11 @@ static int packet_read_shmem(struct pack
>> >>            gnttab_set_map_op(&map_op, idx_to_kaddr(tpmif, i),
>> >>                              GNTMAP_host_map, tx->ref, tpmif->domid);
>> >>
>> >> -          if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
>> >> -                                                 &map_op, 1))) {
>> >> -                  BUG();
>> >> -          }
>> >> +          gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, 
>> >> &map_op);
>> >>
>> >> -          if (map_op.status) {
>> >> -                  DPRINTK(" Grant table operation failure !\n");
>> >> +          if (map_op.status != GNTST_okay) {
>> >> +                  DPRINTK(" Grant table operation failure %d!\n",
>> >> +                                          (int) map_op.status);
>> >>                    return -EFAULT;
>> >>            }
>> >>
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/usbback/interface.c
>> >> --- a/drivers/xen/usbback/interface.c
>> >> +++ b/drivers/xen/usbback/interface.c
>> >> @@ -109,11 +109,11 @@ static int map_frontend_pages(usbif_t *u
>> >>    gnttab_set_map_op(&op, (unsigned long)usbif->urb_ring_area->addr,
>> >>                      GNTMAP_host_map, urb_ring_ref, usbif->domid);
>> >>
>> >> -  if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> >> -          BUG();
>> >> +  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &op);
>> >>
>> >> -  if (op.status) {
>> >> -          printk(KERN_ERR "grant table failure mapping urb_ring_ref\n");
>> >> +  if (op.status != GNTST_okay) {
>> >> +          printk(KERN_ERR "grant table failure mapping urb_ring_ref 
>> >> %d\n",
>> >> +                                                  (int) op.status);
>> >>            return op.status;
>> >>    }
>> >>
>> >> @@ -123,17 +123,17 @@ static int map_frontend_pages(usbif_t *u
>> >>    gnttab_set_map_op(&op, (unsigned long)usbif->conn_ring_area->addr,
>> >>                      GNTMAP_host_map, conn_ring_ref, usbif->domid);
>> >>
>> >> -  if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> >> -          BUG();
>> >> +  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &op);
>> >>
>> >> -  if (op.status) {
>> >> +  if (op.status != GNTST_okay) {
>> >>            struct gnttab_unmap_grant_ref unop;
>> >>            gnttab_set_unmap_op(&unop,
>> >>                            (unsigned long) usbif->urb_ring_area->addr,
>> >>                            GNTMAP_host_map, usbif->urb_shmem_handle);
>> >>            VOID(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &unop,
>> >>                            1));
>> >> -          printk(KERN_ERR "grant table failure mapping conn_ring_ref\n");
>> >> +          printk(KERN_ERR "grant table failure mapping conn_ring_ref 
>> >> %d\n",
>> >> +                                                  (int) op.status);
>> >>            return op.status;
>> >>    }
>> >>
>> >> diff -r df9e25a0189b -r 1170bc32db41 drivers/xen/usbback/usbback.c
>> >> --- a/drivers/xen/usbback/usbback.c
>> >> +++ b/drivers/xen/usbback/usbback.c
>> >> @@ -428,7 +428,9 @@ static int usbbk_gnttab_map(usbif_t *usb
>> >>            BUG_ON(ret);
>> >>
>> >>            for (i = 0; i < nr_segs; i++) {
>> >> -                  if (unlikely(map[i].status != 0)) {
>> >> +                  if (unlikely(map[i].status == GNTST_eagain))
>> >> +                         
>> >>  gnttab_check_GNTST_eagain_while(GNTTABOP_map_grant_ref, &map[i]);
>> >> +                  if (unlikely(map[i].status != GNTST_okay)) {
>> >>                            printk(KERN_ERR "usbback: invalid buffer -- 
>> >> could not remap it\n");
>> >>                            map[i].handle = USBBACK_INVALID_HANDLE;
>> >>                            ret |= 1;
>> >> diff -r df9e25a0189b -r 1170bc32db41
>> >> drivers/xen/xenbus/xenbus_backend_client.c
>> >> --- a/drivers/xen/xenbus/xenbus_backend_client.c
>> >> +++ b/drivers/xen/xenbus/xenbus_backend_client.c
>> >> @@ -48,8 +48,7 @@ struct vm_struct *xenbus_map_ring_valloc
>> >>    gnttab_set_map_op(&op, (unsigned long)area->addr, GNTMAP_host_map,
>> >>                      gnt_ref, dev->otherend_id);
>> >>
>> >> -  if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> >> -          BUG();
>> >> +  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &op);
>> >>
>> >>    if (op.status != GNTST_okay) {
>> >>            free_vm_area(area);
>> >> @@ -75,15 +74,16 @@ int xenbus_map_ring(struct xenbus_device
>> >>
>> >>    gnttab_set_map_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
>> >>                      gnt_ref, dev->otherend_id);
>> >> -  if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> >> -          BUG();
>> >> +  gnttab_check_GNTST_eagain_do_while(GNTTABOP_map_grant_ref, &op);
>> >>
>> >>    if (op.status != GNTST_okay) {
>> >>            xenbus_dev_fatal(dev, op.status,
>> >>                             "mapping in shared page %d from domain %d",
>> >>                             gnt_ref, dev->otherend_id);
>> >> -  } else
>> >> +  } else {
>> >>            *handle = op.handle;
>> >> +          return 0;
>> >> +  }
>> >>
>> >>    return op.status;
>> >>  }
>> >> diff -r df9e25a0189b -r 1170bc32db41 include/xen/gnttab.h
>> >> --- a/include/xen/gnttab.h
>> >> +++ b/include/xen/gnttab.h
>> >> @@ -187,4 +187,41 @@ gnttab_set_replace_op(struct gnttab_unma
>> >>    unmap->handle = handle;
>> >>  }
>> >>
>> >> +#define gnttab_check_GNTST_eagain_while(__HCop, __HCarg_p)               
>> >>                          \
>> >> +do {                                                                     
>> >>                                                                          \
>> >> +  u8 __hc_delay = 1;                                                     
>> >>                                                          \
>> >> +  int __ret;                                                             
>> >>                                                                  \
>> >> +  while (unlikely((__HCarg_p)->status == GNTST_eagain && __hc_delay))
>> >> {  \
>> >> +          msleep(__hc_delay++);                                         
>> >>                                                   \
>> >> +          __ret = HYPERVISOR_grant_table_op(__HCop, (__HCarg_p), 1);     
>> >>                  \
>> >> +          BUG_ON(__ret);                                                 
>> >>                                                          \
>> >> +  }                                                                     
>> >>                                                                           
>> >> \
>> >> +  if (__hc_delay == 0) {                                                 
>> >>                                                  \
>> >> +          printk(KERN_ERR "%s: %s gnt busy\n", __func__, current->comm); 
>> >>          \
>> >> +          (__HCarg_p)->status = GNTST_bad_page;                         
>> >>                                   \
>> >> +  }                                                                     
>> >>                                                                           
>> >> \
>> >> +  if ((__HCarg_p)->status != GNTST_okay)                                 
>> >>                                  \
>> >> +          printk(KERN_ERR "%s: %s gnt status %x\n",                     
>> >>                                   \
>> >> +                  __func__, current->comm, (__HCarg_p)->status);         
>> >>                          \
>> >> +} while(0)
>> >> +
>> >> +#define gnttab_check_GNTST_eagain_do_while(__HCop, __HCarg_p)           
>> >>           \
>> >> +do {                                                                     
>> >>                                                                  \
>> >> +  u8 __hc_delay = 1;                                                     
>> >>                                                  \
>> >> +  int __ret;                                                             
>> >>                                                          \
>> >> +  do {                                                                   
>> >>                                                          \
>> >> +          __ret = HYPERVISOR_grant_table_op(__HCop, (__HCarg_p), 1);     
>> >>          \
>> >> +          BUG_ON(__ret);                                                 
>> >>                                                  \
>> >> +          if ((__HCarg_p)->status == GNTST_eagain)                       
>> >>                          \
>> >> +                  msleep(__hc_delay++);                                 
>> >>                                           \
>> >> +  } while ((__HCarg_p)->status == GNTST_eagain && __hc_delay);           
>> >>  \
>> >> +  if (__hc_delay == 0) {                                                 
>> >>                                          \
>> >> +          printk(KERN_ERR "%s: %s gnt busy\n", __func__, current->comm); 
>> >>  \
>> >> +          (__HCarg_p)->status = GNTST_bad_page;                         
>> >>                           \
>> >> +  }                                                                     
>> >>                                                                   \
>> >> +  if ((__HCarg_p)->status != GNTST_okay)                                 
>> >>                          \
>> >> +          printk(KERN_ERR "%s: %s gnt status %x\n",                     
>> >>                           \
>> >> +                  __func__, current->comm, (__HCarg_p)->status);         
>> >>                  \
>> >> +} while(0)
>> >> +
>> >>  #endif /* __ASM_GNTTAB_H__ */
>> >>
>> >> _______________________________________________
>> >> Xen-devel mailing list
>> >> Xen-devel@xxxxxxxxxxxxxxxxxxx
>> >> http://lists.xensource.com/xen-devel
>> >
>>
>>
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@xxxxxxxxxxxxxxxxxxx
>> http://lists.xensource.com/xen-devel
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.