From patchwork Wed Feb 6 00:01:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kirsher, Jeffrey T" X-Patchwork-Id: 1037274 X-Patchwork-Delegate: linville@tuxdriver.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=fail (p=none dis=none) header.from=intel.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43vM6h1f89z9s7T for ; Wed, 6 Feb 2019 11:01:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726622AbfBFABN (ORCPT ); Tue, 5 Feb 2019 19:01:13 -0500 Received: from mga09.intel.com ([134.134.136.24]:8499 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725967AbfBFABN (ORCPT ); Tue, 5 Feb 2019 19:01:13 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Feb 2019 16:01:12 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,337,1544515200"; d="scan'208";a="113999003" Received: from jtkirshe-desk1.jf.intel.com ([134.134.177.96]) by orsmga006.jf.intel.com with ESMTP; 05 Feb 2019 16:01:12 -0800 From: Jeff Kirsher To: linville@tuxdriver.com Cc: Nicholas Nunley , netdev@vger.kernel.org, nhorman@redhat.com, sassmann@redhat.com, Jeff Kirsher Subject: [PATCH v2 1/6] ethtool: move option parsing related code into function Date: Tue, 5 Feb 2019 16:01:01 -0800 Message-Id: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nicholas Nunley Move option parsing code into find_option function. No behavior changes. Based on patch by Kan Liang Signed-off-by: Nicholas Nunley Signed-off-by: Jeff Kirsher --- ethtool.c | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/ethtool.c b/ethtool.c index 2f7e96b..8b7c224 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(); From patchwork Wed Feb 6 00:01:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kirsher, Jeffrey T" X-Patchwork-Id: 1037276 X-Patchwork-Delegate: linville@tuxdriver.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=fail (p=none dis=none) header.from=intel.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43vM6k62lTz9sDr for ; Wed, 6 Feb 2019 11:01:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727004AbfBFABR (ORCPT ); Tue, 5 Feb 2019 19:01:17 -0500 Received: from mga09.intel.com ([134.134.136.24]:8499 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726456AbfBFABO (ORCPT ); Tue, 5 Feb 2019 19:01:14 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Feb 2019 16:01:13 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,337,1544515200"; d="scan'208";a="113999006" Received: from jtkirshe-desk1.jf.intel.com ([134.134.177.96]) by orsmga006.jf.intel.com with ESMTP; 05 Feb 2019 16:01:12 -0800 From: Jeff Kirsher To: linville@tuxdriver.com Cc: Nicholas Nunley , netdev@vger.kernel.org, nhorman@redhat.com, sassmann@redhat.com, Jeff Kirsher Subject: [PATCH v2 2/6] ethtool: move cmdline_coalesce out of do_scoalesce Date: Tue, 5 Feb 2019 16:01:02 -0800 Message-Id: <20190206000106.24364-2-jeffrey.t.kirsher@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> References: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nicholas Nunley Move the definition of cmdline_coalesce out of do_scoalesce and into a macro so it can be reused across functions. No behavior change. Based on patch by Kan Liang Signed-off-by: Nicholas Nunley Signed-off-by: Jeff Kirsher --- ethtool.c | 142 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 74 insertions(+), 68 deletions(-) diff --git a/ethtool.c b/ethtool.c index 8b7c224..af266c5 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, From patchwork Wed Feb 6 00:01:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kirsher, Jeffrey T" X-Patchwork-Id: 1037279 X-Patchwork-Delegate: linville@tuxdriver.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=fail (p=none dis=none) header.from=intel.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43vM6s2BV8z9s7T for ; Wed, 6 Feb 2019 11:01:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727191AbfBFABY (ORCPT ); Tue, 5 Feb 2019 19:01:24 -0500 Received: from mga09.intel.com ([134.134.136.24]:8499 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725967AbfBFABO (ORCPT ); Tue, 5 Feb 2019 19:01:14 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Feb 2019 16:01:13 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,337,1544515200"; d="scan'208";a="113999009" Received: from jtkirshe-desk1.jf.intel.com ([134.134.177.96]) by orsmga006.jf.intel.com with ESMTP; 05 Feb 2019 16:01:13 -0800 From: Jeff Kirsher To: linville@tuxdriver.com Cc: Nicholas Nunley , netdev@vger.kernel.org, nhorman@redhat.com, sassmann@redhat.com, Jeff Kirsher Subject: [PATCH v2 3/6] ethtool: introduce new ioctl for per-queue settings Date: Tue, 5 Feb 2019 16:01:03 -0800 Message-Id: <20190206000106.24364-3-jeffrey.t.kirsher@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> References: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nicholas Nunley 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 Signed-off-by: Nicholas Nunley Signed-off-by: Jeff Kirsher --- 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 af266c5..4dc725c 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 *); From patchwork Wed Feb 6 00:01:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kirsher, Jeffrey T" X-Patchwork-Id: 1037275 X-Patchwork-Delegate: linville@tuxdriver.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=fail (p=none dis=none) header.from=intel.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43vM6j4md2z9s7T for ; Wed, 6 Feb 2019 11:01:17 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726865AbfBFABQ (ORCPT ); Tue, 5 Feb 2019 19:01:16 -0500 Received: from mga09.intel.com ([134.134.136.24]:8500 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726624AbfBFABO (ORCPT ); Tue, 5 Feb 2019 19:01:14 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Feb 2019 16:01:13 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,337,1544515200"; d="scan'208";a="113999012" Received: from jtkirshe-desk1.jf.intel.com ([134.134.177.96]) by orsmga006.jf.intel.com with ESMTP; 05 Feb 2019 16:01:13 -0800 From: Jeff Kirsher To: linville@tuxdriver.com Cc: Nicholas Nunley , netdev@vger.kernel.org, nhorman@redhat.com, sassmann@redhat.com, Jeff Kirsher Subject: [PATCH v2 4/6] ethtool: support per-queue sub command --show-coalesce Date: Tue, 5 Feb 2019 16:01:04 -0800 Message-Id: <20190206000106.24364-4-jeffrey.t.kirsher@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> References: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nicholas Nunley 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 Signed-off-by: Nicholas Nunley Signed-off-by: Jeff Kirsher --- 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 4dc725c..9a1b83b 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; } From patchwork Wed Feb 6 00:01:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kirsher, Jeffrey T" X-Patchwork-Id: 1037277 X-Patchwork-Delegate: linville@tuxdriver.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=fail (p=none dis=none) header.from=intel.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43vM6m23zWz9s7T for ; Wed, 6 Feb 2019 11:01:20 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727097AbfBFABT (ORCPT ); Tue, 5 Feb 2019 19:01:19 -0500 Received: from mga09.intel.com ([134.134.136.24]:8500 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726767AbfBFABP (ORCPT ); Tue, 5 Feb 2019 19:01:15 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Feb 2019 16:01:13 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,337,1544515200"; d="scan'208";a="113999015" Received: from jtkirshe-desk1.jf.intel.com ([134.134.177.96]) by orsmga006.jf.intel.com with ESMTP; 05 Feb 2019 16:01:13 -0800 From: Jeff Kirsher To: linville@tuxdriver.com Cc: Nicholas Nunley , netdev@vger.kernel.org, nhorman@redhat.com, sassmann@redhat.com, Jeff Kirsher Subject: [PATCH v2 5/6] ethtool: support per-queue sub command --coalesce Date: Tue, 5 Feb 2019 16:01:05 -0800 Message-Id: <20190206000106.24364-5-jeffrey.t.kirsher@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> References: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nicholas Nunley 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 Signed-off-by: Nicholas Nunley Signed-off-by: Jeff Kirsher --- 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 9a1b83b..01bdaf1 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; From patchwork Wed Feb 6 00:01:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kirsher, Jeffrey T" X-Patchwork-Id: 1037278 X-Patchwork-Delegate: linville@tuxdriver.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=fail (p=none dis=none) header.from=intel.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43vM6n25Tqz9sDr for ; Wed, 6 Feb 2019 11:01:21 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727166AbfBFABU (ORCPT ); Tue, 5 Feb 2019 19:01:20 -0500 Received: from mga09.intel.com ([134.134.136.24]:8499 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726882AbfBFABQ (ORCPT ); Tue, 5 Feb 2019 19:01:16 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Feb 2019 16:01:13 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,337,1544515200"; d="scan'208";a="113999018" Received: from jtkirshe-desk1.jf.intel.com ([134.134.177.96]) by orsmga006.jf.intel.com with ESMTP; 05 Feb 2019 16:01:13 -0800 From: Jeff Kirsher To: linville@tuxdriver.com Cc: Nicholas Nunley , netdev@vger.kernel.org, nhorman@redhat.com, sassmann@redhat.com, Jeff Kirsher Subject: [PATCH v2 6/6] ethtool: fix up dump_coalesce output to match actual option names Date: Tue, 5 Feb 2019 16:01:06 -0800 Message-Id: <20190206000106.24364-6-jeffrey.t.kirsher@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> References: <20190206000106.24364-1-jeffrey.t.kirsher@intel.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nicholas Nunley 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 Signed-off-by: Jeff Kirsher --- ethtool.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ethtool.c b/ethtool.c index 01bdaf1..03e5008 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,