diff options
author | Haiyang Zhang <haiyangz@microsoft.com> | 2012-03-27 09:20:45 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-03 17:47:15 -0400 |
commit | 33be96e47cc27f2f1a753a0707b02a73df8c8d46 (patch) | |
tree | 2b0361f4d39a14e2ddd0d23e66656e6174b3cb71 /drivers/hv | |
parent | ede7193d4fdca98178240500d8684dbc139ca26f (diff) |
net/hyperv: Add flow control based on hi/low watermark
In the existing code, we only stop queue when the ringbuffer is full,
so the current packet has to be dropped or retried from upper layer.
This patch stops the tx queue when available ringbuffer is below
the low watermark. So the ringbuffer still has small amount of space
available for the current packet. This will reduce the overhead of
retries on sending.
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/hv')
-rw-r--r-- | drivers/hv/ring_buffer.c | 31 |
1 files changed, 0 insertions, 31 deletions
diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 8af25a097d75..7233c88f01b8 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c | |||
@@ -30,37 +30,6 @@ | |||
30 | #include "hyperv_vmbus.h" | 30 | #include "hyperv_vmbus.h" |
31 | 31 | ||
32 | 32 | ||
33 | /* #defines */ | ||
34 | |||
35 | |||
36 | /* Amount of space to write to */ | ||
37 | #define BYTES_AVAIL_TO_WRITE(r, w, z) \ | ||
38 | ((w) >= (r)) ? ((z) - ((w) - (r))) : ((r) - (w)) | ||
39 | |||
40 | |||
41 | /* | ||
42 | * | ||
43 | * hv_get_ringbuffer_availbytes() | ||
44 | * | ||
45 | * Get number of bytes available to read and to write to | ||
46 | * for the specified ring buffer | ||
47 | */ | ||
48 | static inline void | ||
49 | hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi, | ||
50 | u32 *read, u32 *write) | ||
51 | { | ||
52 | u32 read_loc, write_loc; | ||
53 | |||
54 | smp_read_barrier_depends(); | ||
55 | |||
56 | /* Capture the read/write indices before they changed */ | ||
57 | read_loc = rbi->ring_buffer->read_index; | ||
58 | write_loc = rbi->ring_buffer->write_index; | ||
59 | |||
60 | *write = BYTES_AVAIL_TO_WRITE(read_loc, write_loc, rbi->ring_datasize); | ||
61 | *read = rbi->ring_datasize - *write; | ||
62 | } | ||
63 | |||
64 | /* | 33 | /* |
65 | * hv_get_next_write_location() | 34 | * hv_get_next_write_location() |
66 | * | 35 | * |