tools: selftests: psock_tpacket: skip un-supported tpacket_v3 test

Message ID 20170922101717.11933-1-orson.zhai@linaro.org
State New
Headers show
Series
  • tools: selftests: psock_tpacket: skip un-supported tpacket_v3 test
Related show

Commit Message

Orson Zhai Sept. 22, 2017, 10:17 a.m.
The TPACKET_V3 test of PACKET_TX_RING will fail with kernel version
lower than v4.11. Supported code of tx ring was add with commit id
<7f953ab2ba46: af_packet: TX_RING support for TPACKET_V3> at Jan. 3
of 2017.

So skip this item test instead of reporting failing for old kernels.

Signed-off-by: Orson Zhai <orson.zhai@linaro.org>

---
 tools/testing/selftests/net/psock_tpacket.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

-- 
2.12.2

Comments

David Miller Sept. 23, 2017, 1:20 a.m. | #1
From: Orson Zhai <orson.zhai@linaro.org>

Date: Fri, 22 Sep 2017 18:17:17 +0800

> The TPACKET_V3 test of PACKET_TX_RING will fail with kernel version

> lower than v4.11. Supported code of tx ring was add with commit id

> <7f953ab2ba46: af_packet: TX_RING support for TPACKET_V3> at Jan. 3

> of 2017.

> 

> So skip this item test instead of reporting failing for old kernels.

> 

> Signed-off-by: Orson Zhai <orson.zhai@linaro.org>


The whole point is to make sure the kernel in which the selftest
code is present functions properly.

There are many tests in selftests that only work on recent kernels.

I'm not applying this, sorry.
Fathi Boudra Sept. 23, 2017, 11:27 a.m. | #2
On 23 September 2017 at 04:20, David Miller <davem@davemloft.net> wrote:
> From: Orson Zhai <orson.zhai@linaro.org>

> Date: Fri, 22 Sep 2017 18:17:17 +0800

>

>> The TPACKET_V3 test of PACKET_TX_RING will fail with kernel version

>> lower than v4.11. Supported code of tx ring was add with commit id

>> <7f953ab2ba46: af_packet: TX_RING support for TPACKET_V3> at Jan. 3

>> of 2017.

>>

>> So skip this item test instead of reporting failing for old kernels.

>>

>> Signed-off-by: Orson Zhai <orson.zhai@linaro.org>

>

> The whole point is to make sure the kernel in which the selftest

> code is present functions properly.

>

> There are many tests in selftests that only work on recent kernels.


For the background, a similar discussion happened on this thread:
https://lkml.org/lkml/2017/6/22/802

There's cases where we'd like to run latest selftests on stable kernels.
You're right, there are many tests in selftests that only work on
recent kernels and we intend to fix it.
Skipping gracefully a test because the feature is missing on the
kernel under test is preferred to fail.

> I'm not applying this, sorry.

> --

> To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in

> the body of a message to majordomo@vger.kernel.org

> More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller Sept. 23, 2017, 4:58 p.m. | #3
From: Fathi Boudra <fathi.boudra@linaro.org>

Date: Sat, 23 Sep 2017 14:27:15 +0300

> On 23 September 2017 at 04:20, David Miller <davem@davemloft.net> wrote:

>> From: Orson Zhai <orson.zhai@linaro.org>

>> Date: Fri, 22 Sep 2017 18:17:17 +0800

>>

>>> The TPACKET_V3 test of PACKET_TX_RING will fail with kernel version

>>> lower than v4.11. Supported code of tx ring was add with commit id

>>> <7f953ab2ba46: af_packet: TX_RING support for TPACKET_V3> at Jan. 3

>>> of 2017.

>>>

>>> So skip this item test instead of reporting failing for old kernels.

>>>

>>> Signed-off-by: Orson Zhai <orson.zhai@linaro.org>

>>

>> The whole point is to make sure the kernel in which the selftest

>> code is present functions properly.

>>

>> There are many tests in selftests that only work on recent kernels.

> 

> For the background, a similar discussion happened on this thread:

> https://lkml.org/lkml/2017/6/22/802

> 

> There's cases where we'd like to run latest selftests on stable kernels.

> You're right, there are many tests in selftests that only work on

> recent kernels and we intend to fix it.

> Skipping gracefully a test because the feature is missing on the

> kernel under test is preferred to fail.


This approach is extremely ill advised.

It is hard enough to get developers to add new tests in the first
place.

Having the extra burdon of needing to make the test work on older
kernels is going to discourage test writing even more.

If you want to "backport" tests, handle them the same way -stable
backports are done.  With extreme care and making sure they get
backported to the kernel they actually would work on.

Patch

diff --git a/tools/testing/selftests/net/psock_tpacket.c b/tools/testing/selftests/net/psock_tpacket.c
index 7f6cd9fdacf3..f0cfc18c3726 100644
--- a/tools/testing/selftests/net/psock_tpacket.c
+++ b/tools/testing/selftests/net/psock_tpacket.c
@@ -57,6 +57,7 @@ 
 #include <net/if.h>
 #include <inttypes.h>
 #include <poll.h>
+#include <errno.h>
 
 #include "psock_lib.h"
 
@@ -676,7 +677,7 @@  static void __v3_fill(struct ring *ring, unsigned int blocks, int type)
 	ring->flen = ring->req3.tp_block_size;
 }
 
-static void setup_ring(int sock, struct ring *ring, int version, int type)
+static int setup_ring(int sock, struct ring *ring, int version, int type)
 {
 	int ret = 0;
 	unsigned int blocks = 256;
@@ -703,7 +704,11 @@  static void setup_ring(int sock, struct ring *ring, int version, int type)
 
 	if (ret == -1) {
 		perror("setsockopt");
-		exit(1);
+		if (errno == EINVAL) {
+			printf("[SKIP] This type seems un-supported in current kernel, skipped.\n");
+			return -1;
+		} else
+			exit(1);
 	}
 
 	ring->rd_len = ring->rd_num * sizeof(*ring->rd);
@@ -715,6 +720,7 @@  static void setup_ring(int sock, struct ring *ring, int version, int type)
 
 	total_packets = 0;
 	total_bytes = 0;
+	return 0;
 }
 
 static void mmap_ring(int sock, struct ring *ring)
@@ -830,7 +836,12 @@  static int test_tpacket(int version, int type)
 
 	sock = pfsocket(version);
 	memset(&ring, 0, sizeof(ring));
-	setup_ring(sock, &ring, version, type);
+	if(setup_ring(sock, &ring, version, type)) {
+		/* skip test when error of invalid argument */
+		close(sock);
+		return 0;
+	}
+
 	mmap_ring(sock, &ring);
 	bind_ring(sock, &ring);
 	walk_ring(sock, &ring);