diff options
author | Jakub Kicinski <jakub.kicinski@netronome.com> | 2019-11-05 17:24:36 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-11-06 20:33:32 -0500 |
commit | 41098af59d8d753aa8d3bb4310cc4ecb61fc82c7 (patch) | |
tree | c15a43aa3ea0d35d17e7e2bcbadd19a07439bfd2 | |
parent | 79ffe6087e9145d2377385cac48d0d6a6b4225a5 (diff) |
selftests/tls: add test for concurrent recv and send
Add a test which spawns 16 threads and performs concurrent
send and recv calls on the same socket.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | tools/testing/selftests/net/tls.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/tools/testing/selftests/net/tls.c b/tools/testing/selftests/net/tls.c index 4c285b6e1db8..1c8f194d6556 100644 --- a/tools/testing/selftests/net/tls.c +++ b/tools/testing/selftests/net/tls.c | |||
@@ -898,6 +898,114 @@ TEST_F(tls, nonblocking) | |||
898 | } | 898 | } |
899 | } | 899 | } |
900 | 900 | ||
901 | static void | ||
902 | test_mutliproc(struct __test_metadata *_metadata, struct _test_data_tls *self, | ||
903 | bool sendpg, unsigned int n_readers, unsigned int n_writers) | ||
904 | { | ||
905 | const unsigned int n_children = n_readers + n_writers; | ||
906 | const size_t data = 6 * 1000 * 1000; | ||
907 | const size_t file_sz = data / 100; | ||
908 | size_t read_bias, write_bias; | ||
909 | int i, fd, child_id; | ||
910 | char buf[file_sz]; | ||
911 | pid_t pid; | ||
912 | |||
913 | /* Only allow multiples for simplicity */ | ||
914 | ASSERT_EQ(!(n_readers % n_writers) || !(n_writers % n_readers), true); | ||
915 | read_bias = n_writers / n_readers ?: 1; | ||
916 | write_bias = n_readers / n_writers ?: 1; | ||
917 | |||
918 | /* prep a file to send */ | ||
919 | fd = open("/tmp/", O_TMPFILE | O_RDWR, 0600); | ||
920 | ASSERT_GE(fd, 0); | ||
921 | |||
922 | memset(buf, 0xac, file_sz); | ||
923 | ASSERT_EQ(write(fd, buf, file_sz), file_sz); | ||
924 | |||
925 | /* spawn children */ | ||
926 | for (child_id = 0; child_id < n_children; child_id++) { | ||
927 | pid = fork(); | ||
928 | ASSERT_NE(pid, -1); | ||
929 | if (!pid) | ||
930 | break; | ||
931 | } | ||
932 | |||
933 | /* parent waits for all children */ | ||
934 | if (pid) { | ||
935 | for (i = 0; i < n_children; i++) { | ||
936 | int status; | ||
937 | |||
938 | wait(&status); | ||
939 | EXPECT_EQ(status, 0); | ||
940 | } | ||
941 | |||
942 | return; | ||
943 | } | ||
944 | |||
945 | /* Split threads for reading and writing */ | ||
946 | if (child_id < n_readers) { | ||
947 | size_t left = data * read_bias; | ||
948 | char rb[8001]; | ||
949 | |||
950 | while (left) { | ||
951 | int res; | ||
952 | |||
953 | res = recv(self->cfd, rb, | ||
954 | left > sizeof(rb) ? sizeof(rb) : left, 0); | ||
955 | |||
956 | EXPECT_GE(res, 0); | ||
957 | left -= res; | ||
958 | } | ||
959 | } else { | ||
960 | size_t left = data * write_bias; | ||
961 | |||
962 | while (left) { | ||
963 | int res; | ||
964 | |||
965 | ASSERT_EQ(lseek(fd, 0, SEEK_SET), 0); | ||
966 | if (sendpg) | ||
967 | res = sendfile(self->fd, fd, NULL, | ||
968 | left > file_sz ? file_sz : left); | ||
969 | else | ||
970 | res = send(self->fd, buf, | ||
971 | left > file_sz ? file_sz : left, 0); | ||
972 | |||
973 | EXPECT_GE(res, 0); | ||
974 | left -= res; | ||
975 | } | ||
976 | } | ||
977 | } | ||
978 | |||
979 | TEST_F(tls, mutliproc_even) | ||
980 | { | ||
981 | test_mutliproc(_metadata, self, false, 6, 6); | ||
982 | } | ||
983 | |||
984 | TEST_F(tls, mutliproc_readers) | ||
985 | { | ||
986 | test_mutliproc(_metadata, self, false, 4, 12); | ||
987 | } | ||
988 | |||
989 | TEST_F(tls, mutliproc_writers) | ||
990 | { | ||
991 | test_mutliproc(_metadata, self, false, 10, 2); | ||
992 | } | ||
993 | |||
994 | TEST_F(tls, mutliproc_sendpage_even) | ||
995 | { | ||
996 | test_mutliproc(_metadata, self, true, 6, 6); | ||
997 | } | ||
998 | |||
999 | TEST_F(tls, mutliproc_sendpage_readers) | ||
1000 | { | ||
1001 | test_mutliproc(_metadata, self, true, 4, 12); | ||
1002 | } | ||
1003 | |||
1004 | TEST_F(tls, mutliproc_sendpage_writers) | ||
1005 | { | ||
1006 | test_mutliproc(_metadata, self, true, 10, 2); | ||
1007 | } | ||
1008 | |||
901 | TEST_F(tls, control_msg) | 1009 | TEST_F(tls, control_msg) |
902 | { | 1010 | { |
903 | if (self->notls) | 1011 | if (self->notls) |