From nobody Thu Apr 2 01:23:38 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 481DE277C81 for ; Tue, 31 Mar 2026 03:56:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774929403; cv=none; b=YaK4zb5N8in8nD/0wlKMxWQNuAciJIYIbvm25sKOtnKljKj0q03sCPS09Kpb/wqbTQyq8UCxBEUsdOA3h6FAjXMy6EHOJVEiiGjFrT2UEoVlQrAtsy+VoEcMHp9m5pr8C0rWg5jtw5WEYovtyOlsqQZh5XhL+QU2aF+jxeWBycw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774929403; c=relaxed/simple; bh=lO90n7TQ7viTYcHE5z6RbYwdo3N9dITEVnLpSdhoKiI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=E1y7UR53OYpJoC8gLVObBlkWEhxWAhGCuHytc/MO5tHByEi9D4wP8oZzbr2y0RqX5r/TVtCNBrUpk8XGiMRwjkg207+j9Ll+D6NaRGH2BtBLLW6VY/wy2Nbus5uZ6pZMSP14kercQ72lIOT7/FoeoHj1DCwKEnqaXwwTRxMUJDs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=A53RacYy; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="A53RacYy" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2aaf43014d0so34812475ad.2 for ; Mon, 30 Mar 2026 20:56:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774929401; x=1775534201; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=1XBvzRLrpjXV3/hRXV2JjUvNJhrfkyfV/lSyUFxhz4k=; b=A53RacYyqQMLjwmsXTyje9tNh40CWXf7jKR6mP15ezMKmdE2OOg3X1Ky9gK8YoeUHE pyAQZlQKRstDD81opJlNcheDLO/XBczULvjaG0+bnF+tGXe3+xvc+tgJcMoO5+FG0Elh G3i0rqS7c1T7FaZ1Nm9icRJISVN9UFo5FfTtF34RR41AZ5R/huhO1mKJXi1rbo1TtNUG k43EcEjWGsj7jM/+s6mNWz7WOT5WiRPkQ6j7Wbeu1ZA7+FoUZmYuQBUC7yz3qYlM0dDo aQRhGW2Qz6isA4PIc2r5lBJdsv3skzs4r/CVG3jkmYy83JaObPImGCsFnKZp93+P8P4M vUuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774929401; x=1775534201; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=1XBvzRLrpjXV3/hRXV2JjUvNJhrfkyfV/lSyUFxhz4k=; b=elC5HU9FAU1pcQKTeYpOrGiPpluPBi/FqNBJKFcpISJnaJdQmjppEJunwwZpMHUKkR 4Bv7lUD+q9Rr9u+wPXorxG+7CorTcqK/4XDUT2h/Q8xOTxlvmiHnqFHVAU5yRcR6ssFl mTy3KXavWO59sLBk/2euhgAMhr/R/7k8V7s2CgQkPkbJstHNVSnx8TtNxHi+1GykKKf2 f/kCcyQCtU0oJCRNAw0e5iV4Q+XkzWUN4LzNLGfXUiwdcn/U5q76P/lj1gkaqy4UAP0m zeAGmXX/JF+YbK8dFcqJqgFrIZSyiWK0s+ojUuPOHJpyQlqaG2+rWBR+oM4DVRJE5ySj 1S2Q== X-Forwarded-Encrypted: i=1; AJvYcCXWzwxFDGpHuJVq90upuHC46EPfx49XEV5zPZ273qm0hdYpuDncZL/KMc06fZi4fpXdBjufmot1q0qFkA4=@vger.kernel.org X-Gm-Message-State: AOJu0YwCMCTdvaPCnVKgDq1+Zp75HEJDCXW3PYqsoz3sw8OHrSuzWUZw m2fkwm+PqES4Xwoa9TQ8tbX60F0O8BoQ/P8otYamxW18Vsq9HRCOKiMzbvFOVkR8I2e73Q== X-Gm-Gg: ATEYQzwtGCrBA1BJNrOluEP1xkgCnv10uPEfI7L0L0uvDgGcXG7go1ofUNI1BrhY1dJ nJhS9/eThUcrTGb3rSwI0dR3tm6sbr6DwmsOWyZitZhm7yvMc6He2gL/GaYc6nsQp6bvIpKlESM mf1yC4hab2xq794kG+//FDYB5NGhRpXqWRIm7Wki/xvpQzSz+3XSR1Q3mdiQYmsT9wnegdLvb+a wct5rWDt6nzSPk2pk1txVT/Xgp6HGDO23rfD45kKEOVeZNzq2iZggUfUD22Y+jQLqUAsHivwTCt tBlCaAckmHVAEwNU89KaDEwI3XI5I+rEQpqZvnjCghGRrVEBNTcP1shESVR/ZUEomScT84Zwx+5 NcuWBA7NSz9NCaPd7N5E6cy7XgqWVgHJfN+q5IvuT5mWuPAcNKkvr9miDpc0/eXJWAIEysbfi6g Um/6yN8KyolRwQRiss8zeof8i9/0KCnRPWQN2oaJrhZrm/JVIisLNikqySXUpkDrZeJ7tH7aZco JSUc+sfTnqC7KLPjIkzaSa0kTps7ePz5dI3Gtyq9oirgAaLmdI= X-Received: by 2002:a17:902:fc4b:b0:2aa:d67b:ef96 with SMTP id d9443c01a7336-2b0cdcaa72dmr158027155ad.31.1774929401348; Mon, 30 Mar 2026 20:56:41 -0700 (PDT) Received: from 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa ([240e:34c:5765:500:c92f:4f4e:9953:45b7]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b24266e487sm94680625ad.24.2026.03.30.20.56.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Mar 2026 20:56:40 -0700 (PDT) From: Hangbin Liu Date: Tue, 31 Mar 2026 11:56:11 +0800 Subject: [PATCH net-next 1/4] tools: ynl: ethtool: use doit instead of dumpit for per-device GET Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260331-b4-ynl_ethtool-v1-1-dda2a9b55df8@gmail.com> References: <20260331-b4-ynl_ethtool-v1-0-dda2a9b55df8@gmail.com> In-Reply-To: <20260331-b4-ynl_ethtool-v1-0-dda2a9b55df8@gmail.com> To: Donald Hunter , Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Simon Horman , Andrew Lunn Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Hangbin Liu X-Mailer: b4 0.14.3 Rename the local helper doit() to do_set() and dumpit() to do_get() to better reflect their purpose. Convert do_get() to use ynl.do() with an explicit device header instead of ynl.dump() followed by client-side filtering. This is more efficient as the kernel only processes and returns data for the requested device, rather than dumping all devices across the netns. Signed-off-by: Hangbin Liu --- tools/net/ynl/pyynl/ethtool.py | 68 ++++++++++++++++++++------------------= ---- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/tools/net/ynl/pyynl/ethtool.py b/tools/net/ynl/pyynl/ethtool.py index f1a2a2a89985..8bf234d594b3 100755 --- a/tools/net/ynl/pyynl/ethtool.py +++ b/tools/net/ynl/pyynl/ethtool.py @@ -84,9 +84,9 @@ def print_speed(name, value): speed =3D [ k for k, v in value.items() if v and speed_re.match(k) ] print(f'{name}: {" ".join(speed)}') =20 -def doit(ynl, args, op_name): +def do_set(ynl, args, op_name): """ - Prepare request header, parse arguments and doit. + Prepare request header, parse arguments and do a set operation. """ req =3D { 'header': { @@ -97,26 +97,24 @@ def doit(ynl, args, op_name): args_to_req(ynl, op_name, args.args, req) ynl.do(op_name, req) =20 -def dumpit(ynl, args, op_name, extra=3DNone): +def do_get(ynl, args, op_name, extra=3DNone): """ - Prepare request header, parse arguments and dumpit (filtering out the - devices we're not interested in). + Prepare request header and get info for a specific device using doit. """ extra =3D extra or {} - reply =3D ynl.dump(op_name, { 'header': {} } | extra) + req =3D {'header': {'dev-name': args.device}} + req['header'].update(extra.pop('header', {})) + req.update(extra) + + reply =3D ynl.do(op_name, req) if not reply: return {} =20 - for msg in reply: - if msg['header']['dev-name'] =3D=3D args.device: - if args.json: - pprint.PrettyPrinter().pprint(msg) - sys.exit(0) - msg.pop('header', None) - return msg - - print(f"Not supported for device {args.device}") - sys.exit(1) + if args.json: + pprint.PrettyPrinter().pprint(reply) + sys.exit(0) + reply.pop('header', None) + return reply =20 def bits_to_dict(attr): """ @@ -181,15 +179,15 @@ def main(): return =20 if args.set_eee: - doit(ynl, args, 'eee-set') + do_set(ynl, args, 'eee-set') return =20 if args.set_pause: - doit(ynl, args, 'pause-set') + do_set(ynl, args, 'pause-set') return =20 if args.set_coalesce: - doit(ynl, args, 'coalesce-set') + do_set(ynl, args, 'coalesce-set') return =20 if args.set_features: @@ -198,20 +196,20 @@ def main(): return =20 if args.set_channels: - doit(ynl, args, 'channels-set') + do_set(ynl, args, 'channels-set') return =20 if args.set_ring: - doit(ynl, args, 'rings-set') + do_set(ynl, args, 'rings-set') return =20 if args.show_priv_flags: - flags =3D bits_to_dict(dumpit(ynl, args, 'privflags-get')['flags']) + flags =3D bits_to_dict(do_get(ynl, args, 'privflags-get')['flags']) print_field(flags) return =20 if args.show_eee: - eee =3D dumpit(ynl, args, 'eee-get') + eee =3D do_get(ynl, args, 'eee-get') ours =3D bits_to_dict(eee['modes-ours']) peer =3D bits_to_dict(eee['modes-peer']) =20 @@ -232,18 +230,18 @@ def main(): return =20 if args.show_pause: - print_field(dumpit(ynl, args, 'pause-get'), + print_field(do_get(ynl, args, 'pause-get'), ('autoneg', 'Autonegotiate', 'bool'), ('rx', 'RX', 'bool'), ('tx', 'TX', 'bool')) return =20 if args.show_coalesce: - print_field(dumpit(ynl, args, 'coalesce-get')) + print_field(do_get(ynl, args, 'coalesce-get')) return =20 if args.show_features: - reply =3D dumpit(ynl, args, 'features-get') + reply =3D do_get(ynl, args, 'features-get') available =3D bits_to_dict(reply['hw']) requested =3D bits_to_dict(reply['wanted']).keys() active =3D bits_to_dict(reply['active']).keys() @@ -270,7 +268,7 @@ def main(): return =20 if args.show_channels: - reply =3D dumpit(ynl, args, 'channels-get') + reply =3D do_get(ynl, args, 'channels-get') print(f'Channel parameters for {args.device}:') =20 print('Pre-set maximums:') @@ -290,7 +288,7 @@ def main(): return =20 if args.show_ring: - reply =3D dumpit(ynl, args, 'channels-get') + reply =3D do_get(ynl, args, 'channels-get') =20 print(f'Ring parameters for {args.device}:') =20 @@ -319,7 +317,7 @@ def main(): print('NIC statistics:') =20 # TODO: pass id? - strset =3D dumpit(ynl, args, 'strset-get') + strset =3D do_get(ynl, args, 'strset-get') pprint.PrettyPrinter().pprint(strset) =20 req =3D { @@ -338,7 +336,7 @@ def main(): }, } =20 - rsp =3D dumpit(ynl, args, 'stats-get', req) + rsp =3D do_get(ynl, args, 'stats-get', req) pprint.PrettyPrinter().pprint(rsp) return =20 @@ -349,7 +347,7 @@ def main(): }, } =20 - tsinfo =3D dumpit(ynl, args, 'tsinfo-get', req) + tsinfo =3D do_get(ynl, args, 'tsinfo-get', req) =20 print(f'Time stamping parameters for {args.device}:') =20 @@ -377,7 +375,7 @@ def main(): return =20 print(f'Settings for {args.device}:') - linkmodes =3D dumpit(ynl, args, 'linkmodes-get') + linkmodes =3D do_get(ynl, args, 'linkmodes-get') ours =3D bits_to_dict(linkmodes['ours']) =20 supported_ports =3D ('TP', 'AUI', 'BNC', 'MII', 'FIBRE', 'Backplane') @@ -425,7 +423,7 @@ def main(): 5: 'Directly Attached Copper', 0xef: 'None', } - linkinfo =3D dumpit(ynl, args, 'linkinfo-get') + linkinfo =3D do_get(ynl, args, 'linkinfo-get') print(f'Port: {ports.get(linkinfo["port"], "Other")}') =20 print_field(linkinfo, ('phyaddr', 'PHYAD')) @@ -447,11 +445,11 @@ def main(): mdix =3D mdix_ctrl.get(linkinfo['tp-mdix'], 'Unknown (auto)') print(f'MDI-X: {mdix}') =20 - debug =3D dumpit(ynl, args, 'debug-get') + debug =3D do_get(ynl, args, 'debug-get') msgmask =3D bits_to_dict(debug.get("msgmask", [])).keys() print(f'Current message level: {" ".join(msgmask)}') =20 - linkstate =3D dumpit(ynl, args, 'linkstate-get') + linkstate =3D do_get(ynl, args, 'linkstate-get') detected_states =3D { 0: 'no', 1: 'yes', --=20 Git-155)