Thread (9 messages) flat view 9 messages, 4 authors, 2015-03-12

RE: [PATCH 2/2 net-next] hyperv: Support batched notification

From: KY Srinivasan <kys@microsoft.com>
Date: 2015-03-11 16:42:05
Also in: lkml

-----Original Message-----
From: Jason Wang [mailto:jasowang@redhat.com]
Sent: Tuesday, March 10, 2015 8:34 PM
To: KY Srinivasan
Cc: davem@davemloft.net; netdev@vger.kernel.org;
gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org;
devel@linuxdriverproject.org; olaf@aepfle.de; apw@canonical.com; KY
Srinivasan
Subject: Re: [PATCH 2/2 net-next] hyperv: Support batched notification



On Wed, Mar 11, 2015 at 2:50 AM, K. Y. Srinivasan [off-list ref]
wrote:
quoted
Optimize notifying the host by deferring notification until there are
no more packets to be sent. This will help in batching the requests on
the host.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/net/hyperv/hyperv_net.h   |    2 +-
 drivers/net/hyperv/netvsc.c       |   14 +++++++++-----
 drivers/net/hyperv/netvsc_drv.c   |    3 ++-
 drivers/net/hyperv/rndis_filter.c |    2 +-
 4 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/drivers/net/hyperv/hyperv_net.h
b/drivers/net/hyperv/hyperv_net.h index 4815843..3fd9896 100644
--- a/drivers/net/hyperv/hyperv_net.h
+++ b/drivers/net/hyperv/hyperv_net.h
@@ -184,7 +184,7 @@ struct rndis_device {  int
netvsc_device_add(struct hv_device *device, void *additional_info);
int netvsc_device_remove(struct hv_device *device);  int
netvsc_send(struct hv_device *device,
-		struct hv_netvsc_packet *packet);
+		struct hv_netvsc_packet *packet, bool kick_q);
 void netvsc_linkstatus_callback(struct hv_device *device_obj,
 				struct rndis_message *resp);
 int netvsc_recv_callback(struct hv_device *device_obj, diff --git
a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index
208eb05..9003b94 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -707,7 +707,7 @@ static u32 netvsc_copy_to_send_buf(struct
netvsc_device *net_device,  }

 int netvsc_send(struct hv_device *device,
-			struct hv_netvsc_packet *packet)
+			struct hv_netvsc_packet *packet, bool kick_q)
 {
 	struct netvsc_device *net_device;
 	int ret = 0;
@@ -719,6 +719,7 @@ int netvsc_send(struct hv_device *device,
 	u32 msg_size = 0;
 	struct sk_buff *skb = NULL;
 	u16 q_idx = packet->q_idx;
+	u32 vmbus_flags =
VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
quoted

 	net_device = get_outbound_net_device(device); @@ -768,18
+769,21 @@
quoted
int netvsc_send(struct hv_device *device,
 		return -ENODEV;

 	if (packet->page_buf_cnt) {
-		ret = vmbus_sendpacket_pagebuffer(out_channel,
+		ret = vmbus_sendpacket_pagebuffer_ctl(out_channel,
 						  packet->page_buf,
 						  packet->page_buf_cnt,
 						  &sendMessage,
 						  sizeof(struct
nvsp_message),
quoted
-						  req_id);
+						  req_id,
+						  vmbus_flags,
+						  kick_q);
What if kick_q is false but ret is -EAGAIN here? Looks like in this case host
won't get notified at all. How about checking whether txq and kicking if it has
been stopped like what other network driver did?
Good point. I am going to fix this issue in the VMBUS layer. The kick_q argument
is simply a hint to the vmbus level - the lower level can choose not to notify the
host (even if kick_q is true) based on other considerations.

I will resend this series with the logic in the vmbus driver. I will send the patch out
and Greg can decide if the vmbus change should go through Greg's tree or David's tree.

Regards,

K. Y
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help