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>
This commit is contained in:
parent
79ffe6087e
commit
41098af59d
|
@ -898,6 +898,114 @@ TEST_F(tls, nonblocking)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_mutliproc(struct __test_metadata *_metadata, struct _test_data_tls *self,
|
||||||
|
bool sendpg, unsigned int n_readers, unsigned int n_writers)
|
||||||
|
{
|
||||||
|
const unsigned int n_children = n_readers + n_writers;
|
||||||
|
const size_t data = 6 * 1000 * 1000;
|
||||||
|
const size_t file_sz = data / 100;
|
||||||
|
size_t read_bias, write_bias;
|
||||||
|
int i, fd, child_id;
|
||||||
|
char buf[file_sz];
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
/* Only allow multiples for simplicity */
|
||||||
|
ASSERT_EQ(!(n_readers % n_writers) || !(n_writers % n_readers), true);
|
||||||
|
read_bias = n_writers / n_readers ?: 1;
|
||||||
|
write_bias = n_readers / n_writers ?: 1;
|
||||||
|
|
||||||
|
/* prep a file to send */
|
||||||
|
fd = open("/tmp/", O_TMPFILE | O_RDWR, 0600);
|
||||||
|
ASSERT_GE(fd, 0);
|
||||||
|
|
||||||
|
memset(buf, 0xac, file_sz);
|
||||||
|
ASSERT_EQ(write(fd, buf, file_sz), file_sz);
|
||||||
|
|
||||||
|
/* spawn children */
|
||||||
|
for (child_id = 0; child_id < n_children; child_id++) {
|
||||||
|
pid = fork();
|
||||||
|
ASSERT_NE(pid, -1);
|
||||||
|
if (!pid)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parent waits for all children */
|
||||||
|
if (pid) {
|
||||||
|
for (i = 0; i < n_children; i++) {
|
||||||
|
int status;
|
||||||
|
|
||||||
|
wait(&status);
|
||||||
|
EXPECT_EQ(status, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Split threads for reading and writing */
|
||||||
|
if (child_id < n_readers) {
|
||||||
|
size_t left = data * read_bias;
|
||||||
|
char rb[8001];
|
||||||
|
|
||||||
|
while (left) {
|
||||||
|
int res;
|
||||||
|
|
||||||
|
res = recv(self->cfd, rb,
|
||||||
|
left > sizeof(rb) ? sizeof(rb) : left, 0);
|
||||||
|
|
||||||
|
EXPECT_GE(res, 0);
|
||||||
|
left -= res;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
size_t left = data * write_bias;
|
||||||
|
|
||||||
|
while (left) {
|
||||||
|
int res;
|
||||||
|
|
||||||
|
ASSERT_EQ(lseek(fd, 0, SEEK_SET), 0);
|
||||||
|
if (sendpg)
|
||||||
|
res = sendfile(self->fd, fd, NULL,
|
||||||
|
left > file_sz ? file_sz : left);
|
||||||
|
else
|
||||||
|
res = send(self->fd, buf,
|
||||||
|
left > file_sz ? file_sz : left, 0);
|
||||||
|
|
||||||
|
EXPECT_GE(res, 0);
|
||||||
|
left -= res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(tls, mutliproc_even)
|
||||||
|
{
|
||||||
|
test_mutliproc(_metadata, self, false, 6, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(tls, mutliproc_readers)
|
||||||
|
{
|
||||||
|
test_mutliproc(_metadata, self, false, 4, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(tls, mutliproc_writers)
|
||||||
|
{
|
||||||
|
test_mutliproc(_metadata, self, false, 10, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(tls, mutliproc_sendpage_even)
|
||||||
|
{
|
||||||
|
test_mutliproc(_metadata, self, true, 6, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(tls, mutliproc_sendpage_readers)
|
||||||
|
{
|
||||||
|
test_mutliproc(_metadata, self, true, 4, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(tls, mutliproc_sendpage_writers)
|
||||||
|
{
|
||||||
|
test_mutliproc(_metadata, self, true, 10, 2);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(tls, control_msg)
|
TEST_F(tls, control_msg)
|
||||||
{
|
{
|
||||||
if (self->notls)
|
if (self->notls)
|
||||||
|
|
Loading…
Reference in New Issue