diff options
author | K. Y. Srinivasan <kys@microsoft.com> | 2016-07-01 19:26:35 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-08-31 07:05:41 -0400 |
commit | ccef9bcc02ee63ac171ea9f0d51e04b3e55b3a12 (patch) | |
tree | 90726ee1cfee006f7c79c459c61fc43892e3e732 /drivers/hv/ring_buffer.c | |
parent | 638fea33aee858cc665297a76f0039e95a28ce0c (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.c | 15 |
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 | ||
69 | static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi) | 69 | static 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. */ |
266 | int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, | 274 | int 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 | ||