hv_netvsc: Use the xmit_more skb flag to optimize signaling the host
Subsystems (3)
PATCH v2 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.
drivers/net/hyperv/netvsc.c | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-)
drivers/net/hyperv/netvsc.c +12 -8
@@ -743,6 +743,7 @@ 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 ; nvmsg.hdr.msg_type =NVSP_MSG1_TYPE_SEND_RNDIS_PKT ;if (packet->is_data_pkt) {
@@ -772,19 +773,22 @@ static inline int netvsc_send_pkt(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 ) {
Signature · 1 line
1.7.4.1
Quoted 45 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.Signed-off-by K. Y. Srinivasan <[email protected]>---
v2: Fixed up indentation based on feedback from David Miller.drivers/net/hyperv/netvsc.c | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-)drivers/net/hyperv/netvsc.c +10
-7@@ -743,6 +743,7 @@ 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 ; nvmsg.hdr.msg_type =NVSP_MSG1_TYPE_SEND_RNDIS_PKT ;if (packet->is_data_pkt) {@@ -772,19 +773,22 @@ static inline int netvsc_send_pkt(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(
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 794
Quoted 10 lines
drivers/net/hyperv/netvsc.c +2
-1+ 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 ) {
This might be problematic, if queue is stopped ( netif_tx_stop_queue())
You need to force a kick if we are about to stop the queue :
Random example : commit ddd0ca5d60b350bbfbfb60b25885a9779ce6d6c7
Quoted 72 lines
-----Original Message-----
From: Eric Dumazet [mailto:[email protected]]
Sent: Thursday, April 30, 2015 9:37 PM
To: KY Srinivasan
Cc: [email protected]; [email protected]; linux- [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Subject: Re: [PATCH V2 net-next 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 14 lines
packets. Implement this optimization.
Signed-off-by K. Y. Srinivasan <[email protected]>---
v2: Fixed up indentation based on feedback from David Miller.drivers/net/hyperv/netvsc.c | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-)drivers/net/hyperv/netvsc.c +0
-0drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 746
Quoted 4 lines
drivers/net/hyperv/netvsc.c +1
-0@@ -743,6 +743,7 @@ 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 779
Quoted 12 lines
drivers/net/hyperv/netvsc.c +0
-5nvmsg.hdr.msg_type =NVSP_MSG1_TYPE_SEND_RNDIS_PKT ;if (packet->is_data_pkt) {@@ -772,19 +773,22 @@ static inline int netvsc_send_pkt(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),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 3 lines
drivers/net/hyperv/netvsc.c +1
-0+ vmbus_flags, !packet->xmit_more); }
Quoted 7 lines
drivers/net/hyperv/netvsc.c static inline int netvsc_send_pkt( · line 794
Quoted 1 line
drivers/net/hyperv/netvsc.c +0
-0if (ret ==0 ) {This might be problematic, if queue is stopped (
netif_tx_stop_queue())You need to force a kick if we are about to stop the queue :
Random example : commit
ddd0ca5d60b350bbfbfb60b25885a9779ce6d6c7
Thanks Eric; I will fix and resend.
Regards,
K. Y