From patchwork Fri Jan 12 05:06:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Fastabend X-Patchwork-Id: 859504 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; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UrirvagM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zHrMc751Wz9t2l for ; Fri, 12 Jan 2018 16:07:08 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754210AbeALFHG (ORCPT ); Fri, 12 Jan 2018 00:07:06 -0500 Received: from mail-pf0-f193.google.com ([209.85.192.193]:38256 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754125AbeALFHF (ORCPT ); Fri, 12 Jan 2018 00:07:05 -0500 Received: by mail-pf0-f193.google.com with SMTP id k19so3614578pfj.5 for ; Thu, 11 Jan 2018 21:07:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:cc:date:message-id:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=guMvw2lzAwXrREUbNntvldVyJ75Z5/ta4TJ9MI7fkWQ=; b=UrirvagM+ySb1pSSho//XMTZsDEZu1p0oRMjkArcHGWnaW5ltgWlakHtPhNR0R74uW 4361Tz+sRCENYgeVGX3FhqYBj+XkHW/frfs1mWxvdwp9BkAR9w4siB+xHnDzbTJOGjlw sek8Mvc8gQwafiD/zkGjNUU6ABC66rS7LZG0cl6bkPVgbfbdtJ8p+Ek9aTQEcoRMxUUE YBBqkUnb21u0fQwe63e2qKEAkYxdb9nPyTSju+Yh30D/7BEWozFMNnkJ9HcNJomxMgAs V5Hsp/t4pSmMLTHb10TND2PSJLFSX21iNKlHfUJu+gX8Ufg5DAoU28nMaJJqJSLbSY0P cMRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:date:message-id:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=guMvw2lzAwXrREUbNntvldVyJ75Z5/ta4TJ9MI7fkWQ=; b=XZX3R9k5Sykf4KjkGFtQV5DRj3Ez4KCfFy6ia70fSDVLncOaPjBIBTHolgGoFnM/9M UQQ1Fydgt+/t0uDevuj2gOCNfztLNX5b1+d9xgXpc9+Ye2mj/BahVI8CP2EKhDWd7xT9 2Nztqc6MJjfDyXprNfuT05g5Se2hqa46YeA6/9OivC2a0CNcqHjGLYNICkeV/xhurldy 3YTr3Qs1C3o6Z2m43+rZbkSQCnwwRNpjewWZrtMv4LdoyRCr/llgEJgriiK0WXApY5+9 +qrasCtaeh3He4M+yhRYduhVTCnypTaTOXslWZIGvRmAR6/blBoHvR/Uq8bw23rEF5qw tPjQ== X-Gm-Message-State: AKGB3mI9p9yO8hEW5ErLDP1KImaLQOK4rOaJ8pzaPTBunlxcb4DzI1XP hq2Cx5ZQ4aRGhfCssRbFXf/umw== X-Google-Smtp-Source: ACJfBouWdwhX3eYQdYTqLx7iHXYy9xEHUoMzAegGE+sWCppv+oN8wQWCg5GmIUzSthPc6vK/2/qyyw== X-Received: by 10.84.137.169 with SMTP id 38mr25400357pln.246.1515733624893; Thu, 11 Jan 2018 21:07:04 -0800 (PST) Received: from [127.0.1.1] ([75.106.27.153]) by smtp.gmail.com with ESMTPSA id m22sm42965878pfg.120.2018.01.11.21.06.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 Jan 2018 21:07:04 -0800 (PST) Subject: [bpf-next PATCH v3 3/7] bpf: sockmap sample, use fork() for send and recv From: John Fastabend To: borkmann@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com Cc: netdev@vger.kernel.org Date: Thu, 11 Jan 2018 21:06:54 -0800 Message-ID: <20180112050654.5823.91255.stgit@john-Precision-Tower-5810> In-Reply-To: <20180112050243.5823.85987.stgit@john-Precision-Tower-5810> References: <20180112050243.5823.85987.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 Currently for SENDMSG tests first send completes then recv runs. This does not work well for large data sizes and/or many iterations. So fork the recv and send handler so that we run both send and recv. In the future we can add a parameter to do more than a single fork of tx/rx. With this we can get many GBps of data which helps exercise the sockmap code. Signed-off-by: John Fastabend Acked-by: Martin KaFai Lau Acked-by: Martin KaFai Lau --- samples/sockmap/sockmap_user.c | 58 +++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/samples/sockmap/sockmap_user.c b/samples/sockmap/sockmap_user.c index 8ec7dbf..bbe9587 100644 --- a/samples/sockmap/sockmap_user.c +++ b/samples/sockmap/sockmap_user.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -195,7 +196,7 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, { struct msghdr msg = {0}; struct iovec *iov; - int i, flags = 0; + int i, flags = MSG_NOSIGNAL; iov = calloc(iov_count, sizeof(struct iovec)); if (!iov) @@ -274,25 +275,50 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, static int sendmsg_test(int iov_count, int iov_buf, int cnt, int verbose) { + int txpid, rxpid, err = 0; struct msg_stats s = {0}; - int err; - - 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", - iov_count, iov_buf, cnt, err); - return err; + int status; + + errno = 0; + + rxpid = fork(); + if (rxpid == 0) { + err = msg_loop(p2, iov_count, iov_buf, cnt, &s, false); + if (err) + fprintf(stderr, + "msg_loop_rx: iov_count %i iov_buf %i cnt %i err %i\n", + iov_count, iov_buf, cnt, err); + fprintf(stdout, "rx_sendmsg: TX_bytes %zu RX_bytes %zu\n", + s.bytes_sent, s.bytes_recvd); + shutdown(p2, SHUT_RDWR); + shutdown(p1, SHUT_RDWR); + exit(1); + } else if (rxpid == -1) { + perror("msg_loop_rx: "); + return errno; } - msg_loop(p2, iov_count, iov_buf, cnt, &s, false); - if (err) - fprintf(stderr, - "msg_loop_rx: iov_count %i iov_buf %i cnt %i err %i\n", - iov_count, iov_buf, cnt, err); + txpid = fork(); + if (txpid == 0) { + 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", + iov_count, iov_buf, cnt, err); + fprintf(stdout, "tx_sendmsg: TX_bytes %zu RX_bytes %zu\n", + s.bytes_sent, s.bytes_recvd); + shutdown(c1, SHUT_RDWR); + exit(1); + } else if (txpid == -1) { + perror("msg_loop_tx: "); + return errno; + } - fprintf(stdout, "sendmsg: TX_bytes %zu RX_bytes %zu\n", - s.bytes_sent, s.bytes_recvd); + assert(waitpid(rxpid, &status, 0) == rxpid); + if (!txpid) + goto out; + assert(waitpid(txpid, &status, 0) == txpid); +out: return err; }