From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 677FBC43381 for ; Fri, 1 Mar 2019 08:15:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 410262186A for ; Fri, 1 Mar 2019 08:15:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733235AbfCAIPn (ORCPT ); Fri, 1 Mar 2019 03:15:43 -0500 Received: from mga09.intel.com ([134.134.136.24]:32464 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732532AbfCAIPl (ORCPT ); Fri, 1 Mar 2019 03:15:41 -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; 01 Mar 2019 00:15:40 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,426,1544515200"; d="scan'208";a="120055238" Received: from jtkirshe-desk1.jf.intel.com ([134.134.177.96]) by orsmga006.jf.intel.com with ESMTP; 01 Mar 2019 00:15:40 -0800 From: Jeff Kirsher To: linville@tuxdriver.com Cc: Nicholas Nunley , netdev@vger.kernel.org Subject: [PATCH v3 5/6] ethtool: support per-queue sub command --coalesce Date: Fri, 1 Mar 2019 00:15:31 -0800 Message-Id: <20190301081532.11771-5-jeffrey.t.kirsher@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190301081532.11771-1-jeffrey.t.kirsher@intel.com> References: <20190301081532.11771-1-jeffrey.t.kirsher@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 --per-queue eth5 queue_mask 0x1 --coalesce rx-usecs 10 tx-usecs 5 $ sudo ./ethtool --per-queue 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 --- ethtool.8.in | 3 ++- ethtool.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/ethtool.8.in b/ethtool.8.in index b4e240e..2f788f3 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 -Sub command to apply. The supported sub commands include --show-coalesce. +Sub command to apply. 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 1abf7c0..2296578 100644 --- a/ethtool.c +++ b/ethtool.c @@ -5274,7 +5274,7 @@ static const struct option { { "--set-fec", 1, do_sfec, "Set FEC settings", " [ encoding auto|off|rs|baser [...]]\n"}, { "-Q|--per-queue", 1, do_perqueue, "Apply 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" }, @@ -5364,6 +5364,57 @@ 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, + int n_queues) +{ + 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; + struct ethtool_coalesce *ecoal_q; + int gcoalesce_changed = 0; + int i, idx = 0; + + parse_generic_cmdline(ctx, &gcoalesce_changed, + cmdline_coalesce, ARRAY_SIZE(cmdline_coalesce)); + + ecoal_q = (struct ethtool_coalesce *)(per_queue_opt + 1); + 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, ecoal_q + idx, + 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(ecoal_q + idx, &ecoal, + sizeof(struct ethtool_coalesce)); + idx++; + } + mask = mask >> 1; + queue++; + } + if (idx == n_queues) + break; + } + + 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; @@ -5426,6 +5477,17 @@ static int do_perqueue(struct cmd_context *ctx) } dump_per_queue_coalesce(per_queue_opt, queue_mask, n_queues); 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, n_queues); + free(per_queue_opt); } else { perror("The subcommand is not supported yet"); return -EOPNOTSUPP; -- 2.20.1