aboutsummaryrefslogtreecommitdiff
path: root/lib/libvirtio
diff options
context:
space:
mode:
authorNikunj A Dadhania <nikunj@linux.vnet.ibm.com>2013-11-18 07:07:47 +0530
committerNikunj A Dadhania <nikunj@linux.vnet.ibm.com>2013-11-18 07:07:47 +0530
commitbca47dc291790ad91208c132d97ab383b562ba06 (patch)
tree0a3fd4284db253cee39424498e7ff96d8e68753a /lib/libvirtio
parent10bf23ea7ce5ffea7e296910458907d4d686677b (diff)
downloadSLOF-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>
Diffstat (limited to 'lib/libvirtio')
-rw-r--r--lib/libvirtio/virtio-blk.c11
-rw-r--r--lib/libvirtio/virtio-scsi.c19
-rw-r--r--lib/libvirtio/virtio.h2
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) */