From patchwork Sat Sep 16 13:29:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liang Chen X-Patchwork-Id: 13388415 X-Patchwork-Delegate: kuba@kernel.org Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C537F6134 for ; Sat, 16 Sep 2023 13:30:14 +0000 (UTC) Received: from mail-pg1-x531.google.com (mail-pg1-x531.google.com [IPv6:2607:f8b0:4864:20::531]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7EFA7139 for ; Sat, 16 Sep 2023 06:30:13 -0700 (PDT) Received: by mail-pg1-x531.google.com with SMTP id 41be03b00d2f7-5780040cb81so2127343a12.1 for ; Sat, 16 Sep 2023 06:30:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1694871013; x=1695475813; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=1pGmqeXOoWUx5yrStmRUGR+pBm9HnM3potR2mWJnXSQ=; b=XM5Oi+QimkNu/7YX2xMNrvxE3tCrrnFnRc9Ftl+VSkVlzrwUjmIWwYTFtw8Kd8q0PO PeXzajsN0N3EQD50Q5S0oVZelaxBO5D1tvL+cCWPrdyAoG/KCskkM+n0p3cOf2RLYsS7 WYHt3xHSMaExn44I8OZHbx1Frznos3tbOT411GU1dTNZvroMShWRydqRcV4KAz5Z9UM6 Kvrhrsm/77+kvANNIjaWt6XdBTP8LsmxG89u4ty/v11xT00msVUuzfpwsmUZfCD6l1RC u2oc9Af5fwbkSZ7Aij5HD6Zk5yqbAVLf/dzlx3jfbjsXTFWj3n+N1SxBfbH3fluYZNnw b9wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694871013; x=1695475813; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=1pGmqeXOoWUx5yrStmRUGR+pBm9HnM3potR2mWJnXSQ=; b=b2qyxn7OieGkr2C/A84ifJLe5Ip47KmWBFXW8VzIvxcQw9DomT5lXiAye2jOBKUSEI Pnik+XunM039cWNsAy06/x9pQwkbNYMWF1+hxLA1f8pbLJi12RQUQZWp/3S3nM67muv0 O65XGeDJgYb+ntXYG3/TX+2r5vMLnoLXmJfT+NkVcQFRPwcxhoAI7CIOEs+xCGIk9T/8 swtvY74KJBw9cy9N2atyjs+feB7pa8raLI4L6nSZrhL+rRTPMnQD+SyBB7dmvw3PKn5p cCAliM0xUwI7ys1JHQL3YbJAFMn8HfDg3wq1Z3Dt0brBfo2aVb/yrWmE/1TkcXix1xt9 tcgw== X-Gm-Message-State: AOJu0YwpMhCmc00ZZ3Vo0wTPuWwcern1bg7YJyTUDyt11hIVi+iqAOYN 7q5D9hcE9ojEwFNglZLHbGQ= X-Google-Smtp-Source: AGHT+IGTeEpRWToqzT8pYi/axSUlaqOpPqQXNn6MNljTlWnodx1GGZB5PlX0uVoBq8cbbWoF6nrLNw== X-Received: by 2002:a17:90a:6482:b0:274:945b:6979 with SMTP id h2-20020a17090a648200b00274945b6979mr3896613pjj.16.1694871012798; Sat, 16 Sep 2023 06:30:12 -0700 (PDT) Received: from 192.168.0.123 ([66.150.196.58]) by smtp.googlemail.com with ESMTPSA id nb2-20020a17090b35c200b00274b035246esm1516744pjb.1.2023.09.16.06.30.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Sep 2023 06:30:11 -0700 (PDT) From: Liang Chen To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, benjamin.poirier@gmail.com Cc: netdev@vger.kernel.org, liangchen.linux@gmail.com, Benjamin Poirier Subject: [PATCH net-next v4 1/2] pktgen: Automate flag enumeration for unknown flag handling Date: Sat, 16 Sep 2023 21:29:31 +0800 Message-Id: <20230916132932.361875-1-liangchen.linux@gmail.com> X-Mailer: git-send-email 2.40.1 Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Patchwork-Delegate: kuba@kernel.org When specifying an unknown flag, it will print all available flags. Currently, these flags are provided as fixed strings, which requires manual updates when flags change. Replacing it with automated flag enumeration. Signed-off-by: Liang Chen Signed-off-by: Benjamin Poirier --- Changes from v3: - check "n == IPSEC_SHIFT" instead of string comparison - use snprintf and check that the result does not overrun pkg_dev->result[] - avoid double '\n' at the end - move "return" in the OK case to remove "else" and decrease indent --- net/core/pktgen.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index f56b8d697014..48306a101fd9 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1318,9 +1318,10 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "flag")) { + bool disable = false; __u32 flag; char f[32]; - bool disable = false; + char *end; memset(f, 0, 32); len = strn_len(&user_buffer[i], sizeof(f) - 1); @@ -1332,28 +1333,33 @@ static ssize_t pktgen_if_write(struct file *file, i += len; flag = pktgen_read_flag(f, &disable); - if (flag) { if (disable) pkt_dev->flags &= ~flag; else pkt_dev->flags |= flag; - } else { - sprintf(pg_result, - "Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s", - f, - "IPSRC_RND, IPDST_RND, UDPSRC_RND, UDPDST_RND, " - "MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, " - "MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, " - "QUEUE_MAP_RND, QUEUE_MAP_CPU, UDPCSUM, " - "NO_TIMESTAMP, " -#ifdef CONFIG_XFRM - "IPSEC, " -#endif - "NODE_ALLOC\n"); + + sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); return count; } - sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); + + /* Unknown flag */ + end = pkt_dev->result + sizeof(pkt_dev->result); + pg_result += sprintf(pg_result, + "Flag -:%s:- unknown\n" + "Available flags, (prepend ! to un-set flag):\n", f); + + for (int n = 0; n < NR_PKT_FLAGS && pg_result < end; n++) { + if (!IS_ENABLED(CONFIG_XFRM) && n == IPSEC_SHIFT) + continue; + pg_result += snprintf(pg_result, end - pg_result, + "%s, ", pkt_flag_names[n]); + } + if (!WARN_ON_ONCE(pg_result >= end)) { + /* Remove the comma and whitespace at the end */ + *(pg_result - 2) = '\0'; + } + return count; } if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) { From patchwork Sat Sep 16 13:29:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liang Chen X-Patchwork-Id: 13388416 X-Patchwork-Delegate: kuba@kernel.org Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 826666134 for ; Sat, 16 Sep 2023 13:30:30 +0000 (UTC) Received: from mail-pl1-x62d.google.com (mail-pl1-x62d.google.com [IPv6:2607:f8b0:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F26A7195 for ; Sat, 16 Sep 2023 06:30:28 -0700 (PDT) Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-1c0ecb9a075so25241015ad.2 for ; Sat, 16 Sep 2023 06:30:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1694871028; x=1695475828; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TwtbHP3OKLI1y7l60/751OV11HkNDiexRjAsIQT6S7E=; b=LdwlHORjAsuu4mJyXINqW2JTmzZblUv4p1qsT4B40mlOpROPEveb4yYqG2wgCAVHyw a+RCpBFOZrKqe58jN4ul+iVMpYg8FOyQpaxkKafxEjuH6qJOZkKMqz4za+0AcQgKHZUV Q0uCkj3QNlL6eBmOFjMDOjZTH2AD5A5ZrSoqQeZuZgjk7dmleNNB/VGItQwZ4NHlR8H4 8xiZbIMMGiNZ5kRxzHM61YqAbjuAWoonM6E+i9XZ5GlOhLaXM1qcBi/bJHLhShcSRXbp TdrY4BWvyPLXvaw/F6Z6S2cpEoImxtqS6X2Q9L5l4cW3i+2FKxL3X5FeqEb55HReYcwk X1lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694871028; x=1695475828; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TwtbHP3OKLI1y7l60/751OV11HkNDiexRjAsIQT6S7E=; b=RL70J0BfsGlEsIMWp9Ae3Z+PggvMm3RszzEB7+yydQ7DAYFA+BH4wln1KKOUUR9PZB dcm+ptWc3k0IdjdTXq65i5iVD0F5S70e93BZBGVceDMP5FQRjSlAU0pI3ch7JN8R1xmT h6kn8pYMnjQQ3eHFbM0LPfDTQ/ov+Sjr9oR8Y7OfpuhEy8VrFMSYh+tQn7b9QbdYO07F XragMcEpQot9fM6DxmS1qJJM75fN4PBRSS6ps8vrfEIgiOFVoSeRHIoABUKe1NtLFKcb IZFtFy7mZO9H7P6L1NN8CxfR3UtEDMvAtQMcJqowyv9Btia41V+vN8zqPkbRp4BQ6a47 fNJA== X-Gm-Message-State: AOJu0YyCffDiz5e+ogULaRlfsxXRGjLtSZvOMy4IbsbrGzErtI64CiiP r50C8tDXZwUo3v+nccf4lGg= X-Google-Smtp-Source: AGHT+IGof6kpHsZtVctriLlDY+dVVX/2JQvk7do8+YdbU4h2QV/bLhGwe7aUYn01irCBnKJBmOXI1w== X-Received: by 2002:a17:90a:bf90:b0:26d:262e:70be with SMTP id d16-20020a17090abf9000b0026d262e70bemr3395620pjs.22.1694871028376; Sat, 16 Sep 2023 06:30:28 -0700 (PDT) Received: from 192.168.0.123 ([66.150.196.58]) by smtp.googlemail.com with ESMTPSA id nb2-20020a17090b35c200b00274b035246esm1516744pjb.1.2023.09.16.06.30.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Sep 2023 06:30:27 -0700 (PDT) From: Liang Chen To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, benjamin.poirier@gmail.com Cc: netdev@vger.kernel.org, liangchen.linux@gmail.com Subject: [PATCH net-next v4 2/2] pktgen: Introducing 'SHARED' flag for testing with non-shared skb Date: Sat, 16 Sep 2023 21:29:32 +0800 Message-Id: <20230916132932.361875-2-liangchen.linux@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230916132932.361875-1-liangchen.linux@gmail.com> References: <20230916132932.361875-1-liangchen.linux@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Patchwork-Delegate: kuba@kernel.org Currently, skbs generated by pktgen always have their reference count incremented before transmission, causing their reference count to be always greater than 1, leading to two issues: 1. Only the code paths for shared skbs can be tested. 2. In certain situations, skbs can only be released by pktgen. To enhance testing comprehensiveness, we are introducing the "SHARED" flag to indicate whether an SKB is shared. This flag is enabled by default, aligning with the current behavior. However, disabling this flag allows skbs with a reference count of 1 to be transmitted. So we can test non-shared skbs and code paths where skbs are released within the stack. Signed-off-by: Liang Chen Reviewed-by: Benjamin Poirier --- Documentation/networking/pktgen.rst | 12 ++++++++ net/core/pktgen.c | 48 ++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/Documentation/networking/pktgen.rst b/Documentation/networking/pktgen.rst index 1225f0f63ff0..c945218946e1 100644 --- a/Documentation/networking/pktgen.rst +++ b/Documentation/networking/pktgen.rst @@ -178,6 +178,7 @@ Examples:: IPSEC # IPsec encapsulation (needs CONFIG_XFRM) NODE_ALLOC # node specific memory allocation NO_TIMESTAMP # disable timestamping + SHARED # enable shared SKB pgset 'flag ![name]' Clear a flag to determine behaviour. Note that you might need to use single quote in interactive mode, so that your shell wouldn't expand @@ -288,6 +289,16 @@ To avoid breaking existing testbed scripts for using AH type and tunnel mode, you can use "pgset spi SPI_VALUE" to specify which transformation mode to employ. +Disable shared SKB +================== +By default, SKBs sent by pktgen are shared (user count > 1). +To test with non-shared SKBs, remove the "SHARED" flag by simply setting:: + + pg_set "flag !SHARED" + +However, if the "clone_skb" or "burst" parameters are configured, the skb +still needs to be held by pktgen for further access. Hence the skb must be +shared. Current commands and configuration options ========================================== @@ -357,6 +368,7 @@ Current commands and configuration options IPSEC NODE_ALLOC NO_TIMESTAMP + SHARED spi (ipsec) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 48306a101fd9..c4e0814df325 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -200,6 +200,7 @@ pf(VID_RND) /* Random VLAN ID */ \ pf(SVID_RND) /* Random SVLAN ID */ \ pf(NODE) /* Node memory alloc*/ \ + pf(SHARED) /* Shared SKB */ \ #define pf(flag) flag##_SHIFT, enum pkt_flags { @@ -1198,7 +1199,8 @@ static ssize_t pktgen_if_write(struct file *file, ((pkt_dev->xmit_mode == M_NETIF_RECEIVE) || !(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))) return -ENOTSUPP; - if (value > 0 && pkt_dev->n_imix_entries > 0) + if (value > 0 && (pkt_dev->n_imix_entries > 0 || + !(pkt_dev->flags & F_SHARED))) return -EINVAL; i += len; @@ -1257,6 +1259,10 @@ static ssize_t pktgen_if_write(struct file *file, ((pkt_dev->xmit_mode == M_START_XMIT) && (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))))) return -ENOTSUPP; + + if (value > 1 && !(pkt_dev->flags & F_SHARED)) + return -EINVAL; + pkt_dev->burst = value < 1 ? 1 : value; sprintf(pg_result, "OK: burst=%u", pkt_dev->burst); return count; @@ -1334,10 +1340,19 @@ static ssize_t pktgen_if_write(struct file *file, flag = pktgen_read_flag(f, &disable); if (flag) { - if (disable) + if (disable) { + /* If "clone_skb", or "burst" parameters are + * configured, it means that the skb still + * needs to be referenced by the pktgen, so + * the skb must be shared. + */ + if (flag == F_SHARED && (pkt_dev->clone_skb || + pkt_dev->burst > 1)) + return -EINVAL; pkt_dev->flags &= ~flag; - else + } else { pkt_dev->flags |= flag; + } sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); return count; @@ -3489,7 +3504,8 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) if (pkt_dev->xmit_mode == M_NETIF_RECEIVE) { skb = pkt_dev->skb; skb->protocol = eth_type_trans(skb, skb->dev); - refcount_add(burst, &skb->users); + if (pkt_dev->flags & F_SHARED) + refcount_add(burst, &skb->users); local_bh_disable(); do { ret = netif_receive_skb(skb); @@ -3497,6 +3513,10 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) pkt_dev->errors++; pkt_dev->sofar++; pkt_dev->seq_num++; + if (unlikely(!(pkt_dev->flags & F_SHARED))) { + pkt_dev->skb = NULL; + break; + } if (refcount_read(&skb->users) != burst) { /* skb was queued by rps/rfs or taps, * so cannot reuse this skb @@ -3515,9 +3535,14 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) goto out; /* Skips xmit_mode M_START_XMIT */ } else if (pkt_dev->xmit_mode == M_QUEUE_XMIT) { local_bh_disable(); - refcount_inc(&pkt_dev->skb->users); + if (pkt_dev->flags & F_SHARED) + refcount_inc(&pkt_dev->skb->users); ret = dev_queue_xmit(pkt_dev->skb); + + if (!(pkt_dev->flags & F_SHARED) && dev_xmit_complete(ret)) + pkt_dev->skb = NULL; + switch (ret) { case NET_XMIT_SUCCESS: pkt_dev->sofar++; @@ -3555,11 +3580,15 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) pkt_dev->last_ok = 0; goto unlock; } - refcount_add(burst, &pkt_dev->skb->users); + if (pkt_dev->flags & F_SHARED) + refcount_add(burst, &pkt_dev->skb->users); xmit_more: ret = netdev_start_xmit(pkt_dev->skb, odev, txq, --burst > 0); + if (!(pkt_dev->flags & F_SHARED) && dev_xmit_complete(ret)) + pkt_dev->skb = NULL; + switch (ret) { case NETDEV_TX_OK: pkt_dev->last_ok = 1; @@ -3581,7 +3610,8 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) fallthrough; case NETDEV_TX_BUSY: /* Retry it next time */ - refcount_dec(&(pkt_dev->skb->users)); + if (pkt_dev->flags & F_SHARED) + refcount_dec(&pkt_dev->skb->users); pkt_dev->last_ok = 0; } if (unlikely(burst)) @@ -3594,7 +3624,8 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) /* If pkt_dev->count is zero, then run forever */ if ((pkt_dev->count != 0) && (pkt_dev->sofar >= pkt_dev->count)) { - pktgen_wait_for_skb(pkt_dev); + if (pkt_dev->skb) + pktgen_wait_for_skb(pkt_dev); /* Done with this */ pktgen_stop_device(pkt_dev); @@ -3777,6 +3808,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) pkt_dev->svlan_id = 0xffff; pkt_dev->burst = 1; pkt_dev->node = NUMA_NO_NODE; + pkt_dev->flags = F_SHARED; /* SKB shared by default */ err = pktgen_setup_dev(t->net, pkt_dev, ifname); if (err)