From patchwork Thu Feb 8 19:05:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 136563 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id EBA5043AB4; Thu, 8 Feb 2024 20:08:43 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4A1DB42E61; Thu, 8 Feb 2024 20:08:34 +0100 (CET) Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) by mails.dpdk.org (Postfix) with ESMTP id 18F1B402D1 for ; Thu, 8 Feb 2024 20:08:31 +0100 (CET) Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-6e07532ff1aso156529b3a.1 for ; Thu, 08 Feb 2024 11:08:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1707419310; x=1708024110; darn=dpdk.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=klwclTwCg/MXy6mC0AM+H8Mght/ByiOBM7aYphZ4FYI=; b=odLPNq+efjHe6Yd/VJGYB05O1n6WLQFe5y1RCOUvsii+AkTw1dVrOviwj/wqlTC1yf SLcPWfoklKzqp1H6uhnwAVQ/m1/AcHlMzntMqdqwoPNNfXT9FbksffeVwS9qRW5DRh26 0ONy+xoV9/MHsrl5LT9JzWL7aV2TAhv26ZN/42AOASRv+h9Ctp3UOJhQKtLVuC7cRv7r FwJtnGk3lNHLFS79EuZSRnRlzRgfOmk3CkV6FfX6JkxMMxcZp/VRIXc8KvYmrMcdFf4X 0zLtmUY2JGJyLG4f3fF9/lqyQkx1Jg4fVq8B0HTeSQjBTMy/WODHLFda+q6KrCaVRoY1 uXKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707419310; x=1708024110; 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=klwclTwCg/MXy6mC0AM+H8Mght/ByiOBM7aYphZ4FYI=; b=inrBArRkg0Q3jguRJjEum6c0WNqmD8OII4zE4jgNmMZtW312KXxNlwVTgkzI7IAszQ kz3Gdba6/tgU1RkLVzeP4P0ZiHqLgU7XxYc4gygcndMskp7RiBntGyPPW8WauX49n4+7 A+wNHZD4Zits4lUhErUY18lEyQKO7pkzAp/KtRBxTk0P+0B5Qj3bsX2nBcOAFNRY+5ak W9yQkcTNvG9NNFU7dsGptyP3OtgrGT7HbH1vcVdYWX0m7uwNB/MqSimYN3eIsqNEewBe v9yBrAFGB1XSoO/llgddB1bJYuc5JO2fZnooZ01JFUMVXocx+5Mnrf5Mf7v11Ds8uYOJ S4uw== X-Gm-Message-State: AOJu0YwXp9SMf9cfCQHB48Mn10PSNI6cFyBF/M6rzqALyYK80AoNTdM5 FeK5XvBhN+j46cKoOwtJinWwU8eLHvUaCMszXbeBbplPCpSd/5On7BKnkQ0JG2myWqgzr993uTU ZWuM= X-Google-Smtp-Source: AGHT+IHNjyhaLVr6sz8TtgsnWcoTdpryP1dWfK5Z7OlrlLJvxe9M7208sgcO0nP89pqIaia9a2Nl5A== X-Received: by 2002:a05:6a00:1d28:b0:6dd:dc11:8dc2 with SMTP id a40-20020a056a001d2800b006dddc118dc2mr166036pfx.31.1707419310258; Thu, 08 Feb 2024 11:08:30 -0800 (PST) Received: from hermes.lan (204-195-123-141.wavecable.com. [204.195.123.141]) by smtp.gmail.com with ESMTPSA id z1-20020aa79901000000b006e053e98e1csm79951pff.136.2024.02.08.11.08.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Feb 2024 11:08:29 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Subject: [PATCH v4 2/7] net/tap: validate and setup parameters for BPF RSS Date: Thu, 8 Feb 2024 11:05:50 -0800 Message-ID: <20240208190827.332368-3-stephen@networkplumber.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240208190827.332368-1-stephen@networkplumber.org> References: <20240130034925.44869-1-stephen@networkplumber.org> <20240208190827.332368-1-stephen@networkplumber.org> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The flow RSS support via BPF was not using the key, or hash type parameters. Which is good because they were never properly setup. Fix the setup and validate the flow parameters, the BPF side gets fixed later. Signed-off-by: Stephen Hemminger --- drivers/net/tap/tap_bpf_insns.h | 16 ++++---- drivers/net/tap/tap_flow.c | 65 ++++++++++++++++++++++++++++++--- drivers/net/tap/tap_rss.h | 5 +-- 3 files changed, 70 insertions(+), 16 deletions(-) diff --git a/drivers/net/tap/tap_bpf_insns.h b/drivers/net/tap/tap_bpf_insns.h index 53fa76c4e6b0..ee26cf885ed7 100644 --- a/drivers/net/tap/tap_bpf_insns.h +++ b/drivers/net/tap/tap_bpf_insns.h @@ -1709,13 +1709,13 @@ static struct bpf_insn l3_l4_hash_insns[] = { {0x57, 1, 0, 0, 0x00000001}, {0x15, 1, 0, 1, 0x00000000}, {0xa7, 3, 0, 0, 0xfe0fee15}, - {0x71, 1, 0, 201, 0x00000000}, + {0x71, 1, 0, 45, 0x00000000}, {0x67, 1, 0, 0, 0x00000008}, - {0x71, 2, 0, 200, 0x00000000}, + {0x71, 2, 0, 44, 0x00000000}, {0x4f, 1, 2, 0, 0x00000000}, - {0x71, 2, 0, 202, 0x00000000}, + {0x71, 2, 0, 46, 0x00000000}, {0x67, 2, 0, 0, 0x00000010}, - {0x71, 4, 0, 203, 0x00000000}, + {0x71, 4, 0, 47, 0x00000000}, {0x67, 4, 0, 0, 0x00000018}, {0x4f, 4, 2, 0, 0x00000000}, {0x4f, 4, 1, 0, 0x00000000}, @@ -1725,13 +1725,13 @@ static struct bpf_insn l3_l4_hash_insns[] = { {0x57, 3, 0, 0, 0x0000000f}, {0x67, 3, 0, 0, 0x00000002}, {0x0f, 0, 3, 0, 0x00000000}, - {0x71, 1, 0, 137, 0x00000000}, + {0x71, 1, 0, 49, 0x00000000}, {0x67, 1, 0, 0, 0x00000008}, - {0x71, 2, 0, 136, 0x00000000}, + {0x71, 2, 0, 48, 0x00000000}, {0x4f, 1, 2, 0, 0x00000000}, - {0x71, 2, 0, 138, 0x00000000}, + {0x71, 2, 0, 50, 0x00000000}, {0x67, 2, 0, 0, 0x00000010}, - {0x71, 3, 0, 139, 0x00000000}, + {0x71, 3, 0, 51, 0x00000000}, {0x67, 3, 0, 0, 0x00000018}, {0x4f, 3, 2, 0, 0x00000000}, {0x4f, 3, 1, 0, 0x00000000}, diff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c index ed4d42f92f9f..cd49aa51c8b0 100644 --- a/drivers/net/tap/tap_flow.c +++ b/drivers/net/tap/tap_flow.c @@ -11,8 +11,10 @@ #include #include +#include #include #include + #include #include #include @@ -2053,6 +2055,21 @@ static int bpf_rss_key(enum bpf_rss_key_e cmd, __u32 *key_idx) return err; } + +/* Default RSS hash key also used by mlx devices */ +static const uint8_t rss_hash_default_key[] = { + 0x2c, 0xc6, 0x81, 0xd1, + 0x5b, 0xdb, 0xf4, 0xf7, + 0xfc, 0xa2, 0x83, 0x19, + 0xdb, 0x1a, 0x3e, 0x94, + 0x6b, 0x9e, 0x38, 0xd9, + 0x2c, 0x9c, 0x03, 0xd1, + 0xad, 0x99, 0x44, 0xa7, + 0xd9, 0x56, 0x3d, 0x59, + 0x06, 0x3c, 0x25, 0xf3, + 0xfc, 0x1f, 0xdc, 0x2a, +}; + /** * Add RSS hash calculations and queue selection * @@ -2071,11 +2088,11 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd, const struct rte_flow_action_rss *rss, struct rte_flow_error *error) { - /* 4096 is the maximum number of instructions for a BPF program */ + struct rss_key rss_entry = { }; + const uint8_t *key_in; + uint32_t hash_type = 0; unsigned int i; int err; - struct rss_key rss_entry = { .hash_fields = 0, - .key_size = 0 }; /* Check supported RSS features */ if (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT) @@ -2087,6 +2104,41 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd, (error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, "a nonzero RSS encapsulation level is not supported"); + if (rss->queue_num == 0 || rss->queue_num >= TAP_MAX_QUEUES) + return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "invalid number of queues"); + + /* allow RSS key_len 0 in case of NULL (default) RSS key. */ + if (rss->key_len == 0) { + if (rss->key != NULL) + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION_CONF, + &rss->key_len, "RSS hash key length 0"); + key_in = rss_hash_default_key; + } else { + if (rss->key_len != TAP_RSS_HASH_KEY_SIZE) + return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, "RSS hash invalid key length"); + if (rss->key == NULL) + return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, "RSS hash key is NULL"); + key_in = rss->key; + } + + if (rss->types & TAP_RSS_HF_MASK) + return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, "RSS hash type not supported"); + + if (rss->types & (RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_NONFRAG_IPV4_TCP)) + hash_type |= RTE_BIT32(HASH_FIELD_IPV4_L3_L4); + else if (rss->types & (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4)) + hash_type |= RTE_BIT32(HASH_FIELD_IPV4_L3); + + if (rss->types & (RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_NONFRAG_IPV6_TCP)) + hash_type |= RTE_BIT32(HASH_FIELD_IPV6_L3_L4); + else if (rss->types & (RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_IPV6_EX)) + hash_type |= RTE_BIT32(HASH_FIELD_IPV6_L3); + /* Get a new map key for a new RSS rule */ err = bpf_rss_key(KEY_CMD_GET, &flow->key_idx); if (err < 0) { @@ -2101,8 +2153,11 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd, rss_entry.nb_queues = rss->queue_num; for (i = 0; i < rss->queue_num; i++) rss_entry.queues[i] = rss->queue[i]; - rss_entry.hash_fields = - (1 << HASH_FIELD_IPV4_L3_L4) | (1 << HASH_FIELD_IPV6_L3_L4); + + rss_entry.hash_fields = hash_type; + rte_convert_rss_key((const uint32_t *)key_in, (uint32_t *)rss_entry.key, + TAP_RSS_HASH_KEY_SIZE); + /* Add this RSS entry to map */ err = tap_flow_bpf_update_rss_elem(pmd->map_fd, diff --git a/drivers/net/tap/tap_rss.h b/drivers/net/tap/tap_rss.h index 8766ffc244f6..6009be7031b0 100644 --- a/drivers/net/tap/tap_rss.h +++ b/drivers/net/tap/tap_rss.h @@ -24,11 +24,10 @@ enum hash_field { }; struct rss_key { - __u8 key[128]; __u32 hash_fields; - __u32 key_size; - __u32 queues[TAP_MAX_QUEUES]; + __u8 key[TAP_RSS_HASH_KEY_SIZE]; __u32 nb_queues; + __u32 queues[TAP_MAX_QUEUES]; } __attribute__((packed)); #endif /* _TAP_RSS_H_ */