Staging: hv: Introduce a function to wait to drain outgoing I/O
Rather than busy loop waiting to drain I/O, introduce a function
that does not burn CPU cycles waiting.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
diff --git a/drivers/staging/hv/storvsc_api.h b/drivers/staging/hv/storvsc_api.h
index 32228c0..1887940 100644
--- a/drivers/staging/hv/storvsc_api.h
+++ b/drivers/staging/hv/storvsc_api.h
@@ -26,6 +26,7 @@
#define _STORVSC_API_H_
#include <linux/kernel.h>
+#include <linux/wait.h>
#include "vstorage.h"
#include "vmbus_api.h"
#include "vmbus.h"
@@ -108,8 +109,11 @@
/* 0 indicates the device is being destroyed */
atomic_t ref_count;
+ bool drain_notify;
atomic_t num_outstanding_req;
+ wait_queue_head_t waiting_to_drain;
+
/*
* Each unique Port/Path/Target represents 1 channel ie scsi
* controller. In reality, the pathid, targetid is always 0
@@ -161,6 +165,14 @@
return hvdr_to_stordr(hvdrv);
}
+static inline void storvsc_wait_to_drain(struct storvsc_device *dev)
+{
+ dev->drain_notify = true;
+ wait_event(dev->waiting_to_drain,
+ atomic_read(&dev->num_outstanding_req) == 0);
+ dev->drain_notify = false;
+}
+
/* Interface */
int storvsc_dev_add(struct hv_device *device,