> -----Original Message----- > From: Jason Wang [mailto:jasowang@xxxxxxxxxx] > Sent: Tuesday, March 10, 2015 8:34 PM > To: KY Srinivasan > Cc: davem@xxxxxxxxxxxxx; netdev@xxxxxxxxxxxxxxx; > gregkh@xxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; > devel@xxxxxxxxxxxxxxxxxxxxxx; olaf@xxxxxxxxx; apw@xxxxxxxxxxxxx; 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 <kys@xxxxxxxxxxxxx> > wrote: > > 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@xxxxxxxxxxxxx> > > --- > > 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; > > > > > > net_device = get_outbound_net_device(device); @@ -768,18 > +769,21 @@ > > 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), > > - 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 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel