pktgen: Fix multiqueue handling
Subsystems (3)
PATCH 1/1 pktgen: Fix multiqueue handling
Note : I could not really test this patch, I dont have multi queue hardware yet.
I found this by code inspection, please double check, thanks
[PATCH] pktgen: Fix multiqueue handling
It is not currently possible to instruct pktgen to use one selected tx queue.
When Robert added multiqueue support in commit 45b270f8, he added an interval (queue_map_min, queue_map_max), and his code doesnt take into account the case of min = max, to select one tx queue exactly.
I suspect a high performance setup on a eight txqueue device wants to use exactly eight cpus, and assign one tx queue to each sender.
This patchs makes pktgen select the right tx queue, not the first one.
Also updates Documentation to reflect Robert changes.
--- Documentation/networking/pktgen.txt | 8 ++++++++ net/core/pktgen.c | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-)
Documentation/networking/pktgen.txt +8 -0
@@ -90,6 +90,11 @@ Examples: pgset "dstmac 00:00:00:00:00:00" sets MAC destination address pgset "srcmac 00:00:00:00:00:00" sets MAC source address + pgset "queue_map_min 0" Sets the min value of tx queue interval + pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices + To select queue 1 of a given device, + use queue_map_min=1 and queue_map_max=1 + pgset "src_mac_count 1" Sets the number of MACs we'll range through. The 'minimum' MAC is what you set with srcmac.
@@ -101,6 +106,9 @@ Examples: IPDST_RND, UDPSRC_RND, UDPDST_RND, MACSRC_RND, MACDST_RND MPLS_RND, VID_RND, SVID_RND + QUEUE_MAP_RND # queue map random + QUEUE_MAP_CPU # queue map mirrors smp_processor_id() + pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then cycle through the port range.
net/core/pktgen.c +1 -1
@@ -2212,7 +2212,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev)if (pkt_dev->flags &F_QUEUE_MAP_CPU ) pkt_dev->cur_queue_map =smp_processor_id (); -else if (pkt_dev->queue_map_min < pkt_dev->queue_map_max) { +else if (pkt_dev->queue_map_min <= pkt_dev->queue_map_max) {__u16 t;if (pkt_dev->flags &F_QUEUE_MAP_RND ) { t = random32() %
PATCH 1/1 pktgen: Fix multiqueue handling
Thanks yes is seems right. We can chose a single arbitrary TX queue with the patch. BTW Noticed you and Stephen discussed to reduce dirtying skb->users, maybe the idea to bump up skb->users to clone_skb is not so bad. I'll think the code will be pretty straight-forward.
Cheers
--ro
Quoted 62 lines · Eric Dumazet
Note : I could not really test this patch, I dont have multi queue hardware yet. I found this by code inspection, please double check, thanks [PATCH] pktgen: Fix multiqueue handling
It is not currently possible to instruct pktgen to use one selected tx queue.
When Robert added multiqueue support in commit
45b270f8, he added an interval (queue_map_min,queue_map_max), and his code doesnt take into account the case of min = max, to select one tx queue exactly.I suspect a high performance setup on a eight txqueue device wants to use exactly eight cpus, and assign one tx queue to each sender.
This patchs makes pktgen select the right tx queue, not the first one.
Also updates Documentation to reflect Robert changes.
Signed-off-by Eric Dumazet <[email protected]>--- Documentation/networking/pktgen.txt | 8 ++++++++ net/core/pktgen.c | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-)Documentation/networking/pktgen.txt +8
-0@@ -90,6 +90,11 @@ Examples: pgset "dstmac 00:00:00:00:00:00" sets MAC destination address pgset "srcmac 00:00:00:00:00:00" sets MAC source address + pgset "queue_map_min 0" Sets the min value of tx queue interval + pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices + To select queue 1 of a given device, + use queue_map_min=1 and queue_map_max=1 + pgset "src_mac_count 1" Sets the number of MACs we'll range through. The 'minimum' MAC is what you set with srcmac.@@ -101,6 +106,9 @@ Examples: IPDST_RND, UDPSRC_RND, UDPDST_RND, MACSRC_RND, MACDST_RND MPLS_RND, VID_RND, SVID_RND + QUEUE_MAP_RND # queue map random + QUEUE_MAP_CPU # queue map mirrors smp_processor_id() + pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then cycle through the port range.net/core/pktgen.c +1
-1@@ -2212,7 +2212,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev)if (pkt_dev->flags &F_QUEUE_MAP_CPU ) pkt_dev->cur_queue_map =smp_processor_id (); -else if (pkt_dev->queue_map_min < pkt_dev->queue_map_max) { +else if (pkt_dev->queue_map_min <= pkt_dev->queue_map_max) {__u16 t;if (pkt_dev->flags &F_QUEUE_MAP_RND ) { t = random32() %
From: Robert Olsson <[email protected]>
Date: Sat, 3 Oct 2009 21:24:23 +0200
Quoted 7 lines
Thanks yes is seems right. We can chose a single arbitrary TX queue with the patch. BTW Noticed you and Stephen discussed to reduce dirtying
skb->users, maybe the idea to bump upskb->userstoclone_skbis not so bad. I'll think the code will be pretty straight-forward.
Quoted 5 lines
Cheers
--roSigned-off-by Robert Olsson <[email protected]>
Applied, thanks everyone.