hv_netvsc: Use the xmit_more skb flag to optimize signaling the host
Subsystems (3)
PATCH v5 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]>
v5: Fixed up indentation based on feedback from David Miller.
drivers/net/hyperv/netvsc.c | 41 +++++++++++++++++++++++++++-------------- 1 files changed, 27 insertions(+), 14 deletions(-)
drivers/net/hyperv/netvsc.c +27 -14
@@ -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,41 @@ 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 ( - out_channel, &nvmsg, -sizeof (struct nvsp_message ), - req_id, -VM_PKT_DATA_INBAND , -VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED ); + ret =vmbus_sendpacket_ctl (out_channel, &nvmsg, +sizeof (struct nvsp_message ), + req_id, +VM_PKT_DATA_INBAND , + 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
Quoted 4 lines · K. Y. Srinivasan
Based on the information given to this driver (via the
xmit_moreskb 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.
trivia:
I think that indirecting VMBUS_DATA_PACKET_FLAG_COMPLETTION_REQUESTED into a non-const temporary isn't very useful.
Whenever overly long identifiers like VMBUS_<FOO> is used, I think that it'd be better to use it directly and ignore 80 column warnings.
Same with the "sizeof(struct nvsp_message)" on two lines.
drivers/net/hyperv/netvsc.c
Quoted 1 line
drivers/net/hyperv/netvsc.c +0
-0
[]
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 747
Quoted 6 lines
drivers/net/hyperv/netvsc.c +2
-0@@ -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);
[]
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt(
Quoted 1 line
drivers/net/hyperv/netvsc.c +0
-0@@ -769,30 +771,41 @@ static inline int netvsc_send_pkt(
[]
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 795
Quoted 9 lines
drivers/net/hyperv/netvsc.c +9
-0+ ret =vmbus_sendpacket_pagebuffer_ctl (out_channel, + pgbuf, + packet->page_buf_cnt, + &nvmsg, +sizeof (struct +nvsp_message ), + req_id, + vmbus_flags, + !packet->xmit_more);
[]
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 810
Quoted 2 lines
drivers/net/hyperv/netvsc.c +0
-0netif_tx_stop_queue (netdev_get_tx_queue ( ndev, q_idx));
This could be on one line too.
Quoted 22 lines
-----Original Message-----
From: Joe Perches [mailto:[email protected]]
Sent: Sunday, May 10, 2015 10:58 PM
To: KY Srinivasan
Cc: [email protected]; [email protected]; linux- [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Subject: Re: [PATCH V5 1/1]hv_netvsc: Use thexmit_moreskb flag to optimize signaling the hostQuoted 2 lines · K. Y. Srinivasan
Based on the information given to this driver (via the
xmit_moreskb flag), we can defer signaling the host if more packets are on the way. This willhelp
Quoted 1 line
make the host more efficient since it can potentially process a larger batch
of
Quoted 1 line
packets. Implement this optimization.
trivia:
Quoted 7 lines
I think that indirecting
VMBUS_DATA_PACKET_FLAG_COMPLETTION_REQUESTED
into a non-const temporary isn't very useful.Whenever overly long identifiers like VMBUS_<FOO> is used, I think that it'd be better to use it directly and ignore 80 column warnings.
Thanks Joe; if Dave agrees, I can send v6 of this patch out.
Regards,
K. Y
Quoted 33 lines
Same with the "
sizeof(struct nvsp_message)" on two lines.drivers/net/hyperv/netvsc.c
Quoted 1 line
drivers/net/hyperv/netvsc.c +0
-0[]
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 746
Quoted 5 lines
drivers/net/hyperv/netvsc.c +1
-0@@ -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;drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 748
Quoted 2 lines
drivers/net/hyperv/netvsc.c +1
-0+u32 ring_avail =hv_ringbuf_avail_percent (&out_channel- outbound);[]
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt(
Quoted 1 line
drivers/net/hyperv/netvsc.c +0
-0@@ -769,30 +771,41 @@ static inline int netvsc_send_pkt([]
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 795
Quoted 9 lines
drivers/net/hyperv/netvsc.c +9
-0+ ret =vmbus_sendpacket_pagebuffer_ctl (out_channel, + pgbuf, + packet->page_buf_cnt, + &nvmsg, +sizeof (struct +nvsp_message ), + req_id, + vmbus_flags, + !packet->xmit_more);[]
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 810
Quoted 2 lines
drivers/net/hyperv/netvsc.c +0
-0netif_tx_stop_queue (netdev_get_tx_queue ( ndev, q_idx));This could be on one line too.
David Miller
maintainerFrom: KY Srinivasan <[email protected]>
Date: Mon, 11 May 2015 08:59:53 +0000
Quoted 26 lines
Quoted 26 lines
-----Original Message-----
From: Joe Perches [mailto:[email protected]]
Sent: Sunday, May 10, 2015 10:58 PM
To: KY Srinivasan
Cc: [email protected]; [email protected]; linux- [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Subject: Re: [PATCH V5 1/1]hv_netvsc: Use thexmit_moreskb flag to optimize signaling the hostQuoted 2 lines · K. Y. Srinivasan
Based on the information given to this driver (via the
xmit_moreskb flag), we can defer signaling the host if more packets are on the way. This willhelp
Quoted 1 line
make the host more efficient since it can potentially process a larger batch
of
Quoted 1 line
packets. Implement this optimization.
trivia:
I think that indirecting
VMBUS_DATA_PACKET_FLAG_COMPLETTION_REQUESTED
into a non-const temporary isn't very useful.
Quoted 5 lines
Quoted 3 lines
Whenever overly long identifiers like VMBUS_<FOO> is used, I think that it'd be better to use it directly and ignore 80 column warnings.
Thanks Joe; if Dave agrees, I can send v6 of this patch out.
Sure, respin a v6.