net/af_packet: make bypass configurable
PATCH 1/1 net/af_packet: make bypass configurable
From: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
--- drivers/net/af_packet/rte_eth_af_packet.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
drivers/net/af_packet/rte_eth_af_packet.c +17 -5
@@ -59,6 +59,7 @@#define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz"#define ETH_AF_PACKET_FRAMESIZE_ARG "framesz"#define ETH_AF_PACKET_FRAMECOUNT_ARG "framecnt" +#define ETH_AF_PACKET_BYPASS_ARG "bypass"#define DFLT_BLOCK_SIZE (1 << 12)#define DFLT_FRAME_SIZE (1 << 11)
@@ -115,6 +116,7 @@ static const char *valid_arguments[] = {ETH_AF_PACKET_BLOCKSIZE_ARG ,ETH_AF_PACKET_FRAMESIZE_ARG ,ETH_AF_PACKET_FRAMECOUNT_ARG , +ETH_AF_PACKET_BYPASS_ARG , NULL };
@@ -559,6 +561,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,unsigned int blockcnt, unsigned int framesize, unsigned int framecnt, + unsigned int bypass, struct pmd_internals **internals, struct rte_eth_dev **eth_dev, struct rte_kvargs *kvlist)
@@ -580,9 +583,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,#if defined(PACKET_FANOUT )int fanout_arg;#endif -#if defined(PACKET_QDISC_BYPASS ) -int bypass; -#endif for (k_idx =0 ; k_idx < kvlist->count; k_idx++) { pair = &kvlist->pairs[k_idx];
@@ -698,7 +698,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, }#if defined(PACKET_QDISC_BYPASS ) - bypass =1 ; rc =setsockopt (qsockfd,SOL_PACKET ,PACKET_QDISC_BYPASS , &bypass,sizeof (bypass));if (rc ==-1 ) {
@@ -851,6 +850,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,unsigned int framesize =DFLT_FRAME_SIZE ;unsigned int framecount =DFLT_FRAME_COUNT ;unsigned int qpairs =1 ; +unsigned int bypass =1 ;/* do some parameter checking */ if (*sockfd <0 )
@@ -902,6 +902,16 @@ rte_eth_from_packet(struct rte_vdev_device *dev, }continue ; } +if (strstr (pair->key,ETH_AF_PACKET_BYPASS_ARG ) !=NULL ) { + bypass =atoi (pair->value); +if (bypass >2 ) { +RTE_LOG (ERR ,PMD , +"%s: invalid bypass value\n" , + name); +return -1 ; + } +continue ; + } }if (framesize > blocksize) {
@@ -927,6 +937,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,if (rte_pmd_init_internals (dev, *sockfd, qpairs, blocksize, blockcount, framesize, framecount, + bypass, &internals, ð_dev, kvlist) <0 )return -1 ;
@@ -1021,4 +1032,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_af_packet,"qpairs=<int> " "blocksz=<int> " "framesz=<int> " - "framecnt=<int>"); +"framecnt=<int> " + "bypass=<int>");
Signature · 1 line
2.9.5
PATCH v2 1/1 net/af_packet: make bypass configurable
From: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
--- drivers/net/af_packet/rte_eth_af_packet.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
drivers/net/af_packet/rte_eth_af_packet.c +17 -5
@@ -59,6 +59,7 @@#define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz"#define ETH_AF_PACKET_FRAMESIZE_ARG "framesz"#define ETH_AF_PACKET_FRAMECOUNT_ARG "framecnt" +#define ETH_AF_PACKET_BYPASS_ARG "bypass"#define DFLT_BLOCK_SIZE (1 << 12)#define DFLT_FRAME_SIZE (1 << 11)
@@ -115,6 +116,7 @@ static const char *valid_arguments[] = {ETH_AF_PACKET_BLOCKSIZE_ARG ,ETH_AF_PACKET_FRAMESIZE_ARG ,ETH_AF_PACKET_FRAMECOUNT_ARG , +ETH_AF_PACKET_BYPASS_ARG , NULL };
@@ -559,6 +561,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,unsigned int blockcnt, unsigned int framesize, unsigned int framecnt, + unsigned int bypass, struct pmd_internals **internals, struct rte_eth_dev **eth_dev, struct rte_kvargs *kvlist)
@@ -580,9 +583,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,#if defined(PACKET_FANOUT )int fanout_arg;#endif -#if defined(PACKET_QDISC_BYPASS ) -int bypass; -#endif for (k_idx =0 ; k_idx < kvlist->count; k_idx++) { pair = &kvlist->pairs[k_idx];
@@ -698,7 +698,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, }#if defined(PACKET_QDISC_BYPASS ) - bypass =1 ; rc =setsockopt (qsockfd,SOL_PACKET ,PACKET_QDISC_BYPASS , &bypass,sizeof (bypass));if (rc ==-1 ) {
@@ -851,6 +850,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,unsigned int framesize =DFLT_FRAME_SIZE ;unsigned int framecount =DFLT_FRAME_COUNT ;unsigned int qpairs =1 ; +unsigned int bypass =1 ;/* do some parameter checking */ if (*sockfd <0 )
@@ -902,6 +902,16 @@ rte_eth_from_packet(struct rte_vdev_device *dev, }continue ; } +if (strstr (pair->key,ETH_AF_PACKET_BYPASS_ARG ) !=NULL ) { + bypass =atoi (pair->value); +if (bypass >2 ) { +RTE_LOG (ERR ,PMD , +"%s: invalid bypass value\n" , + name); +return -1 ; + } +continue ; + } }if (framesize > blocksize) {
@@ -927,6 +937,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,if (rte_pmd_init_internals (dev, *sockfd, qpairs, blocksize, blockcount, framesize, framecount, + bypass, &internals, ð_dev, kvlist) <0 )return -1 ;
@@ -1021,4 +1032,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_af_packet,"qpairs=<int> " "blocksz=<int> " "framesz=<int> " - "framecnt=<int>"); +"framecnt=<int> " + "bypass=<int>");
Signature · 1 line
2.9.5
Quoted 101 lines · Chas Williams
From: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
Signed-off-by Chas Williams <[email protected]>---
drivers/net/af_packet/rte_eth_af_packet.c | 22 +++++++++++++++++--
---1 file changed, 17 insertions(+), 5 deletions(-)drivers/net/af_packet/rte_eth_af_packet.c +1
-0@@ -59,6 +59,7 @@ #define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz" #define ETH_AF_PACKET_FRAMESIZE_ARG "framesz" #define ETH_AF_PACKET_FRAMECOUNT_ARG "framecnt" +#define ETH_AF_PACKET_BYPASS_ARG "bypass"
#defineDFLT_BLOCK_SIZE(1 << 12)
#defineDFLT_FRAME_SIZE(1 << 11)drivers/net/af_packet/rte_eth_af_packet.c +1
-0@@ -115,6 +116,7 @@ static const char *valid_arguments[] = { ETH_AF_PACKET_BLOCKSIZE_ARG, ETH_AF_PACKET_FRAMESIZE_ARG, ETH_AF_PACKET_FRAMECOUNT_ARG, + ETH_AF_PACKET_BYPASS_ARG,NULL
};drivers/net/af_packet/rte_eth_af_packet.c +1
-0@@ -559,6 +561,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, unsigned int blockcnt, unsigned int framesize, unsigned int framecnt, + unsigned int bypass, struct pmd_internals **internals, struct rte_eth_dev **eth_dev,struct
rte_kvargs*kvlist)drivers/net/af_packet/rte_eth_af_packet.c +0
-3@@ -580,9 +583,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, #if defined(PACKET_FANOUT) int fanout_arg; #endif -#if defined(PACKET_QDISC_BYPASS ) -int bypass; -#endif
for (k_idx= 0;k_idx<kvlist->count; k_idx++) { pair = &kvlist->pairs[k_idx];drivers/net/af_packet/rte_eth_af_packet.c +0
-0@@ -698,7 +698,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, }
#ifdefined(PACKET_QDISC_BYPASS)drivers/net/af_packet/rte_eth_af_packet.c +0
-1- bypass =1 ;rc = setsockopt(qsockfd,
SOL_PACKET,PACKET_QDISC_BYPASS,
&bypass, sizeof(bypass)); if (rc == -1) {drivers/net/af_packet/rte_eth_af_packet.c +1
-0@@ -851,6 +850,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev, unsigned int framesize = DFLT_FRAME_SIZE; unsigned int framecount = DFLT_FRAME_COUNT; unsigned int qpairs = 1; +unsigned int bypass =1 ;
/* do some parameter checking */
if (*sockfd < 0)drivers/net/af_packet/rte_eth_af_packet.c +10
-0@@ -902,6 +902,16 @@ rte_eth_from_packet(struct rte_vdev_device *dev, } continue; } +if (strstr (pair->key,ETH_AF_PACKET_BYPASS_ARG ) !=NULL ) { + bypass =atoi (pair->value); +if (bypass >2 ) { +RTE_LOG (ERR ,PMD , +"%s: invalid bypass value\n", + name); +return -1 ; + } +continue ; + } }
if (framesize > blocksize) {drivers/net/af_packet/rte_eth_af_packet.c +1
-0@@ -927,6 +937,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev, if (rte_pmd_init_internals(dev, *sockfd, qpairs, blocksize, blockcount, framesize, framecount, + bypass, &internals, ð_dev, kvlist) < 0) return -1;@@ -1021,4 +1032,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_af_packet,"qpairs=<int> "
"blocksz=<int> "
"framesz=<int> "
drivers/net/af_packet/rte_eth_af_packet.c RTE_PMD_REGISTER_PARAM_STRING(net_af_packet, · line 1036
Quoted 3 lines
drivers/net/af_packet/rte_eth_af_packet.c +2
-1- "framecnt=<int>"); +"framecnt=<int> " + "bypass=<int>");
Signature · 2 lines
Kind regards, Luca Boccassi
Quoted 4 lines · Chas Williams
From: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
Out of curiosity, do you have any compression of performance numbers with and without qdisc?
Quoted 11 lines
Signed-off-by Chas Williams <[email protected]>--- drivers/net/af_packet/rte_eth_af_packet.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)drivers/net/af_packet/rte_eth_af_packet.c +0
-0
drivers/net/af_packet/rte_eth_af_packet.c line 62
Quoted 4 lines
drivers/net/af_packet/rte_eth_af_packet.c +1
-0@@ -59,6 +59,7 @@#define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz"#define ETH_AF_PACKET_FRAMESIZE_ARG "framesz"#define ETH_AF_PACKET_FRAMECOUNT_ARG "framecnt" +#define ETH_AF_PACKET_BYPASS_ARG "bypass"
I thinks argument name "bypass" on its own is not clear what is bypassed, would you mind using something like "qdisc_bypass"?
drivers/net/af_packet/rte_eth_af_packet.c static const char *valid_arguments[] = { · line 119
Quoted 8 lines
drivers/net/af_packet/rte_eth_af_packet.c +1
-0#define DFLT_BLOCK_SIZE (1 << 12)#define DFLT_FRAME_SIZE (1 << 11)@@ -115,6 +116,7 @@ static const char *valid_arguments[] = {ETH_AF_PACKET_BLOCKSIZE_ARG ,ETH_AF_PACKET_FRAMESIZE_ARG ,ETH_AF_PACKET_FRAMECOUNT_ARG , + ETH_AF_PACKET_BYPASS_ARG,
Same comment here, what about "ETH_AF_PACKET_QDISC_BYPASS_ARG" ?
Quoted 38 lines
drivers/net/af_packet/rte_eth_af_packet.c +2
-4NULL };@@ -559,6 +561,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,unsigned int blockcnt, unsigned int framesize, unsigned int framecnt, + unsigned int bypass, struct pmd_internals **internals, struct rte_eth_dev **eth_dev, struct rte_kvargs *kvlist)@@ -580,9 +583,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,#if defined(PACKET_FANOUT )int fanout_arg;#endif -#if defined(PACKET_QDISC_BYPASS ) -int bypass; -#endif for (k_idx =0 ; k_idx < kvlist->count; k_idx++) { pair = &kvlist->pairs[k_idx];@@ -698,7 +698,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, }#if defined(PACKET_QDISC_BYPASS ) - bypass =1 ; rc =setsockopt (qsockfd,SOL_PACKET ,PACKET_QDISC_BYPASS , &bypass,sizeof (bypass));if (rc ==-1 ) {@@ -851,6 +850,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,unsigned int framesize =DFLT_FRAME_SIZE ;unsigned int framecount =DFLT_FRAME_COUNT ;unsigned int qpairs =1 ; +unsigned int bypass =1 ;/* do some parameter checking */ if (*sockfd <0 )
drivers/net/af_packet/rte_eth_af_packet.c rte_eth_from_packet(struct rte_vdev_device *dev, · line 907
Quoted 6 lines
drivers/net/af_packet/rte_eth_af_packet.c +3
-0@@ -902,6 +902,16 @@ rte_eth_from_packet(struct rte_vdev_device *dev, }continue ; } +if (strstr (pair->key,ETH_AF_PACKET_BYPASS_ARG ) !=NULL ) { + bypass =atoi (pair->value); +if (bypass >2 ) {
This accepts "2" too .
As far as I can see kernel side checks if this value is zero or not, so perhaps this check is not required at all. But if you want to keep it I guess intention is to limit the value to "0" and "1".
Quoted 19 lines
drivers/net/af_packet/rte_eth_af_packet.c +8
-0+RTE_LOG (ERR ,PMD , +"%s: invalid bypass value\n" , + name); +return -1 ; + } +continue ; + } }if (framesize > blocksize) {@@ -927,6 +937,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,if (rte_pmd_init_internals (dev, *sockfd, qpairs, blocksize, blockcount, framesize, framecount, + bypass, &internals, ð_dev, kvlist) <0 )return -1 ;
drivers/net/af_packet/rte_eth_af_packet.c RTE_PMD_REGISTER_PARAM_STRING(net_af_packet, · line 1036
Quoted 6 lines
drivers/net/af_packet/rte_eth_af_packet.c +2
-1@@ -1021,4 +1032,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_af_packet,"qpairs=<int> " "blocksz=<int> " "framesz=<int> " - "framecnt=<int>"); +"framecnt=<int> " +"bypass=<int>"
Although storage is integer, does is make sense to document it as "0|1" to clarify the usage?
);
Quoted 1 line
PATCH v3 1/1 net/af_packet: make bypass configurable
In reply to Chas WilliamsFrom: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
--- drivers/net/af_packet/rte_eth_af_packet.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)
drivers/net/af_packet/rte_eth_af_packet.c +18 -6
@@ -59,6 +59,7 @@#define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz"#define ETH_AF_PACKET_FRAMESIZE_ARG "framesz"#define ETH_AF_PACKET_FRAMECOUNT_ARG "framecnt" +#define ETH_AF_PACKET_BYPASS_ARG "qdisc_bypass"#define DFLT_BLOCK_SIZE (1 << 12)#define DFLT_FRAME_SIZE (1 << 11)
@@ -115,6 +116,7 @@ static const char *valid_arguments[] = {ETH_AF_PACKET_BLOCKSIZE_ARG ,ETH_AF_PACKET_FRAMESIZE_ARG ,ETH_AF_PACKET_FRAMECOUNT_ARG , +ETH_AF_PACKET_BYPASS_ARG , NULL };
@@ -559,6 +561,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,unsigned int blockcnt, unsigned int framesize, unsigned int framecnt, + unsigned int qdisc_bypass, struct pmd_internals **internals, struct rte_eth_dev **eth_dev, struct rte_kvargs *kvlist)
@@ -580,9 +583,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,#if defined(PACKET_FANOUT )int fanout_arg;#endif -#if defined(PACKET_QDISC_BYPASS ) -int bypass; -#endif for (k_idx =0 ; k_idx < kvlist->count; k_idx++) { pair = &kvlist->pairs[k_idx];
@@ -698,9 +698,8 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, }#if defined(PACKET_QDISC_BYPASS ) - bypass =1 ; rc =setsockopt (qsockfd,SOL_PACKET ,PACKET_QDISC_BYPASS , - &bypass,sizeof (bypass)); + &qdisc_bypass,sizeof (qdisc_bypass));if (rc ==-1 ) {RTE_LOG (ERR ,PMD , "%s: could not set PACKET_QDISC_BYPASS "
@@ -851,6 +850,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,unsigned int framesize =DFLT_FRAME_SIZE ;unsigned int framecount =DFLT_FRAME_COUNT ;unsigned int qpairs =1 ; +unsigned int qdisc_bypass =1 ;/* do some parameter checking */ if (*sockfd <0 )
@@ -902,6 +902,16 @@ rte_eth_from_packet(struct rte_vdev_device *dev, }continue ; } +if (strstr (pair->key,ETH_AF_PACKET_BYPASS_ARG ) !=NULL ) { + qdisc_bypass =atoi (pair->value); +if (qdisc_bypass >1 ) { +RTE_LOG (ERR ,PMD , +"%s: invalid bypass value\n" , + name); +return -1 ; + } +continue ; + } }if (framesize > blocksize) {
@@ -927,6 +937,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,if (rte_pmd_init_internals (dev, *sockfd, qpairs, blocksize, blockcount, framesize, framecount, + qdisc_bypass, &internals, ð_dev, kvlist) <0 )return -1 ;
@@ -1021,4 +1032,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_af_packet,"qpairs=<int> " "blocksz=<int> " "framesz=<int> " - "framecnt=<int>"); +"framecnt=<int> " + "qdisc_bypass=<0|1>");
Signature · 1 line
2.9.5
Quoted 23 lines · Chas Williams
From: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
Signed-off-by Chas Williams <[email protected]>--- drivers/net/af_packet/rte_eth_af_packet.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)drivers/net/af_packet/rte_eth_af_packet.c +1
-0@@ -59,6 +59,7 @@#define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz"#define ETH_AF_PACKET_FRAMESIZE_ARG "framesz"#define ETH_AF_PACKET_FRAMECOUNT_ARG "framecnt" +#define ETH_AF_PACKET_BYPASS_ARG "qdisc_bypass"#define DFLT_BLOCK_SIZE (1 << 12)#define DFLT_FRAME_SIZE (1 << 11)
drivers/net/af_packet/rte_eth_af_packet.c static const char *valid_arguments[] = { · line 119
Quoted 4 lines
drivers/net/af_packet/rte_eth_af_packet.c +1
-0@@ -115,6 +116,7 @@ static const char *valid_arguments[] = {ETH_AF_PACKET_BLOCKSIZE_ARG ,ETH_AF_PACKET_FRAMESIZE_ARG ,ETH_AF_PACKET_FRAMECOUNT_ARG , + ETH_AF_PACKET_BYPASS_ARG,
There was a comment about the define name, just to double check if this has been missed or intentional.
<...>
PATCH v4 1/1 net/af_packet: make bypass configurable
In reply to Chas WilliamsFrom: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
--- drivers/net/af_packet/rte_eth_af_packet.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)
drivers/net/af_packet/rte_eth_af_packet.c +18 -6
@@ -59,6 +59,7 @@#define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz"#define ETH_AF_PACKET_FRAMESIZE_ARG "framesz"#define ETH_AF_PACKET_FRAMECOUNT_ARG "framecnt" +#define ETH_AF_PACKET_QDISC_BYPASS_ARG "qdisc_bypass"#define DFLT_BLOCK_SIZE (1 << 12)#define DFLT_FRAME_SIZE (1 << 11)
@@ -115,6 +116,7 @@ static const char *valid_arguments[] = {ETH_AF_PACKET_BLOCKSIZE_ARG ,ETH_AF_PACKET_FRAMESIZE_ARG ,ETH_AF_PACKET_FRAMECOUNT_ARG , +ETH_AF_PACKET_QDISC_BYPASS_ARG , NULL };
@@ -559,6 +561,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,unsigned int blockcnt, unsigned int framesize, unsigned int framecnt, + unsigned int qdisc_bypass, struct pmd_internals **internals, struct rte_eth_dev **eth_dev, struct rte_kvargs *kvlist)
@@ -580,9 +583,6 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,#if defined(PACKET_FANOUT )int fanout_arg;#endif -#if defined(PACKET_QDISC_BYPASS ) -int bypass; -#endif for (k_idx =0 ; k_idx < kvlist->count; k_idx++) { pair = &kvlist->pairs[k_idx];
@@ -698,9 +698,8 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, }#if defined(PACKET_QDISC_BYPASS ) - bypass =1 ; rc =setsockopt (qsockfd,SOL_PACKET ,PACKET_QDISC_BYPASS , - &bypass,sizeof (bypass)); + &qdisc_bypass,sizeof (qdisc_bypass));if (rc ==-1 ) {RTE_LOG (ERR ,PMD , "%s: could not set PACKET_QDISC_BYPASS "
@@ -851,6 +850,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,unsigned int framesize =DFLT_FRAME_SIZE ;unsigned int framecount =DFLT_FRAME_COUNT ;unsigned int qpairs =1 ; +unsigned int qdisc_bypass =1 ;/* do some parameter checking */ if (*sockfd <0 )
@@ -902,6 +902,16 @@ rte_eth_from_packet(struct rte_vdev_device *dev, }continue ; } +if (strstr (pair->key,ETH_AF_PACKET_QDISC_BYPASS_ARG ) !=NULL ) { + qdisc_bypass =atoi (pair->value); +if (qdisc_bypass >1 ) { +RTE_LOG (ERR ,PMD , +"%s: invalid bypass value\n" , + name); +return -1 ; + } +continue ; + } }if (framesize > blocksize) {
@@ -927,6 +937,7 @@ rte_eth_from_packet(struct rte_vdev_device *dev,if (rte_pmd_init_internals (dev, *sockfd, qpairs, blocksize, blockcount, framesize, framecount, + qdisc_bypass, &internals, ð_dev, kvlist) <0 )return -1 ;
@@ -1021,4 +1032,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_af_packet,"qpairs=<int> " "blocksz=<int> " "framesz=<int> " - "framecnt=<int>"); +"framecnt=<int> " + "qdisc_bypass=<0|1>");
Signature · 1 line
2.9.5
Quoted 6 lines · Chas Williams
From: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
Signed-off-by Chas Williams <[email protected]>
Ferruh Yigit
AppliedQuoted 9 lines · Ferruh Yigit
Quoted 6 lines · Chas Williams
From: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
Signed-off-by Chas Williams <[email protected]>Reviewed-by Ferruh Yigit <[email protected]>
Applied to dpdk-next-net/master, thanks.
Quoted 9 lines · Ferruh Yigit
Quoted 4 lines · Chas Williams
From: "Charles (Chas) Williams" <[email protected]>
In certain situations, low speed interfaces, it may be desirable to have the flow control provided by the kernel queueing disciplines.
Out of curiosity, do you have any compression of performance numbers with and without qdisc?
I had some time to test this. I didn't see any loss in performance but the interfaces
I am using only go about 200-300Mbps. it likely makes a difference if you can go
much much faster.