From patchwork Mon Mar 12 19:24:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Fastabend X-Patchwork-Id: 884805 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400SbK5GJ9z9sBq for ; Tue, 13 Mar 2018 06:24:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932356AbeCLTYL (ORCPT ); Mon, 12 Mar 2018 15:24:11 -0400 Received: from [75.106.27.153] ([75.106.27.153]:59598 "EHLO john-Precision-Tower-5810" rhost-flags-FAIL-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S932333AbeCLTYJ (ORCPT ); Mon, 12 Mar 2018 15:24:09 -0400 Received: from [127.0.1.1] (localhost [127.0.0.1]) by john-Precision-Tower-5810 (Postfix) with ESMTP id C60D1D44305; Mon, 12 Mar 2018 12:24:05 -0700 (PDT) Subject: [bpf-next PATCH v2 12/18] bpf: sockmap sample, add sendfile test From: John Fastabend To: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, davejwatson@fb.com Cc: netdev@vger.kernel.org Date: Mon, 12 Mar 2018 12:24:05 -0700 Message-ID: <20180312192405.8039.14734.stgit@john-Precision-Tower-5810> In-Reply-To: <20180312192034.8039.70022.stgit@john-Precision-Tower-5810> References: <20180312192034.8039.70022.stgit@john-Precision-Tower-5810> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org To exercise TX ULP sendpage implementation we need a test that does a sendfile. Add sendfile test option here. Signed-off-by: John Fastabend Acked-by: David S. Miller --- samples/sockmap/sockmap_user.c | 70 ++++++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/samples/sockmap/sockmap_user.c b/samples/sockmap/sockmap_user.c index bbfe3a2..ec624a8 100644 --- a/samples/sockmap/sockmap_user.c +++ b/samples/sockmap/sockmap_user.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -67,10 +68,10 @@ {"iov_count", required_argument, NULL, 'i' }, {"length", required_argument, NULL, 'l' }, {"test", required_argument, NULL, 't' }, - {"txmsg", no_argument, &txmsg_pass, 1 }, - {"txmsg_noisy", no_argument, &txmsg_noisy, 1 }, - {"txmsg_redir", no_argument, &txmsg_redir, 1 }, - {"txmsg_redir_noisy", no_argument, &txmsg_redir_noisy, 1}, + {"txmsg", no_argument, &txmsg_pass, 1 }, + {"txmsg_noisy", no_argument, &txmsg_noisy, 1 }, + {"txmsg_redir", no_argument, &txmsg_redir, 1 }, + {"txmsg_redir_noisy", no_argument, &txmsg_redir_noisy, 1}, {0, 0, NULL, 0 } }; @@ -204,6 +205,35 @@ struct msg_stats { struct timespec end; }; +static int msg_loop_sendpage(int fd, int iov_length, int cnt, + struct msg_stats *s) +{ + off_t offset = 0; + FILE *file; + int i, fp; + + file = fopen(".sendpage_tst.tmp", "w+"); + fseek(file, iov_length * cnt, SEEK_CUR); + fprintf(file, "A"); + fseek(file, 0, SEEK_SET); + + fp = fileno(file); + clock_gettime(CLOCK_MONOTONIC, &s->start); + for (i = 0; i < cnt; i++) { + int sent = sendfile(fd, fp, &offset, iov_length); + + if (sent < 0) { + perror("send loop error:"); + fclose(file); + return sent; + } + s->bytes_sent += sent; + } + clock_gettime(CLOCK_MONOTONIC, &s->end); + fclose(file); + return 0; +} + static int msg_loop(int fd, int iov_count, int iov_length, int cnt, struct msg_stats *s, bool tx) { @@ -309,7 +339,7 @@ static inline float recvdBps(struct msg_stats s) } static int sendmsg_test(int iov_count, int iov_buf, int cnt, - int verbose, bool base) + int verbose, bool base, bool sendpage) { float sent_Bps = 0, recvd_Bps = 0; int rx_fd, txpid, rxpid, err = 0; @@ -325,6 +355,8 @@ static int sendmsg_test(int iov_count, int iov_buf, int cnt, rxpid = fork(); if (rxpid == 0) { + if (sendpage) + iov_count = 1; err = msg_loop(rx_fd, iov_count, iov_buf, cnt, &s, false); if (err) fprintf(stderr, @@ -348,7 +380,11 @@ static int sendmsg_test(int iov_count, int iov_buf, int cnt, txpid = fork(); if (txpid == 0) { - err = msg_loop(c1, iov_count, iov_buf, cnt, &s, true); + if (sendpage) + err = msg_loop_sendpage(c1, iov_buf, cnt, &s); + else + err = msg_loop(c1, iov_count, iov_buf, cnt, &s, true); + if (err) fprintf(stderr, "msg_loop_tx: iov_count %i iov_buf %i cnt %i err %i\n", @@ -452,6 +488,8 @@ enum { PING_PONG, SENDMSG, BASE, + BASE_SENDPAGE, + SENDPAGE, }; int main(int argc, char **argv) @@ -494,6 +532,10 @@ int main(int argc, char **argv) test = SENDMSG; } else if (strcmp(optarg, "base") == 0) { test = BASE; + } else if (strcmp(optarg, "base_sendpage") == 0) { + test = BASE_SENDPAGE; + } else if (strcmp(optarg, "sendpage") == 0) { + test = SENDPAGE; } else { usage(argv); return -1; @@ -533,7 +575,7 @@ int main(int argc, char **argv) } /* If base test skip BPF setup */ - if (test == BASE) + if (test == BASE || test == BASE_SENDPAGE) goto run; /* Attach programs to sockmap */ @@ -599,7 +641,7 @@ int main(int argc, char **argv) err, strerror(errno)); return err; } - if (test == SENDMSG) + if (txmsg_redir || txmsg_redir_noisy) redir_fd = c2; else redir_fd = c1; @@ -615,9 +657,17 @@ int main(int argc, char **argv) if (test == PING_PONG) err = forever_ping_pong(rate, verbose); else if (test == SENDMSG) - err = sendmsg_test(iov_count, length, rate, verbose, false); + err = sendmsg_test(iov_count, length, rate, + verbose, false, false); + else if (test == SENDPAGE) + err = sendmsg_test(iov_count, length, rate, + verbose, false, true); else if (test == BASE) - err = sendmsg_test(iov_count, length, rate, verbose, true); + err = sendmsg_test(iov_count, length, rate, + verbose, true, false); + else if (test == BASE_SENDPAGE) + err = sendmsg_test(iov_count, length, rate, + verbose, true, true); else fprintf(stderr, "unknown test\n"); out: