* [ethtool 1/6] ethtool: move option parsing related code into function
@ 2019-01-17 23:03 Nicholas Nunley
2019-01-17 23:03 ` [ethtool 2/6] ethtool: move cmdline_coalesce out of do_scoalesce Nicholas Nunley
` (5 more replies)
0 siblings, 6 replies; 8+ messages in thread
From: Nicholas Nunley @ 2019-01-17 23:03 UTC (permalink / raw)
To: linville; +Cc: Jeff Kirsher, Nicholas Nunley, netdev, nhorman, sassmann
Move option parsing code into find_option function.
No behavior changes.
Based on patch by Kan Liang <kan.liang@intel.com>
Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
---
ethtool.c | 49 +++++++++++++++++++++++++++++++------------------
1 file changed, 31 insertions(+), 18 deletions(-)
diff --git a/ethtool.c b/ethtool.c
index 2f7e96b..1e4c3bb 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -5265,6 +5265,29 @@ static int show_usage(struct cmd_context *ctx)
return 0;
}
+static int find_option(int argc, char **argp)
+{
+ const char *opt;
+ size_t len;
+ int k;
+
+ for (k = 0; args[k].opts; k++) {
+ opt = args[k].opts;
+ for (;;) {
+ len = strcspn(opt, "|");
+ if (strncmp(*argp, opt, len) == 0 &&
+ (*argp)[len] == 0)
+ return k;
+
+ if (opt[len] == 0)
+ break;
+ opt += len + 1;
+ }
+ }
+
+ return -1;
+}
+
int main(int argc, char **argp)
{
int (*func)(struct cmd_context *);
@@ -5284,24 +5307,14 @@ int main(int argc, char **argp)
*/
if (argc == 0)
exit_bad_args();
- for (k = 0; args[k].opts; k++) {
- const char *opt;
- size_t len;
- opt = args[k].opts;
- for (;;) {
- len = strcspn(opt, "|");
- if (strncmp(*argp, opt, len) == 0 &&
- (*argp)[len] == 0) {
- argp++;
- argc--;
- func = args[k].func;
- want_device = args[k].want_device;
- goto opt_found;
- }
- if (opt[len] == 0)
- break;
- opt += len + 1;
- }
+
+ k = find_option(argc, argp);
+ if (k > 0) {
+ argp++;
+ argc--;
+ func = args[k].func;
+ want_device = args[k].want_device;
+ goto opt_found;
}
if ((*argp)[0] == '-')
exit_bad_args();
--
2.20.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [ethtool 2/6] ethtool: move cmdline_coalesce out of do_scoalesce
2019-01-17 23:03 [ethtool 1/6] ethtool: move option parsing related code into function Nicholas Nunley
@ 2019-01-17 23:03 ` Nicholas Nunley
2019-01-17 23:03 ` [ethtool 3/6] ethtool: introduce new ioctl for per-queue settings Nicholas Nunley
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Nicholas Nunley @ 2019-01-17 23:03 UTC (permalink / raw)
To: linville; +Cc: Jeff Kirsher, Nicholas Nunley, netdev, nhorman, sassmann
Move the definition of cmdline_coalesce out of do_scoalesce and into a
macro so it can be resused across functions.
No behavior change.
Based on patch by Kan Liang <kan.liang@intel.com>
Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
---
ethtool.c | 142 ++++++++++++++++++++++++++++--------------------------
1 file changed, 74 insertions(+), 68 deletions(-)
diff --git a/ethtool.c b/ethtool.c
index 1e4c3bb..1f91303 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -2098,78 +2098,84 @@ static int do_gcoalesce(struct cmd_context *ctx)
return 0;
}
+#define DECLARE_COALESCE_OPTION_VARS() \
+ s32 coal_stats_wanted = -1; \
+ int coal_adaptive_rx_wanted = -1; \
+ int coal_adaptive_tx_wanted = -1; \
+ s32 coal_sample_rate_wanted = -1; \
+ s32 coal_pkt_rate_low_wanted = -1; \
+ s32 coal_pkt_rate_high_wanted = -1; \
+ s32 coal_rx_usec_wanted = -1; \
+ s32 coal_rx_frames_wanted = -1; \
+ s32 coal_rx_usec_irq_wanted = -1; \
+ s32 coal_rx_frames_irq_wanted = -1; \
+ s32 coal_tx_usec_wanted = -1; \
+ s32 coal_tx_frames_wanted = -1; \
+ s32 coal_tx_usec_irq_wanted = -1; \
+ s32 coal_tx_frames_irq_wanted = -1; \
+ s32 coal_rx_usec_low_wanted = -1; \
+ s32 coal_rx_frames_low_wanted = -1; \
+ s32 coal_tx_usec_low_wanted = -1; \
+ s32 coal_tx_frames_low_wanted = -1; \
+ s32 coal_rx_usec_high_wanted = -1; \
+ s32 coal_rx_frames_high_wanted = -1; \
+ s32 coal_tx_usec_high_wanted = -1; \
+ s32 coal_tx_frames_high_wanted = -1
+
+#define COALESCE_CMDLINE_INFO(__ecoal) \
+{ \
+ { "adaptive-rx", CMDL_BOOL, &coal_adaptive_rx_wanted, \
+ &__ecoal.use_adaptive_rx_coalesce }, \
+ { "adaptive-tx", CMDL_BOOL, &coal_adaptive_tx_wanted, \
+ &__ecoal.use_adaptive_tx_coalesce }, \
+ { "sample-interval", CMDL_S32, &coal_sample_rate_wanted, \
+ &__ecoal.rate_sample_interval }, \
+ { "stats-block-usecs", CMDL_S32, &coal_stats_wanted, \
+ &__ecoal.stats_block_coalesce_usecs }, \
+ { "pkt-rate-low", CMDL_S32, &coal_pkt_rate_low_wanted, \
+ &__ecoal.pkt_rate_low }, \
+ { "pkt-rate-high", CMDL_S32, &coal_pkt_rate_high_wanted, \
+ &__ecoal.pkt_rate_high }, \
+ { "rx-usecs", CMDL_S32, &coal_rx_usec_wanted, \
+ &__ecoal.rx_coalesce_usecs }, \
+ { "rx-frames", CMDL_S32, &coal_rx_frames_wanted, \
+ &__ecoal.rx_max_coalesced_frames }, \
+ { "rx-usecs-irq", CMDL_S32, &coal_rx_usec_irq_wanted, \
+ &__ecoal.rx_coalesce_usecs_irq }, \
+ { "rx-frames-irq", CMDL_S32, &coal_rx_frames_irq_wanted, \
+ &__ecoal.rx_max_coalesced_frames_irq }, \
+ { "tx-usecs", CMDL_S32, &coal_tx_usec_wanted, \
+ &__ecoal.tx_coalesce_usecs }, \
+ { "tx-frames", CMDL_S32, &coal_tx_frames_wanted, \
+ &__ecoal.tx_max_coalesced_frames }, \
+ { "tx-usecs-irq", CMDL_S32, &coal_tx_usec_irq_wanted, \
+ &__ecoal.tx_coalesce_usecs_irq }, \
+ { "tx-frames-irq", CMDL_S32, &coal_tx_frames_irq_wanted, \
+ &__ecoal.tx_max_coalesced_frames_irq }, \
+ { "rx-usecs-low", CMDL_S32, &coal_rx_usec_low_wanted, \
+ &__ecoal.rx_coalesce_usecs_low }, \
+ { "rx-frames-low", CMDL_S32, &coal_rx_frames_low_wanted, \
+ &__ecoal.rx_max_coalesced_frames_low }, \
+ { "tx-usecs-low", CMDL_S32, &coal_tx_usec_low_wanted, \
+ &__ecoal.tx_coalesce_usecs_low }, \
+ { "tx-frames-low", CMDL_S32, &coal_tx_frames_low_wanted, \
+ &__ecoal.tx_max_coalesced_frames_low }, \
+ { "rx-usecs-high", CMDL_S32, &coal_rx_usec_high_wanted, \
+ &__ecoal.rx_coalesce_usecs_high }, \
+ { "rx-frames-high", CMDL_S32, &coal_rx_frames_high_wanted, \
+ &__ecoal.rx_max_coalesced_frames_high }, \
+ { "tx-usecs-high", CMDL_S32, &coal_tx_usec_high_wanted, \
+ &__ecoal.tx_coalesce_usecs_high }, \
+ { "tx-frames-high", CMDL_S32, &coal_tx_frames_high_wanted, \
+ &__ecoal.tx_max_coalesced_frames_high }, \
+}
+
static int do_scoalesce(struct cmd_context *ctx)
{
struct ethtool_coalesce ecoal;
int gcoalesce_changed = 0;
- s32 coal_stats_wanted = -1;
- int coal_adaptive_rx_wanted = -1;
- int coal_adaptive_tx_wanted = -1;
- s32 coal_sample_rate_wanted = -1;
- s32 coal_pkt_rate_low_wanted = -1;
- s32 coal_pkt_rate_high_wanted = -1;
- s32 coal_rx_usec_wanted = -1;
- s32 coal_rx_frames_wanted = -1;
- s32 coal_rx_usec_irq_wanted = -1;
- s32 coal_rx_frames_irq_wanted = -1;
- s32 coal_tx_usec_wanted = -1;
- s32 coal_tx_frames_wanted = -1;
- s32 coal_tx_usec_irq_wanted = -1;
- s32 coal_tx_frames_irq_wanted = -1;
- s32 coal_rx_usec_low_wanted = -1;
- s32 coal_rx_frames_low_wanted = -1;
- s32 coal_tx_usec_low_wanted = -1;
- s32 coal_tx_frames_low_wanted = -1;
- s32 coal_rx_usec_high_wanted = -1;
- s32 coal_rx_frames_high_wanted = -1;
- s32 coal_tx_usec_high_wanted = -1;
- s32 coal_tx_frames_high_wanted = -1;
- struct cmdline_info cmdline_coalesce[] = {
- { "adaptive-rx", CMDL_BOOL, &coal_adaptive_rx_wanted,
- &ecoal.use_adaptive_rx_coalesce },
- { "adaptive-tx", CMDL_BOOL, &coal_adaptive_tx_wanted,
- &ecoal.use_adaptive_tx_coalesce },
- { "sample-interval", CMDL_S32, &coal_sample_rate_wanted,
- &ecoal.rate_sample_interval },
- { "stats-block-usecs", CMDL_S32, &coal_stats_wanted,
- &ecoal.stats_block_coalesce_usecs },
- { "pkt-rate-low", CMDL_S32, &coal_pkt_rate_low_wanted,
- &ecoal.pkt_rate_low },
- { "pkt-rate-high", CMDL_S32, &coal_pkt_rate_high_wanted,
- &ecoal.pkt_rate_high },
- { "rx-usecs", CMDL_S32, &coal_rx_usec_wanted,
- &ecoal.rx_coalesce_usecs },
- { "rx-frames", CMDL_S32, &coal_rx_frames_wanted,
- &ecoal.rx_max_coalesced_frames },
- { "rx-usecs-irq", CMDL_S32, &coal_rx_usec_irq_wanted,
- &ecoal.rx_coalesce_usecs_irq },
- { "rx-frames-irq", CMDL_S32, &coal_rx_frames_irq_wanted,
- &ecoal.rx_max_coalesced_frames_irq },
- { "tx-usecs", CMDL_S32, &coal_tx_usec_wanted,
- &ecoal.tx_coalesce_usecs },
- { "tx-frames", CMDL_S32, &coal_tx_frames_wanted,
- &ecoal.tx_max_coalesced_frames },
- { "tx-usecs-irq", CMDL_S32, &coal_tx_usec_irq_wanted,
- &ecoal.tx_coalesce_usecs_irq },
- { "tx-frames-irq", CMDL_S32, &coal_tx_frames_irq_wanted,
- &ecoal.tx_max_coalesced_frames_irq },
- { "rx-usecs-low", CMDL_S32, &coal_rx_usec_low_wanted,
- &ecoal.rx_coalesce_usecs_low },
- { "rx-frames-low", CMDL_S32, &coal_rx_frames_low_wanted,
- &ecoal.rx_max_coalesced_frames_low },
- { "tx-usecs-low", CMDL_S32, &coal_tx_usec_low_wanted,
- &ecoal.tx_coalesce_usecs_low },
- { "tx-frames-low", CMDL_S32, &coal_tx_frames_low_wanted,
- &ecoal.tx_max_coalesced_frames_low },
- { "rx-usecs-high", CMDL_S32, &coal_rx_usec_high_wanted,
- &ecoal.rx_coalesce_usecs_high },
- { "rx-frames-high", CMDL_S32, &coal_rx_frames_high_wanted,
- &ecoal.rx_max_coalesced_frames_high },
- { "tx-usecs-high", CMDL_S32, &coal_tx_usec_high_wanted,
- &ecoal.tx_coalesce_usecs_high },
- { "tx-frames-high", CMDL_S32, &coal_tx_frames_high_wanted,
- &ecoal.tx_max_coalesced_frames_high },
- };
+ DECLARE_COALESCE_OPTION_VARS();
+ struct cmdline_info cmdline_coalesce[] = COALESCE_CMDLINE_INFO(ecoal);
int err, changed = 0;
parse_generic_cmdline(ctx, &gcoalesce_changed,
--
2.20.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [ethtool 3/6] ethtool: introduce new ioctl for per-queue settings
2019-01-17 23:03 [ethtool 1/6] ethtool: move option parsing related code into function Nicholas Nunley
2019-01-17 23:03 ` [ethtool 2/6] ethtool: move cmdline_coalesce out of do_scoalesce Nicholas Nunley
@ 2019-01-17 23:03 ` Nicholas Nunley
2019-01-17 23:03 ` [ethtool 4/6] ethtool: support per-queue sub command --show-coalesce Nicholas Nunley
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Nicholas Nunley @ 2019-01-17 23:03 UTC (permalink / raw)
To: linville; +Cc: Jeff Kirsher, Nicholas Nunley, netdev, nhorman, sassmann
Introduce a new ioctl for setting per-queue parameters.
Users can apply commands to specific queues by setting SUB_COMMAND and
queue_mask with the following ethtool command:
ethtool --set-perqueue-command DEVNAME [queue_mask %x] SUB_COMMAND
If queue_mask is not set, the SUB_COMMAND will be applied to all queues.
SUB_COMMANDs for per-queue settings will be implemented in following
patches.
Based on patch by Kan Liang <kan.liang@intel.com>
Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
---
ethtool.8.in | 20 ++++++++++
ethtool.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 121 insertions(+)
diff --git a/ethtool.8.in b/ethtool.8.in
index 5a26cff..0aaca2c 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -391,6 +391,14 @@ ethtool \- query or control network driver and hardware settings
.I devname
.B encoding
.BR auto | off | rs | baser \ [...]
+.HP
+.B ethtool \-\-set\-perqueue\-command
+.I devname
+.RB [ queue_mask
+.IR %x ]
+.I sub_command
+.RB ...
+ .
.
.\" Adjust lines (i.e. full justification) and hyphenate.
.ad
@@ -1135,6 +1143,18 @@ RS Force RS-FEC encoding
BaseR Force BaseR encoding
.TE
.RE
+.TP
+.B \-\-set\-perqueue\-command
+Sets sub command to specific queues.
+.RS 4
+.TP
+.B queue_mask %x
+Sets the specific queues which the sub command is applied to.
+If queue_mask is not set, the sub command will be applied to all queues.
+.TP
+.B sub_command
+Sets the sub command.
+.RE
.SH BUGS
Not supported (in part or whole) on all network drivers.
.SH AUTHOR
diff --git a/ethtool.c b/ethtool.c
index 1f91303..e089981 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -5048,6 +5048,8 @@ static int do_sfec(struct cmd_context *ctx)
return 0;
}
+static int do_perqueue(struct cmd_context *ctx);
+
#ifndef TEST_ETHTOOL
int send_ioctl(struct cmd_context *ctx, void *cmd)
{
@@ -5243,6 +5245,8 @@ static const struct option {
{ "--show-fec", 1, do_gfec, "Show FEC settings"},
{ "--set-fec", 1, do_sfec, "Set FEC settings",
" [ encoding auto|off|rs|baser [...]]\n"},
+ { "--set-perqueue-command", 1, do_perqueue, "Set per queue command",
+ " [queue_mask %x] SUB_COMMAND\n"},
{ "-h|--help", 0, show_usage, "Show this help" },
{ "--version", 0, do_version, "Show version number" },
{}
@@ -5294,6 +5298,103 @@ static int find_option(int argc, char **argp)
return -1;
}
+static int set_queue_mask(u32 *queue_mask, char *str)
+{
+ int len = strlen(str);
+ int index = __KERNEL_DIV_ROUND_UP(len * 4, 32);
+ char tmp[9];
+ char *end = str + len;
+ int i, num;
+ __u32 mask;
+ int n_queues = 0;
+
+ if (len > MAX_NUM_QUEUE)
+ return -EINVAL;
+
+ for (i = 0; i < index; i++) {
+ num = end - str;
+
+ if (num >= 8) {
+ end -= 8;
+ num = 8;
+ } else {
+ end = str;
+ }
+ strncpy(tmp, end, num);
+ tmp[num] = '\0';
+
+ queue_mask[i] = strtoul(tmp, NULL, 16);
+
+ mask = queue_mask[i];
+ while (mask > 0) {
+ if (mask & 0x1)
+ n_queues++;
+ mask = mask >> 1;
+ }
+ }
+
+ return n_queues;
+}
+
+#define MAX(x, y) (x > y ? x : y)
+
+static int find_max_num_queues(struct cmd_context *ctx)
+{
+ struct ethtool_channels echannels;
+
+ echannels.cmd = ETHTOOL_GCHANNELS;
+ if (send_ioctl(ctx, &echannels))
+ return -1;
+
+ return MAX(MAX(echannels.rx_count, echannels.tx_count),
+ echannels.combined_count);
+}
+
+static int do_perqueue(struct cmd_context *ctx)
+{
+ __u32 queue_mask[__KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32)] = {0};
+ int i, n_queues = 0;
+
+ if (ctx->argc == 0)
+ exit_bad_args();
+
+ /*
+ * The sub commands will be applied to
+ * all queues if no queue_mask set
+ */
+ if (strncmp(*ctx->argp, "queue_mask", 10)) {
+ n_queues = find_max_num_queues(ctx);
+ if (n_queues < 0) {
+ perror("Cannot get number of queues");
+ return -EFAULT;
+ }
+ for (i = 0; i < n_queues / 32; i++)
+ queue_mask[i] = ~0;
+ queue_mask[i] = (1 << (n_queues - i * 32)) - 1;
+ fprintf(stdout,
+ "The sub commands will be applied to all %d queues\n",
+ n_queues);
+ } else {
+ ctx->argc--;
+ ctx->argp++;
+ n_queues = set_queue_mask(queue_mask, *ctx->argp);
+ if (n_queues < 0) {
+ perror("Invalid queue mask");
+ return n_queues;
+ }
+ ctx->argc--;
+ ctx->argp++;
+ }
+
+ i = find_option(ctx->argc, ctx->argp);
+ if (i < 0)
+ exit_bad_args();
+
+ /* no sub_command support yet */
+
+ return 0;
+}
+
int main(int argc, char **argp)
{
int (*func)(struct cmd_context *);
--
2.20.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [ethtool 4/6] ethtool: support per-queue sub command --show-coalesce
2019-01-17 23:03 [ethtool 1/6] ethtool: move option parsing related code into function Nicholas Nunley
2019-01-17 23:03 ` [ethtool 2/6] ethtool: move cmdline_coalesce out of do_scoalesce Nicholas Nunley
2019-01-17 23:03 ` [ethtool 3/6] ethtool: introduce new ioctl for per-queue settings Nicholas Nunley
@ 2019-01-17 23:03 ` Nicholas Nunley
2019-01-17 23:03 ` [ethtool 5/6] ethtool: support per-queue sub command --coalesce Nicholas Nunley
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Nicholas Nunley @ 2019-01-17 23:03 UTC (permalink / raw)
To: linville; +Cc: Jeff Kirsher, Nicholas Nunley, netdev, nhorman, sassmann
Get all masked queues' coalesce settings from kernel and dump them one by
one.
Example:
$ sudo ./ethtool --set-perqueue-command eth5 queue_mask 0x11
--show-coalesce
Queue: 0
Adaptive RX: off TX: off
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 222
rx-frames: 0
rx-usecs-irq: 0
rx-frames-irq: 256
tx-usecs: 222
tx-frames: 0
tx-usecs-irq: 0
tx-frames-irq: 256
rx-usecs-low: 0
rx-frame-low: 0
tx-usecs-low: 0
tx-frame-low: 0
rx-usecs-high: 0
rx-frame-high: 0
tx-usecs-high: 0
tx-frame-high: 0
Queue: 4
Adaptive RX: off TX: off
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 222
rx-frames: 0
rx-usecs-irq: 0
rx-frames-irq: 256
tx-usecs: 222
tx-frames: 0
tx-usecs-irq: 0
tx-frames-irq: 256
rx-usecs-low: 0
rx-frame-low: 0
tx-usecs-low: 0
tx-frame-low: 0
rx-usecs-high: 0
rx-frame-high: 0
tx-usecs-high: 0
tx-frame-high: 0
Based on patch by Kan Liang <kan.liang@intel.com>
Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
---
ethtool.8.in | 2 +-
ethtool.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/ethtool.8.in b/ethtool.8.in
index 0aaca2c..71bb962 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -1153,7 +1153,7 @@ Sets the specific queues which the sub command is applied to.
If queue_mask is not set, the sub command will be applied to all queues.
.TP
.B sub_command
-Sets the sub command.
+Sets the sub command. The supported sub commands include --show-coalesce.
.RE
.SH BUGS
Not supported (in part or whole) on all network drivers.
diff --git a/ethtool.c b/ethtool.c
index e089981..c7a12d7 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -1409,6 +1409,29 @@ static int dump_coalesce(const struct ethtool_coalesce *ecoal)
return 0;
}
+void dump_per_queue_coalesce(struct ethtool_per_queue_op *per_queue_opt,
+ __u32 *queue_mask)
+{
+ char *addr;
+ int i;
+
+ addr = (char *)per_queue_opt + sizeof(*per_queue_opt);
+ for (i = 0; i < __KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32); i++) {
+ int queue = i * 32;
+ __u32 mask = queue_mask[i];
+
+ while (mask > 0) {
+ if (mask & 0x1) {
+ fprintf(stdout, "Queue: %d\n", queue);
+ dump_coalesce((struct ethtool_coalesce *)addr);
+ addr += sizeof(struct ethtool_coalesce);
+ }
+ mask = mask >> 1;
+ queue++;
+ }
+ }
+}
+
struct feature_state {
u32 off_flags;
struct ethtool_gfeatures features;
@@ -5245,7 +5268,8 @@ static const struct option {
{ "--show-fec", 1, do_gfec, "Show FEC settings"},
{ "--set-fec", 1, do_sfec, "Set FEC settings",
" [ encoding auto|off|rs|baser [...]]\n"},
- { "--set-perqueue-command", 1, do_perqueue, "Set per queue command",
+ { "--set-perqueue-command", 1, do_perqueue, "Set per queue command. "
+ "The supported sub commands include --show-coalesce",
" [queue_mask %x] SUB_COMMAND\n"},
{ "-h|--help", 0, show_usage, "Show this help" },
{ "--version", 0, do_version, "Show version number" },
@@ -5350,8 +5374,32 @@ static int find_max_num_queues(struct cmd_context *ctx)
echannels.combined_count);
}
+static struct ethtool_per_queue_op *
+get_per_queue_coalesce(struct cmd_context *ctx, __u32 *queue_mask, int n_queues)
+{
+ struct ethtool_per_queue_op *per_queue_opt;
+
+ per_queue_opt = malloc(sizeof(*per_queue_opt) + n_queues *
+ sizeof(struct ethtool_coalesce));
+ if (!per_queue_opt)
+ return NULL;
+
+ memcpy(per_queue_opt->queue_mask, queue_mask,
+ __KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32) * sizeof(__u32));
+ per_queue_opt->cmd = ETHTOOL_PERQUEUE;
+ per_queue_opt->sub_command = ETHTOOL_GCOALESCE;
+ if (send_ioctl(ctx, per_queue_opt)) {
+ free(per_queue_opt);
+ perror("Cannot get device per queue parameters");
+ return NULL;
+ }
+
+ return per_queue_opt;
+}
+
static int do_perqueue(struct cmd_context *ctx)
{
+ struct ethtool_per_queue_op *per_queue_opt;
__u32 queue_mask[__KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32)] = {0};
int i, n_queues = 0;
@@ -5390,7 +5438,19 @@ static int do_perqueue(struct cmd_context *ctx)
if (i < 0)
exit_bad_args();
- /* no sub_command support yet */
+ if (strstr(args[i].opts, "--show-coalesce") != NULL) {
+ per_queue_opt = get_per_queue_coalesce(ctx, queue_mask,
+ n_queues);
+ if (per_queue_opt == NULL) {
+ perror("Cannot get device per queue parameters");
+ return -EFAULT;
+ }
+ dump_per_queue_coalesce(per_queue_opt, queue_mask);
+ free(per_queue_opt);
+ } else {
+ perror("The subcommand is not supported yet");
+ return -EOPNOTSUPP;
+ }
return 0;
}
--
2.20.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [ethtool 5/6] ethtool: support per-queue sub command --coalesce
2019-01-17 23:03 [ethtool 1/6] ethtool: move option parsing related code into function Nicholas Nunley
` (2 preceding siblings ...)
2019-01-17 23:03 ` [ethtool 4/6] ethtool: support per-queue sub command --show-coalesce Nicholas Nunley
@ 2019-01-17 23:03 ` Nicholas Nunley
2019-01-17 23:03 ` [ethtool 6/6] ethtool: fix up dump_coalesce output to match actual option names Nicholas Nunley
2019-01-30 21:08 ` [ethtool 1/6] ethtool: move option parsing related code into function John W. Linville
5 siblings, 0 replies; 8+ messages in thread
From: Nicholas Nunley @ 2019-01-17 23:03 UTC (permalink / raw)
To: linville; +Cc: Jeff Kirsher, Nicholas Nunley, netdev, nhorman, sassmann
This patch adds the ability to configure the coalesce settings from
do_scoalesce on a per-queue basis.
For each masked queue the current settings are read, modified, and written
back to the kernel.
Example:
$ sudo ./ethtool --set-perqueue-command eth5 queue_mask 0x1 --coalesce
rx-usecs 10 tx-usecs 5
$ sudo ./ethtool --set-perqueue-command eth5 queue_mask 0x1
--show-coalesce
Queue: 0
Adaptive RX: on TX: on
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 10
rx-frames: 0
rx-usecs-irq: 0
rx-frames-irq: 256
tx-usecs: 5
tx-frames: 0
tx-usecs-irq: 0
tx-frames-irq: 256
rx-usecs-low: 0
rx-frame-low: 0
tx-usecs-low: 0
tx-frame-low: 0
rx-usecs-high: 0
rx-frame-high: 0
tx-usecs-high: 0
tx-frame-high: 0
Based on patch by Kan Liang <kan.liang@intel.com>
Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
---
ethtool.8.in | 3 ++-
ethtool.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/ethtool.8.in b/ethtool.8.in
index 71bb962..c7202e8 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -1153,7 +1153,8 @@ Sets the specific queues which the sub command is applied to.
If queue_mask is not set, the sub command will be applied to all queues.
.TP
.B sub_command
-Sets the sub command. The supported sub commands include --show-coalesce.
+Sets the sub command. The supported sub commands include --show-coalesce and
+--coalesce.
.RE
.SH BUGS
Not supported (in part or whole) on all network drivers.
diff --git a/ethtool.c b/ethtool.c
index c7a12d7..3aded50 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -5269,7 +5269,7 @@ static const struct option {
{ "--set-fec", 1, do_sfec, "Set FEC settings",
" [ encoding auto|off|rs|baser [...]]\n"},
{ "--set-perqueue-command", 1, do_perqueue, "Set per queue command. "
- "The supported sub commands include --show-coalesce",
+ "The supported sub commands include --show-coalesce, --coalesce",
" [queue_mask %x] SUB_COMMAND\n"},
{ "-h|--help", 0, show_usage, "Show this help" },
{ "--version", 0, do_version, "Show version number" },
@@ -5397,6 +5397,53 @@ get_per_queue_coalesce(struct cmd_context *ctx, __u32 *queue_mask, int n_queues)
return per_queue_opt;
}
+static void set_per_queue_coalesce(struct cmd_context *ctx,
+ struct ethtool_per_queue_op *per_queue_opt)
+{
+ struct ethtool_coalesce ecoal;
+ DECLARE_COALESCE_OPTION_VARS();
+ struct cmdline_info cmdline_coalesce[] = COALESCE_CMDLINE_INFO(ecoal);
+ __u32 *queue_mask = per_queue_opt->queue_mask;
+ char *addr = (char *)per_queue_opt + sizeof(*per_queue_opt);
+ int gcoalesce_changed = 0;
+ int i;
+
+ parse_generic_cmdline(ctx, &gcoalesce_changed,
+ cmdline_coalesce, ARRAY_SIZE(cmdline_coalesce));
+
+ for (i = 0; i < __KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32); i++) {
+ int queue = i * 32;
+ __u32 mask = queue_mask[i];
+
+ while (mask > 0) {
+ if (mask & 0x1) {
+ int changed = 0;
+
+ memcpy(&ecoal, addr,
+ sizeof(struct ethtool_coalesce));
+ do_generic_set(cmdline_coalesce,
+ ARRAY_SIZE(cmdline_coalesce),
+ &changed);
+ if (!changed)
+ fprintf(stderr,
+ "Queue %d, no coalesce parameters changed\n",
+ queue);
+ memcpy(addr, &ecoal,
+ sizeof(struct ethtool_coalesce));
+ addr += sizeof(struct ethtool_coalesce);
+ }
+ mask = mask >> 1;
+ queue++;
+ }
+ }
+
+ per_queue_opt->cmd = ETHTOOL_PERQUEUE;
+ per_queue_opt->sub_command = ETHTOOL_SCOALESCE;
+
+ if (send_ioctl(ctx, per_queue_opt))
+ perror("Cannot set device per queue parameters");
+}
+
static int do_perqueue(struct cmd_context *ctx)
{
struct ethtool_per_queue_op *per_queue_opt;
@@ -5447,6 +5494,17 @@ static int do_perqueue(struct cmd_context *ctx)
}
dump_per_queue_coalesce(per_queue_opt, queue_mask);
free(per_queue_opt);
+ } else if (strstr(args[i].opts, "--coalesce") != NULL) {
+ ctx->argc--;
+ ctx->argp++;
+ per_queue_opt = get_per_queue_coalesce(ctx, queue_mask,
+ n_queues);
+ if (per_queue_opt == NULL) {
+ perror("Cannot get device per queue parameters");
+ return -EFAULT;
+ }
+ set_per_queue_coalesce(ctx, per_queue_opt);
+ free(per_queue_opt);
} else {
perror("The subcommand is not supported yet");
return -EOPNOTSUPP;
--
2.20.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [ethtool 6/6] ethtool: fix up dump_coalesce output to match actual option names
2019-01-17 23:03 [ethtool 1/6] ethtool: move option parsing related code into function Nicholas Nunley
` (3 preceding siblings ...)
2019-01-17 23:03 ` [ethtool 5/6] ethtool: support per-queue sub command --coalesce Nicholas Nunley
@ 2019-01-17 23:03 ` Nicholas Nunley
2019-01-30 21:08 ` [ethtool 1/6] ethtool: move option parsing related code into function John W. Linville
5 siblings, 0 replies; 8+ messages in thread
From: Nicholas Nunley @ 2019-01-17 23:03 UTC (permalink / raw)
To: linville; +Cc: Jeff Kirsher, Nicholas Nunley, netdev, nhorman, sassmann
When the coalesce settings are printed with --show-coalesce a few of the
option names lack the pluralization that is present in the man page and
usage info, but are otherwise identical.
This inconsistency could lead to some confusion if a user attempts to set
the coalesce settings by matching the output they see from --show-coalesce,
so fix this.
Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
---
ethtool.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/ethtool.c b/ethtool.c
index 3aded50..41a6efa 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -1372,14 +1372,14 @@ static int dump_coalesce(const struct ethtool_coalesce *ecoal)
"tx-frames-irq: %u\n"
"\n"
"rx-usecs-low: %u\n"
- "rx-frame-low: %u\n"
+ "rx-frames-low: %u\n"
"tx-usecs-low: %u\n"
- "tx-frame-low: %u\n"
+ "tx-frames-low: %u\n"
"\n"
"rx-usecs-high: %u\n"
- "rx-frame-high: %u\n"
+ "rx-frames-high: %u\n"
"tx-usecs-high: %u\n"
- "tx-frame-high: %u\n"
+ "tx-frames-high: %u\n"
"\n",
ecoal->stats_block_coalesce_usecs,
ecoal->rate_sample_interval,
--
2.20.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [ethtool 1/6] ethtool: move option parsing related code into function
2019-01-17 23:03 [ethtool 1/6] ethtool: move option parsing related code into function Nicholas Nunley
` (4 preceding siblings ...)
2019-01-17 23:03 ` [ethtool 6/6] ethtool: fix up dump_coalesce output to match actual option names Nicholas Nunley
@ 2019-01-30 21:08 ` John W. Linville
2019-01-31 6:30 ` Jeff Kirsher
5 siblings, 1 reply; 8+ messages in thread
From: John W. Linville @ 2019-01-30 21:08 UTC (permalink / raw)
To: Nicholas Nunley; +Cc: Jeff Kirsher, netdev, nhorman, sassmann
[-- Attachment #1: Type: text/plain, Size: 2779 bytes --]
On Thu, Jan 17, 2019 at 03:03:08PM -0800, Nicholas Nunley wrote:
> Move option parsing code into find_option function.
>
> No behavior changes.
>
> Based on patch by Kan Liang <kan.liang@intel.com>
>
> Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
Well, after looking at this series for a while I had decided to apply it. But when I applied it and did a 'make distcheck', I got this:
...
gcc -DTEST_ETHTOOL -g -O2 -o test-features test_features-test-features.o test_features-test-common.o test_features-ethtool.o test_features-rxclass.o test_features-amd8111e.o test_features-de2104x.o test_features-dsa.o test_features-e100.o test_features-e1000.o test_features-et131x.o test_features-igb.o test_features-fec_8xx.o test_features-ibm_emac.o test_features-ixgb.o test_features-ixgbe.o test_features-natsemi.o test_features-pcnet32.o test_features-realtek.o test_features-tg3.o test_features-marvell.o test_features-vioc.o test_features-smsc911x.o test_features-at76c50x-usb.o test_features-sfc.o test_features-stmmac.o test_features-sff-common.o test_features-sfpid.o test_features-sfpdiag.o test_features-ixgbevf.o test_features-tse.o test_features-vmxnet3.o test_features-qsfp.o test_features-fjes.o test_features-lan78xx.o -lm
make[2]: Leaving directory '/home/linville/git/ethtool/ethtool-4.19/_build/sub'
make check-TESTS
make[2]: Entering directory '/home/linville/git/ethtool/ethtool-4.19/_build/sub'
make[3]: Entering directory '/home/linville/git/ethtool/ethtool-4.19/_build/sub'
FAIL: test-cmdline
PASS: test-features
============================================================================
Testsuite summary for ethtool 4.19
============================================================================
# TOTAL: 2
# PASS: 1
# SKIP: 0
# XFAIL: 0
# FAIL: 1
# XPASS: 0
# ERROR: 0
============================================================================
See ./test-suite.log
Please report to netdev@vger.kernel.org
============================================================================
make[3]: *** [Makefile:1942: test-suite.log] Error 1
make[3]: Leaving directory '/home/linville/git/ethtool/ethtool-4.19/_build/sub'
make[2]: *** [Makefile:2050: check-TESTS] Error 2
make[2]: Leaving directory '/home/linville/git/ethtool/ethtool-4.19/_build/sub'
make[1]: *** [Makefile:2264: check-am] Error 2
make[1]: Leaving directory '/home/linville/git/ethtool/ethtool-4.19/_build/sub'
make: *** [Makefile:2186: distcheck] Error 1
...
I'll attach ./ethtool-4.19/_build/sub/test-suite.log to this
message. Obviously we need whatever additional changes are needed to
get 'make check-TESTS' to pass legitimately.
John
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
[-- Attachment #2: test-suite.log --]
[-- Type: text/plain, Size: 1654 bytes --]
====================================
ethtool 4.19: ./test-suite.log
====================================
# TOTAL: 2
# PASS: 1
# SKIP: 0
# XFAIL: 0
# FAIL: 1
# XPASS: 0
# ERROR: 0
.. contents:: :depth: 2
FAIL: test-cmdline
==================
E: ethtool -s devname returns 1
E: ethtool --change devname speed 100 duplex half mdix auto returns 1
E: ethtool -s devname duplex half returns 1
E: ethtool --change devname port tp returns 1
E: ethtool -s devname autoneg on returns 1
E: ethtool --change devname advertise 0x1 returns 1
E: ethtool --change devname advertise 0xf returns 1
E: ethtool --change devname advertise 0Xf returns 1
E: ethtool --change devname advertise 1 returns 1
E: ethtool --change devname advertise f returns 1
E: ethtool --change devname advertise 01 returns 1
E: ethtool --change devname advertise 0f returns 1
E: ethtool --change devname advertise 0xfffffffffffffffffffffffffffffffff returns 1
E: ethtool --change devname advertise fffffffffffffffffffffffffffffffff returns 1
E: ethtool --change devname advertise 0x0000fffffffffffffffffffffffffffff returns 1
E: ethtool --change devname advertise 0000fffffffffffffffffffffffffffff returns 1
E: ethtool -s devname phyad 1 returns 1
E: ethtool --change devname xcvr external returns 1
E: ethtool -s devname wol p returns 1
E: ethtool -s devname sopass 01:23:45:67:89:ab returns 1
E: ethtool -s devname msglvl 1 returns 1
E: ethtool -s devname msglvl hw on rx_status off returns 1
E: ethtool --change devname speed 100 duplex half port tp autoneg on advertise 0x1 phyad 1 xcvr external wol p sopass 01:23:45:67:89:ab msglvl 1 returns 1
FAIL test-cmdline (exit status: 1)
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [ethtool 1/6] ethtool: move option parsing related code into function
2019-01-30 21:08 ` [ethtool 1/6] ethtool: move option parsing related code into function John W. Linville
@ 2019-01-31 6:30 ` Jeff Kirsher
0 siblings, 0 replies; 8+ messages in thread
From: Jeff Kirsher @ 2019-01-31 6:30 UTC (permalink / raw)
To: John W. Linville, Nicholas Nunley; +Cc: netdev, nhorman, sassmann
[-- Attachment #1: Type: text/plain, Size: 3069 bytes --]
On Wed, 2019-01-30 at 16:08 -0500, John W. Linville wrote:
> On Thu, Jan 17, 2019 at 03:03:08PM -0800, Nicholas Nunley wrote:
> > Move option parsing code into find_option function.
> >
> > No behavior changes.
> >
> > Based on patch by Kan Liang <kan.liang@intel.com>
> >
> > Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
>
> Well, after looking at this series for a while I had decided to apply it.
> But when I applied it and did a 'make distcheck', I got this:
>
> ...
>
> gcc -DTEST_ETHTOOL -g -O2 -o test-features test_features-test-
> features.o test_features-test-common.o test_features-ethtool.o
> test_features-rxclass.o test_features-amd8111e.o test_features-de2104x.o
> test_features-dsa.o test_features-e100.o test_features-e1000.o
> test_features-et131x.o test_features-igb.o test_features-fec_8xx.o
> test_features-ibm_emac.o test_features-ixgb.o test_features-ixgbe.o
> test_features-natsemi.o test_features-pcnet32.o test_features-realtek.o
> test_features-tg3.o test_features-marvell.o test_features-vioc.o
> test_features-smsc911x.o test_features-at76c50x-usb.o test_features-sfc.o
> test_features-stmmac.o test_features-sff-common.o test_features-sfpid.o
> test_features-sfpdiag.o test_features-ixgbevf.o test_features-tse.o
> test_features-vmxnet3.o test_features-qsfp.o test_features-fjes.o
> test_features-lan78xx.o -lm
> make[2]: Leaving directory '/home/linville/git/ethtool/ethtool-
> 4.19/_build/sub'
> make check-TESTS
> make[2]: Entering directory '/home/linville/git/ethtool/ethtool-
> 4.19/_build/sub'
> make[3]: Entering directory '/home/linville/git/ethtool/ethtool-
> 4.19/_build/sub'
> FAIL: test-cmdline
> PASS: test-features
> =========================================================================
> ===
> Testsuite summary for ethtool 4.19
> =========================================================================
> ===
> # TOTAL: 2
> # PASS: 1
> # SKIP: 0
> # XFAIL: 0
> # FAIL: 1
> # XPASS: 0
> # ERROR: 0
> =========================================================================
> ===
> See ./test-suite.log
> Please report to netdev@vger.kernel.org
> =========================================================================
> ===
> make[3]: *** [Makefile:1942: test-suite.log] Error 1
> make[3]: Leaving directory '/home/linville/git/ethtool/ethtool-
> 4.19/_build/sub'
> make[2]: *** [Makefile:2050: check-TESTS] Error 2
> make[2]: Leaving directory '/home/linville/git/ethtool/ethtool-
> 4.19/_build/sub'
> make[1]: *** [Makefile:2264: check-am] Error 2
> make[1]: Leaving directory '/home/linville/git/ethtool/ethtool-
> 4.19/_build/sub'
> make: *** [Makefile:2186: distcheck] Error 1
>
> ...
>
> I'll attach ./ethtool-4.19/_build/sub/test-suite.log to this
> message. Obviously we need whatever additional changes are needed to
> get 'make check-TESTS' to pass legitimately.
Interesting that we did not see this in testing. I will work with Nick to
provide an updated patch, resolves your distcheck failure.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2019-01-31 6:30 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-01-17 23:03 [ethtool 1/6] ethtool: move option parsing related code into function Nicholas Nunley
2019-01-17 23:03 ` [ethtool 2/6] ethtool: move cmdline_coalesce out of do_scoalesce Nicholas Nunley
2019-01-17 23:03 ` [ethtool 3/6] ethtool: introduce new ioctl for per-queue settings Nicholas Nunley
2019-01-17 23:03 ` [ethtool 4/6] ethtool: support per-queue sub command --show-coalesce Nicholas Nunley
2019-01-17 23:03 ` [ethtool 5/6] ethtool: support per-queue sub command --coalesce Nicholas Nunley
2019-01-17 23:03 ` [ethtool 6/6] ethtool: fix up dump_coalesce output to match actual option names Nicholas Nunley
2019-01-30 21:08 ` [ethtool 1/6] ethtool: move option parsing related code into function John W. Linville
2019-01-31 6:30 ` Jeff Kirsher
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).