[<prev] [next>] [day] [month] [year] [list]
Message-ID: <1623847380-16590-1-git-send-email-sgoutham@marvell.com>
Date: Wed, 16 Jun 2021 18:13:00 +0530
From: <sgoutham@...vell.com>
To: <mkubecek@...e.cz>, <kuba@...nel.org>, <netdev@...r.kernel.org>
CC: Sunil Goutham <sgoutham@...vell.com>
Subject: [PATCH ethtool] ethtool: Support ntuple rule count change
From: Sunil Goutham <sgoutham@...vell.com>
Some NICs share resources like packet filters across multiple
interfaces they support, between SRIOV PF and VFs and/or between
multiple PFs. From HW point of view it is allowed to use all
MCAM filters for a single interface. Currently ethtool doesn't
support modifying filter count so that user can allocate more filters
to one interface and less to others. This patch adds ETHTOOL_SRXCLSRLCNT
ioctl command for modifying filter count.
example command:
./ethtool -U eth0 rule-count 256
Signed-off-by: Sunil Goutham <sgoutham@...vell.com>
---
ethtool.c | 11 +++++++++++
internal.h | 1 +
rxclass.c | 15 +++++++++++++++
uapi/linux/ethtool.h | 1 +
4 files changed, 28 insertions(+)
diff --git a/ethtool.c b/ethtool.c
index 8ed5a33..d4d0dab 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -3797,6 +3797,16 @@ static int do_srxclass(struct cmd_context *ctx)
" classification rule\n");
return 1;
}
+ } else if (!strcmp(ctx->argp[0], "rule-count")) {
+ int count = get_uint_range(ctx->argp[1], 0, INT_MAX);
+
+ err = rxclass_set_rule_count(ctx, count);
+
+ if (err < 0) {
+ fprintf(stderr, "Couldn't set"
+ " the desired ntuple rule count\n");
+ return 1;
+ }
} else {
exit_bad_args();
}
@@ -5818,6 +5828,7 @@ static const struct option args[] = {
" [ context %d ]\n"
" [ loc %d]] |\n"
" delete %d\n"
+ " rule-count %d\n"
},
{
.opts = "-T|--show-time-stamping",
diff --git a/internal.h b/internal.h
index 27da8ea..ce76394 100644
--- a/internal.h
+++ b/internal.h
@@ -372,6 +372,7 @@ int rxclass_rule_get(struct cmd_context *ctx, __u32 loc);
int rxclass_rule_ins(struct cmd_context *ctx,
struct ethtool_rx_flow_spec *fsp, __u32 rss_context);
int rxclass_rule_del(struct cmd_context *ctx, __u32 loc);
+int rxclass_set_rule_count(struct cmd_context *ctx, __u32 count);
/* Module EEPROM parsing code */
void sff8079_show_all(const __u8 *id);
diff --git a/rxclass.c b/rxclass.c
index 6cf81fd..9d29dde 100644
--- a/rxclass.c
+++ b/rxclass.c
@@ -616,6 +616,21 @@ int rxclass_rule_del(struct cmd_context *ctx, __u32 loc)
return err;
}
+int rxclass_set_rule_count(struct cmd_context *ctx, __u32 count)
+{
+ struct ethtool_rxnfc nfccmd;
+ int err;
+
+ /* notify netdev of rule count config */
+ nfccmd.cmd = ETHTOOL_SRXCLSRLCNT;
+ nfccmd.rule_cnt = count;
+ err = send_ioctl(ctx, &nfccmd);
+ if (err < 0)
+ perror("rmgr: Cannot set RX class rule count");
+
+ return err;
+}
+
typedef enum {
OPT_NONE = 0,
OPT_S32,
diff --git a/uapi/linux/ethtool.h b/uapi/linux/ethtool.h
index c6ec111..a43074a 100644
--- a/uapi/linux/ethtool.h
+++ b/uapi/linux/ethtool.h
@@ -1550,6 +1550,7 @@ enum ethtool_fec_config_bits {
#define ETHTOOL_PHY_STUNABLE 0x0000004f /* Set PHY tunable configuration */
#define ETHTOOL_GFECPARAM 0x00000050 /* Get FEC settings */
#define ETHTOOL_SFECPARAM 0x00000051 /* Set FEC settings */
+#define ETHTOOL_SRXCLSRLCNT 0x00000052 /* Set RX class rule count */
/* compatibility with older code */
#define SPARC_ETH_GSET ETHTOOL_GSET
--
2.7.4
Powered by blists - more mailing lists