Skip to contentSkip to conversation

net/af_packet: make bypass configurable

PATCH Superseded Chas Williams 3 participants 10 messages Sep 19, 2017 – Oct 5, 2017 Network drivers

lore
Share & tools
lore
#0 lore raw

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
index 7aa26e5..a299a4e 100644
@@ -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, &eth_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
#1 lore raw

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
index 7aa26e5..e3858fa 100644
@@ -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, &eth_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
Acked-by on v2 1/1
#2 lore raw
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.

---
 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
index 7aa26e5..e3858fa 100644
@@ -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)

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,
  		}


 #if defined(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, &eth_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
#3 lore raw
In reply to Chas Williams
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
---
 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
index 7aa26e5..e3858fa 100644

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 -4
 	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)

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, &eth_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
#4 lore raw
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.

#5 lore raw

PATCH v3 1/1 net/af_packet: make bypass configurable

In reply to 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.

---
 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
index 7aa26e5..b95d87d 100644
@@ -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, &eth_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
#6 lore raw
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.

---
 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
index 7aa26e5..b95d87d 100644
@@ -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.

<...>

#7 lore raw

PATCH v4 1/1 net/af_packet: make bypass configurable

In reply to 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.

---
 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
index 7aa26e5..8089eda 100644
@@ -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, &eth_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