hv_netvsc: Use the xmit_more skb flag to optimize signaling the host
Subsystems (3)
PATCH v4 1/1 hv_netvsc: Use the xmit_more skb flag to optimize signaling the host
Based on the information given to this driver (via the xmit_more skb flag), we can defer signaling the host if more packets are on the way. This will help make the host more efficient since it can potentially process a larger batch of packets. Implement this optimization.
---
v2: Fixed up indentation based on feedback from David Miller.
v3,v4: If the queue could be stopped, deal with that condition: Eric Dumazet <[email protected]>
drivers/net/hyperv/netvsc.c | 34 ++++++++++++++++++++++++---------- 1 files changed, 24 insertions(+), 10 deletions(-)
drivers/net/hyperv/netvsc.c +24 -10
@@ -743,6 +743,8 @@ static inline int netvsc_send_pkt(u64 req_id;int ret;struct hv_page_buffer *pgbuf; +u32 vmbus_flags =VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED ; +u32 ring_avail =hv_ringbuf_avail_percent (&out_channel->outbound); nvmsg.hdr.msg_type =NVSP_MSG1_TYPE_SEND_RNDIS_PKT ;if (packet->is_data_pkt) {
@@ -769,30 +771,42 @@ static inline int netvsc_send_pkt(if (out_channel->rescind)return -ENODEV ; +/* +* It is possible that once we successfully place this packet +* on the ringbuffer, we may stop the queue. In that case, we want +* to notify the host independent of the xmit_more flag. We don't +* need to be precise here; in the worst case we may signal the host +* unnecessarily. +*/ +if (ring_avail < (RING_AVAIL_PERCENT_LOWATER +1 )) + packet->xmit_more = false; +if (packet->page_buf_cnt) { pgbuf = packet->cp_partial ? packet->page_buf + packet->rmsg_pgcnt : packet->page_buf; - ret =vmbus_sendpacket_pagebuffer (out_channel, - pgbuf, - packet->page_buf_cnt, - &nvmsg, -sizeof (struct nvsp_message ), - req_id); + ret =vmbus_sendpacket_pagebuffer_ctl (out_channel, + pgbuf, + packet->page_buf_cnt, + &nvmsg, +sizeof (struct +nvsp_message ), + req_id, + vmbus_flags, + !packet->xmit_more); }else { - ret =vmbus_sendpacket ( + ret =vmbus_sendpacket_ctl ( out_channel, &nvmsg,sizeof (struct nvsp_message ), req_id,VM_PKT_DATA_INBAND , -VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED ); + vmbus_flags, !packet->xmit_more); }if (ret ==0 ) {atomic_inc (&net_device->num_outstanding_sends);atomic_inc (&net_device->queue_sends[q_idx]); -if (hv_ringbuf_avail_percent (&out_channel->outbound) < -RING_AVAIL_PERCENT_LOWATER ) { +if (ring_avail <RING_AVAIL_PERCENT_LOWATER ) {netif_tx_stop_queue (netdev_get_tx_queue ( ndev, q_idx));
Signature · 1 line
1.7.4.1
David Miller
maintainerFrom: "K. Y. Srinivasan" <[email protected]>
Date: Wed, 6 May 2015 15:29:05 -0700
Quoted 14 lines
drivers/net/hyperv/netvsc.c +8
-6- ret =vmbus_sendpacket_pagebuffer (out_channel, - pgbuf, - packet->page_buf_cnt, - &nvmsg, -sizeof (struct nvsp_message ), - req_id); + ret = vmbus_sendpacket_pagebuffer_ctl(out_channel, + pgbuf, + packet->page_buf_cnt, + &nvmsg, + sizeof(struct + nvsp_message), + req_id, + vmbus_flags,
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 802
Quoted 10 lines
drivers/net/hyperv/netvsc.c +3
-2+ !packet->xmit_more); }else { - ret =vmbus_sendpacket ( + ret =vmbus_sendpacket_ctl ( out_channel, &nvmsg,sizeof (struct nvsp_message ), req_id,VM_PKT_DATA_INBAND , -VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED ); + vmbus_flags, !packet->xmit_more);
Just as you did for the vmbus_sendpacket_pagebuffer_ctl() call above, you'll need to reindent the arguments for the vmbus_sendpacket_ctl() call since the openning parenthesis is now at a different column.
Thanks.
Quoted 40 lines
-----Original Message-----
From: David Miller [mailto:[email protected]]
Sent: Sunday, May 10, 2015 2:51 PM
To: KY Srinivasan
Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Subject: Re: [PATCH V4 net-next 1/1]hv_netvsc: Use thexmit_moreskb flag to optimize signaling the hostFrom: "K. Y. Srinivasan" <[email protected]>
Date: Wed, 6 May 2015 15:29:05 -0700drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt(
Quoted 5 lines
drivers/net/hyperv/netvsc.c +0
-5- ret = vmbus_sendpacket_pagebuffer(out_channel, - pgbuf, - packet->page_buf_cnt, - &nvmsg, - sizeof(struct
nvsp_message),Quoted 8 lines
drivers/net/hyperv/netvsc.c +7
-1- req_id); + ret = vmbus_sendpacket_pagebuffer_ctl(out_channel, + pgbuf, + packet->page_buf_cnt, + &nvmsg, + sizeof(struct + nvsp_message), + req_id,drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt(
Quoted 10 lines
drivers/net/hyperv/netvsc.c +3
-2+ vmbus_flags, + !packet->xmit_more); }else { - ret = vmbus_sendpacket( + ret = vmbus_sendpacket_ctl( out_channel, &nvmsg, sizeof(struct nvsp_message), req_id, VM_PKT_DATA_INBAND, -VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
Quoted 5 lines
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 802
Quoted 1 line
drivers/net/hyperv/netvsc.c +1
-0+ vmbus_flags, !packet->xmit_more);Just as you did for the
vmbus_sendpacket_pagebuffer_ctl()call above, you'll need to reindent the arguments for thevmbus_sendpacket_ctl()call since the openning parenthesis is now at a different column.
Done.
Regards,
K. Y
Quoted 2 lines
Thanks.