summaryrefslogtreecommitdiffstats
path: root/include/linux/hyperv.h
diff options
context:
space:
mode:
authorMichael Kelley <mikelley@microsoft.com>2018-06-05 16:37:51 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-07-03 07:02:28 -0400
commit71b38245acb05a38d2d861792bdd99cd9f6a0f78 (patch)
treea1e2cbc6aa01eba596d3a341fbabc11781de8572 /include/linux/hyperv.h
parente9a7fda29a5620d9ac2a750d8e35f5d270096321 (diff)
Drivers: hv: vmbus: Add comments on ring buffer signaling
Add comments describing intricacies of Hyper-V ring buffer signaling code. This information is not in Hyper-V public documents, so include here to capture the knowledge for future coders. There are no code changes in this commit. Signed-off-by: Michael Kelley <mikelley@microsoft.com> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/hyperv.h')
-rw-r--r--include/linux/hyperv.h31
1 files changed, 23 insertions, 8 deletions
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index 3a3012f57be4..2330f08062c7 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -89,18 +89,33 @@ struct hv_ring_buffer {
89 u32 interrupt_mask; 89 u32 interrupt_mask;
90 90
91 /* 91 /*
92 * Win8 uses some of the reserved bits to implement 92 * WS2012/Win8 and later versions of Hyper-V implement interrupt
93 * interrupt driven flow management. On the send side 93 * driven flow management. The feature bit feat_pending_send_sz
94 * we can request that the receiver interrupt the sender 94 * is set by the host on the host->guest ring buffer, and by the
95 * when the ring transitions from being full to being able 95 * guest on the guest->host ring buffer.
96 * to handle a message of size "pending_send_sz".
97 * 96 *
98 * Add necessary state for this enhancement. 97 * The meaning of the feature bit is a bit complex in that it has
98 * semantics that apply to both ring buffers. If the guest sets
99 * the feature bit in the guest->host ring buffer, the guest is
100 * telling the host that:
101 * 1) It will set the pending_send_sz field in the guest->host ring
102 * buffer when it is waiting for space to become available, and
103 * 2) It will read the pending_send_sz field in the host->guest
104 * ring buffer and interrupt the host when it frees enough space
105 *
106 * Similarly, if the host sets the feature bit in the host->guest
107 * ring buffer, the host is telling the guest that:
108 * 1) It will set the pending_send_sz field in the host->guest ring
109 * buffer when it is waiting for space to become available, and
110 * 2) It will read the pending_send_sz field in the guest->host
111 * ring buffer and interrupt the guest when it frees enough space
112 *
113 * If either the guest or host does not set the feature bit that it
114 * owns, that guest or host must do polling if it encounters a full
115 * ring buffer, and not signal the other end with an interrupt.
99 */ 116 */
100 u32 pending_send_sz; 117 u32 pending_send_sz;
101
102 u32 reserved1[12]; 118 u32 reserved1[12];
103
104 union { 119 union {
105 struct { 120 struct {
106 u32 feat_pending_send_sz:1; 121 u32 feat_pending_send_sz:1;