Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp2283742rwb; Fri, 11 Nov 2022 07:24:31 -0800 (PST) X-Google-Smtp-Source: AA0mqf5EU+rL6XCioJaMUg+WVLJygRO+5Bfshs1D1haLc62oOLeZtZMx5882Dpe0IoxVDpSu5176 X-Received: by 2002:a17:906:7c5:b0:78d:9f46:5b6 with SMTP id m5-20020a17090607c500b0078d9f4605b6mr2222330ejc.158.1668180264461; Fri, 11 Nov 2022 07:24:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668180264; cv=none; d=google.com; s=arc-20160816; b=Pc5VKGecR9bDMVp6mY+SCapiyaWuENsUqGCPOrNGbXmhnLHC/A0NoT+3RnI+0pfW6v Zf6xJpcy3WcXBFLfirt5b4AzHhGUU0varfnSzWXM7Td3otYK53+lrZ0/zeORSM3SwvZ4 YgJlj6SzlUC8kQ3XFdUQgFCnAMZ8HpDxU+nHXSyLRNNL3jS5Sy1Gl86/06uJzYGXTLOI 8oo62bAbtkIquCwC4BHhnr4/gqb3FpGKEdnBpY06zswKTxb5N0Q+fDOhXOaTnhOqbMHH bMhTBkNW1Uakv23tOpEtNbUfn9NPlfcrJmh0jbHSFPcihGXNnl7qeqcTFPiaZhl93q78 PpJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=pblMlJlKTIR8aJeFOPL5URVyWNBrrDqkWQ8RWbtRpDI=; b=IP504YGNB9d9EIJF+2tX9JzzQeRbzNdiOU/PLkGf3NQOhgcQbT2/eqgNZM8Ikzkvrd ENWBQSZiiv6RDN7BiSL+Exvs/HaM41BxKMS+/ZIKp5oyRfvKbmvdD9Q3gNVq7zqTVNmq riedVQXbEJamQwoDmmbVakS68mHDadGwXc5DbnjlEoWMMpHmrX6mEgbTg47D5PKHWmWO fequnoyi2EKdN9p+FxVbyXJ7cpfaiTLecTPh0frnv24/Vy4FD5ebqDhhjNDltkJCWS9n 0zDVFiW01tGNclO0i7zQt+21rNm1BAQpTCOOaXyvpUzR0xH2lC3AFN1U6ccBZw107W42 6PpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=MReBjSoL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id go32-20020a1709070da000b007ae2299a195si2541003ejc.815.2022.11.11.07.24.01; Fri, 11 Nov 2022 07:24:24 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=MReBjSoL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234614AbiKKOL1 (ORCPT + 92 others); Fri, 11 Nov 2022 09:11:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51294 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234567AbiKKOLA (ORCPT ); Fri, 11 Nov 2022 09:11:00 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CFC91833BD for ; Fri, 11 Nov 2022 06:01:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1668175261; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=pblMlJlKTIR8aJeFOPL5URVyWNBrrDqkWQ8RWbtRpDI=; b=MReBjSoLp4+GGXsSt3bK0l0ULy+YygVO8kap6MumLDDOBBQEdzc+RTC9ISdX9/H9O6pwW/ bpLe1n44Md7BvP150cHPpK4Pk4VSQP4MCNEtfa6G2v4Zsbr8jn88DZkD6kXa1ejXzJwn6H 9qNqoGuduZUOWYpg9RXXVuwlT2jG2q8= Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-592-59CL3yrhNgKaX89_Bcjh8g-1; Fri, 11 Nov 2022 09:00:52 -0500 X-MC-Unique: 59CL3yrhNgKaX89_Bcjh8g-1 Received: by mail-qt1-f200.google.com with SMTP id gc12-20020a05622a59cc00b003a5444280e1so3680295qtb.13 for ; Fri, 11 Nov 2022 06:00:52 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=pblMlJlKTIR8aJeFOPL5URVyWNBrrDqkWQ8RWbtRpDI=; b=ukUtnQy3OJzUwYS+gQUB0nxX4XCHgKlkJfxplNQNEcHusjuPHGXazsOkhNq0fopo8l JJdX3W/jlA3y+glWSQ4eg3MdusTTR48sBENdqrcbnjJlAArQnYwDs1W2sLZjXSUrQCNM l9Dlrpxq/kQtvJfF3UuAdwEqf3ZJFd72yqBsn85O2jJrl7YLutzAecujdnNInraw1tb1 BwBNfTzJ7AgTU6vjCqjEg3CE0iW7GZhq0BM8uSfe0nXjUqBgHa6K9vuDaaLlXY8sje8g Ane6vfwaUvaoe/sRV6WJvO52raxn6z7osG8ADT1ftv9pmyfLCTQb72RJOh9dRiktnx/e s8fg== X-Gm-Message-State: ANoB5plkudBO87ewQ/RbIGpOCzHLzaYkB9pPQwdwUGmg9I5iV/ozLeIc lmAt0MAAjcv3MwD2K8WgLGNp3PaqeByou8iyxAa9kCGj50cF9mGm8gzcdLeomwgts2l5MO3u1Dc PZ523/NM6scFlGIzcOpKsUI/5 X-Received: by 2002:a05:6214:4585:b0:4bc:9d7f:d963 with SMTP id op5-20020a056214458500b004bc9d7fd963mr1855172qvb.83.1668175251447; Fri, 11 Nov 2022 06:00:51 -0800 (PST) X-Received: by 2002:a05:6214:4585:b0:4bc:9d7f:d963 with SMTP id op5-20020a056214458500b004bc9d7fd963mr1855138qvb.83.1668175251158; Fri, 11 Nov 2022 06:00:51 -0800 (PST) Received: from sgarzare-redhat (host-82-53-134-234.retail.telecomitalia.it. [82.53.134.234]) by smtp.gmail.com with ESMTPSA id dm30-20020a05620a1d5e00b006fb3ac7ee59sm1179967qkb.43.2022.11.11.06.00.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Nov 2022 06:00:50 -0800 (PST) Date: Fri, 11 Nov 2022 15:00:40 +0100 From: Stefano Garzarella To: Arseniy Krasnov Cc: Stefan Hajnoczi , "Michael S. Tsirkin" , Jason Wang , "David S. Miller" , "edumazet@google.com" , Jakub Kicinski , Paolo Abeni , Krasnov Arseniy , "linux-kernel@vger.kernel.org" , "kvm@vger.kernel.org" , "virtualization@lists.linux-foundation.org" , "netdev@vger.kernel.org" , kernel Subject: Re: [RFC PATCH v3 08/11] test/vsock: rework message bound test Message-ID: <20221111140040.dpxif3ze446tedqw@sgarzare-redhat> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Nov 06, 2022 at 07:48:56PM +0000, Arseniy Krasnov wrote: >This updates message bound test making it more complex. Instead of >sending 1 bytes messages with one MSG_EOR bit, it sends messages of >random length(one half of messages are smaller than page size, second >half are bigger) with random number of MSG_EOR bits set. Receiver >also don't know total number of messages. > >Signed-off-by: Arseniy Krasnov >--- > tools/testing/vsock/control.c | 34 +++++++++ > tools/testing/vsock/control.h | 2 + > tools/testing/vsock/util.c | 13 ++++ > tools/testing/vsock/util.h | 1 + > tools/testing/vsock/vsock_test.c | 115 +++++++++++++++++++++++++++---- > 5 files changed, 152 insertions(+), 13 deletions(-) > >diff --git a/tools/testing/vsock/control.c b/tools/testing/vsock/control.c >index 4874872fc5a3..bed1649bdf3d 100644 >--- a/tools/testing/vsock/control.c >+++ b/tools/testing/vsock/control.c >@@ -141,6 +141,40 @@ void control_writeln(const char *str) > timeout_end(); > } > >+void control_writeulong(unsigned long value) >+{ >+ char str[32]; >+ >+ if (snprintf(str, sizeof(str), "%lu", value) >= sizeof(str)) { >+ perror("snprintf"); >+ exit(EXIT_FAILURE); >+ } >+ >+ control_writeln(str); >+} >+ >+unsigned long control_readulong(bool *ok) >+{ >+ unsigned long value; >+ char *str; >+ >+ if (ok) >+ *ok = false; >+ >+ str = control_readln(); >+ >+ if (str == NULL) >+ return 0; >+ >+ value = strtoul(str, NULL, 10); >+ free(str); >+ >+ if (ok) >+ *ok = true; >+ >+ return value; >+} >+ > /* Return the next line from the control socket (without the trailing newline). > * > * The program terminates if a timeout occurs. >diff --git a/tools/testing/vsock/control.h b/tools/testing/vsock/control.h >index 51814b4f9ac1..cdd922dfea68 100644 >--- a/tools/testing/vsock/control.h >+++ b/tools/testing/vsock/control.h >@@ -9,7 +9,9 @@ void control_init(const char *control_host, const char *control_port, > void control_cleanup(void); > void control_writeln(const char *str); > char *control_readln(void); >+unsigned long control_readulong(bool *ok); > void control_expectln(const char *str); > bool control_cmpln(char *line, const char *str, bool fail); >+void control_writeulong(unsigned long value); > > #endif /* CONTROL_H */ >diff --git a/tools/testing/vsock/util.c b/tools/testing/vsock/util.c >index 2acbb7703c6a..351903836774 100644 >--- a/tools/testing/vsock/util.c >+++ b/tools/testing/vsock/util.c >@@ -395,3 +395,16 @@ void skip_test(struct test_case *test_cases, size_t test_cases_len, > > test_cases[test_id].skip = true; > } >+ >+unsigned long djb2(const void *data, size_t len) hash_djb2 maybe it's more understandable >+{ >+ unsigned long hash = 5381; >+ int i = 0; >+ >+ while (i < len) { >+ hash = ((hash << 5) + hash) + ((unsigned char *)data)[i]; >+ i++; >+ } >+ >+ return hash; >+} >diff --git a/tools/testing/vsock/util.h b/tools/testing/vsock/util.h >index a3375ad2fb7f..988cc69a4642 100644 >--- a/tools/testing/vsock/util.h >+++ b/tools/testing/vsock/util.h >@@ -49,4 +49,5 @@ void run_tests(const struct test_case *test_cases, > void list_tests(const struct test_case *test_cases); > void skip_test(struct test_case *test_cases, size_t test_cases_len, > const char *test_id_str); >+unsigned long djb2(const void *data, size_t len); > #endif /* UTIL_H */ >diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c >index bb6d691cb30d..107c11165887 100644 >--- a/tools/testing/vsock/vsock_test.c >+++ b/tools/testing/vsock/vsock_test.c >@@ -284,10 +284,14 @@ static void test_stream_msg_peek_server(const struct test_opts *opts) > close(fd); > } > >-#define MESSAGES_CNT 7 >-#define MSG_EOR_IDX (MESSAGES_CNT / 2) >+#define SOCK_BUF_SIZE (2 * 1024 * 1024) >+#define MAX_MSG_SIZE (32 * 1024) >+ > static void test_seqpacket_msg_bounds_client(const struct test_opts *opts) > { >+ unsigned long curr_hash; >+ int page_size; >+ int msg_count; > int fd; > > fd = vsock_seqpacket_connect(opts->peer_cid, 1234); >@@ -296,18 +300,69 @@ static void test_seqpacket_msg_bounds_client(const struct test_opts *opts) > exit(EXIT_FAILURE); > } > >- /* Send several messages, one with MSG_EOR flag */ >- for (int i = 0; i < MESSAGES_CNT; i++) >- send_byte(fd, 1, (i == MSG_EOR_IDX) ? MSG_EOR : 0); >+ /* Wait, until receiver sets buffer size. */ >+ control_expectln("SRVREADY"); >+ >+ curr_hash = 0; >+ page_size = getpagesize(); >+ msg_count = SOCK_BUF_SIZE / MAX_MSG_SIZE; >+ >+ for (int i = 0; i < msg_count; i++) { >+ ssize_t send_size; >+ size_t buf_size; >+ int flags; >+ void *buf; >+ >+ /* Use "small" buffers and "big" buffers. */ >+ if (i & 1) >+ buf_size = page_size + >+ (rand() % (MAX_MSG_SIZE - page_size)); >+ else >+ buf_size = 1 + (rand() % page_size); >+ >+ buf = malloc(buf_size); >+ >+ if (!buf) { >+ perror("malloc"); >+ exit(EXIT_FAILURE); >+ } >+ >+ /* Set at least one MSG_EOR + some random. */ >+ if (i == (msg_count / 2) || (rand() & 1)) { >+ flags = MSG_EOR; >+ curr_hash++; >+ } else { >+ flags = 0; >+ } >+ >+ send_size = send(fd, buf, buf_size, flags); >+ >+ if (send_size < 0) { >+ perror("send"); >+ exit(EXIT_FAILURE); >+ } >+ >+ if (send_size != buf_size) { >+ fprintf(stderr, "Invalid send size\n"); >+ exit(EXIT_FAILURE); >+ } >+ >+ curr_hash += send_size; >+ curr_hash = djb2(&curr_hash, sizeof(curr_hash)); >+ } > > control_writeln("SENDDONE"); >+ control_writeulong(curr_hash); > close(fd); > } > > static void test_seqpacket_msg_bounds_server(const struct test_opts *opts) > { >+ unsigned long sock_buf_size; >+ unsigned long remote_hash; >+ unsigned long curr_hash; > int fd; >- char buf[16]; >+ char buf[MAX_MSG_SIZE]; > struct msghdr msg = {0}; > struct iovec iov = {0}; > >@@ -317,25 +372,58 @@ static void test_seqpacket_msg_bounds_server(const struct test_opts *opts) > exit(EXIT_FAILURE); > } > >+ sock_buf_size = SOCK_BUF_SIZE; >+ >+ if (setsockopt(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_MAX_SIZE, >+ &sock_buf_size, sizeof(sock_buf_size))) { >+ perror("getsockopt"); >+ exit(EXIT_FAILURE); >+ } >+ >+ if (setsockopt(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE, >+ &sock_buf_size, sizeof(sock_buf_size))) { >+ perror("getsockopt"); >+ exit(EXIT_FAILURE); >+ } >+ >+ /* Ready to receive data. */ >+ control_writeln("SRVREADY"); >+ /* Wait, until peer sends whole data. */ > control_expectln("SENDDONE"); > iov.iov_base = buf; > iov.iov_len = sizeof(buf); > msg.msg_iov = &iov; > msg.msg_iovlen = 1; > >- for (int i = 0; i < MESSAGES_CNT; i++) { >- if (recvmsg(fd, &msg, 0) != 1) { >- perror("message bound violated"); >- exit(EXIT_FAILURE); >- } >+ curr_hash = 0; > >- if ((i == MSG_EOR_IDX) ^ !!(msg.msg_flags & MSG_EOR)) { >- perror("MSG_EOR"); >+ while (1) { >+ ssize_t recv_size; >+ >+ recv_size = recvmsg(fd, &msg, 0); >+ >+ if (!recv_size) >+ break; >+ >+ if (recv_size < 0) { >+ perror("recvmsg"); > exit(EXIT_FAILURE); > } >+ >+ if (msg.msg_flags & MSG_EOR) >+ curr_hash++; >+ >+ curr_hash += recv_size; >+ curr_hash = djb2(&curr_hash, sizeof(curr_hash)); > } > > close(fd); >+ remote_hash = control_readulong(NULL); >+ >+ if (curr_hash != remote_hash) { >+ fprintf(stderr, "Message bounds broken\n"); >+ exit(EXIT_FAILURE); >+ } > } > > #define MESSAGE_TRUNC_SZ 32 >@@ -837,6 +925,7 @@ int main(int argc, char **argv) > .peer_cid = VMADDR_CID_ANY, > }; > >+ srand(time(NULL)); > init_signals(); > > for (;;) { >-- >2.35.0