aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv/ring_buffer.c
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2016-07-01 19:26:35 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-08-31 07:05:41 -0400
commitccef9bcc02ee63ac171ea9f0d51e04b3e55b3a12 (patch)
tree90726ee1cfee006f7c79c459c61fc43892e3e732 /drivers/hv/ring_buffer.c
parent638fea33aee858cc665297a76f0039e95a28ce0c (diff)
Drivers: hv: vmbus: Enable explicit signaling policy for NIC channels
For synthetic NIC channels, enable explicit signaling policy as netvsc wants to explicitly control when the host is to be signaled. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv/ring_buffer.c')
-rw-r--r--drivers/hv/ring_buffer.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c
index fe586bf74e17..e3edcaee7ab3 100644
--- a/drivers/hv/ring_buffer.c
+++ b/drivers/hv/ring_buffer.c
@@ -66,12 +66,20 @@ u32 hv_end_read(struct hv_ring_buffer_info *rbi)
66 * arrived. 66 * arrived.
67 */ 67 */
68 68
69static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi) 69static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi,
70 enum hv_signal_policy policy)
70{ 71{
71 virt_mb(); 72 virt_mb();
72 if (READ_ONCE(rbi->ring_buffer->interrupt_mask)) 73 if (READ_ONCE(rbi->ring_buffer->interrupt_mask))
73 return false; 74 return false;
74 75
76 /*
77 * When the client wants to control signaling,
78 * we only honour the host interrupt mask.
79 */
80 if (policy == HV_SIGNAL_POLICY_EXPLICIT)
81 return true;
82
75 /* check interrupt_mask before read_index */ 83 /* check interrupt_mask before read_index */
76 virt_rmb(); 84 virt_rmb();
77 /* 85 /*
@@ -264,7 +272,8 @@ void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info)
264 272
265/* Write to the ring buffer. */ 273/* Write to the ring buffer. */
266int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, 274int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
267 struct kvec *kv_list, u32 kv_count, bool *signal, bool lock) 275 struct kvec *kv_list, u32 kv_count, bool *signal, bool lock,
276 enum hv_signal_policy policy)
268{ 277{
269 int i = 0; 278 int i = 0;
270 u32 bytes_avail_towrite; 279 u32 bytes_avail_towrite;
@@ -326,7 +335,7 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
326 if (lock) 335 if (lock)
327 spin_unlock_irqrestore(&outring_info->ring_lock, flags); 336 spin_unlock_irqrestore(&outring_info->ring_lock, flags);
328 337
329 *signal = hv_need_to_signal(old_write, outring_info); 338 *signal = hv_need_to_signal(old_write, outring_info, policy);
330 return 0; 339 return 0;
331} 340}
332 341