diff options
author | Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> | 2013-11-18 07:07:47 +0530 |
---|---|---|
committer | Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> | 2013-11-18 07:07:47 +0530 |
commit | bca47dc291790ad91208c132d97ab383b562ba06 (patch) | |
tree | 0a3fd4284db253cee39424498e7ff96d8e68753a | |
parent | 10bf23ea7ce5ffea7e296910458907d4d686677b (diff) | |
download | SLOF-bca47dc291790ad91208c132d97ab383b562ba06.zip SLOF-bca47dc291790ad91208c132d97ab383b562ba06.tar.gz SLOF-bca47dc291790ad91208c132d97ab383b562ba06.tar.bz2 |
virtio: timeout after 5sec
Remove adhoc timer and put 5sec timeout. On a busy host, code hits this.
Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
-rw-r--r-- | lib/libvirtio/virtio-blk.c | 11 | ||||
-rw-r--r-- | lib/libvirtio/virtio-scsi.c | 19 | ||||
-rw-r--r-- | lib/libvirtio/virtio.h | 2 |
3 files changed, 20 insertions, 12 deletions
diff --git a/lib/libvirtio/virtio-blk.c b/lib/libvirtio/virtio-blk.c index 6f21404..544068f 100644 --- a/lib/libvirtio/virtio-blk.c +++ b/lib/libvirtio/virtio-blk.c @@ -12,6 +12,7 @@ #include <stdio.h> #include <cpu.h> +#include <helpers.h> #include "virtio.h" #include "virtio-blk.h" @@ -78,11 +79,11 @@ int virtioblk_read(struct virtio_device *dev, char *buf, long blocknum, long cnt) { struct vring_desc *desc; - int id, i; + int id; static struct virtio_blk_req blkhdr; //struct virtio_blk_config *blkconf; uint64_t capacity; - uint32_t vq_size; + uint32_t vq_size, time; struct vring_desc *vq_desc; /* Descriptor vring */ struct vring_avail *vq_avail; /* "Available" vring */ struct vring_used *vq_used; /* "Used" vring */ @@ -145,10 +146,12 @@ virtioblk_read(struct virtio_device *dev, char *buf, long blocknum, long cnt) virtio_queue_notify(dev, 0); /* Wait for host to consume the descriptor */ - i = 10000000; - while (*current_used_idx == last_used_idx && i-- > 0) { + time = SLOF_GetTimer() + VIRTIO_TIMEOUT; + while (*current_used_idx == last_used_idx) { // do something better mb(); + if (time < SLOF_GetTimer()) + break; } if (status == 0) diff --git a/lib/libvirtio/virtio-scsi.c b/lib/libvirtio/virtio-scsi.c index 53e869a..4828928 100644 --- a/lib/libvirtio/virtio-scsi.c +++ b/lib/libvirtio/virtio-scsi.c @@ -13,6 +13,7 @@ #include <stdio.h> #include <string.h> #include <cpu.h> +#include <helpers.h> #include "virtio.h" #include "virtio-scsi.h" @@ -28,8 +29,8 @@ int virtioscsi_send(struct virtio_device *dev, volatile uint16_t *current_used_idx; uint16_t last_used_idx; - int id, i; - uint32_t vq_size; + int id; + uint32_t vq_size, time; int vq = VIRTIO_SCSI_REQUEST_VQ; @@ -74,12 +75,14 @@ int virtioscsi_send(struct virtio_device *dev, /* Tell HV that the vq is ready */ virtio_queue_notify(dev, vq); - /* Wait for host to consume the descriptor */ - i = 10000000; - while (*current_used_idx == last_used_idx && i-- > 0) { - // do something better - mb(); - } + /* Wait for host to consume the descriptor */ + time = SLOF_GetTimer() + VIRTIO_TIMEOUT; + while (*current_used_idx == last_used_idx) { + // do something better + mb(); + if (time < SLOF_GetTimer()) + break; + } return 0; } diff --git a/lib/libvirtio/virtio.h b/lib/libvirtio/virtio.h index bb86d8d..b351930 100644 --- a/lib/libvirtio/virtio.h +++ b/lib/libvirtio/virtio.h @@ -21,6 +21,8 @@ #define VIRTIO_STAT_DRIVER_OK 4 #define VIRTIO_STAT_FAILED 128 +#define VIRTIO_TIMEOUT 5000 /* 5 sec timeout */ + /* Definitions for vring_desc.flags */ #define VRING_DESC_F_NEXT 1 /* buffer continues via the next field */ #define VRING_DESC_F_WRITE 2 /* buffer is write-only (otherwise read-only) */ |