From patchwork Wed Dec 6 18:21:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482132 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="OkKblQml" Received: from mail-ej1-x632.google.com (mail-ej1-x632.google.com [IPv6:2a00:1450:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EAD2F139 for ; Wed, 6 Dec 2023 10:21:25 -0800 (PST) Received: by mail-ej1-x632.google.com with SMTP id a640c23a62f3a-a1db99cd1b2so3106166b.2 for ; Wed, 06 Dec 2023 10:21:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886884; x=1702491684; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CLuPH9knSzWO+PbfNJ8XFJ7ffEL7k13puMEmm91Trcs=; b=OkKblQmlyo3W10P7picsFdwLh9NWhlnd9KKvdZZnr3JSVmgEDB9GORGdRxBUenukWr 2Lb9UZyOj82SNwlOKC9HOtX7NQYH0KfnRsIlnc1r/JmDUZUQgIVpeA0qyVS6vCJkj5jB cpYJelAq8zy/GqkU9NlIT/Gz2DAYrkiS+AJ3Z9tKlR0jckaWgjVeDkkFb0mHC3CkZ9/J nwQ33n5YmpCNUsf5RybVIOYqfvLj3bYFYigBuxTIMY9Mqu8ry58J+vt+LId5lwP3u0da 6NMMp2SQdeaxDCOJxI0ai0Jb82nbV+Dv5+ISKCLr0XlnsJ6L7BoaOyRwCIviv91U3bev dxng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886884; x=1702491684; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CLuPH9knSzWO+PbfNJ8XFJ7ffEL7k13puMEmm91Trcs=; b=I3AbG/gRSb2HdqwVrQIAlQ+tr2/QuygC2rjDCbsUJIeqcpWc+G8QGn13gD938Fbu+O qJaIbwrARfftsdwL/tT2qTcKVFkVD/8trd0aNqzAgFSM/tBa5QgNgHKSNy4NN1GA3g95 STK4wMQtQB65W2YagpZ6wLA/b+VFkE5LGifiAv5KVqfmBdvuV2BQaUzyrGQyQe1xeedp WxjzYcKR7vvSXz5wCExsywLODABezszAiTvjMqg6NuaFtihIeRTZAUh8ae7TQFdQMQGn MVKlnz8+4Pl31NdKGZb8Se7w8Dydw8OjK8l6GKphInMlsl6i3Wnqd33cXjcMu1OOjrhu kuYg== X-Gm-Message-State: AOJu0YwOsMz0dPPixFv9YQift6TWV7WqMaw2zouCmTo62mT67uSHfQSi HXK+VLZdKYpXXduvQZNlc77CAORPfHpC+19smMI= X-Google-Smtp-Source: AGHT+IGBr5IbfhiRMfXjoytuaTIuhUGHHgwDzLVRKkxP5ZS80nIXRabxIR+4rut4OuYNxJi10kDIxw== X-Received: by 2002:a17:906:11d8:b0:a19:a19b:420d with SMTP id o24-20020a17090611d800b00a19a19b420dmr578428eja.120.1701886884460; Wed, 06 Dec 2023 10:21:24 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id v6-20020a170906564600b00a1dbda310f4sm249912ejr.158.2023.12.06.10.21.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:23 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 1/9] devlink: use devl_is_registered() helper instead xa_get_mark() Date: Wed, 6 Dec 2023 19:21:12 +0100 Message-ID: <20231206182120.957225-2-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Instead of checking the xarray mark directly using xa_get_mark() helper use devl_is_registered() helper which wraps it up. Note that there are couple more users of xa_get_mark() left which are going to be handled by the next patch. Signed-off-by: Jiri Pirko --- net/devlink/dev.c | 4 ++-- net/devlink/rate.c | 2 +- net/devlink/trap.c | 9 ++++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/net/devlink/dev.c b/net/devlink/dev.c index 918a0395b03e..3fe93c8a9fe2 100644 --- a/net/devlink/dev.c +++ b/net/devlink/dev.c @@ -202,7 +202,7 @@ static void devlink_notify(struct devlink *devlink, enum devlink_command cmd) int err; WARN_ON(cmd != DEVLINK_CMD_NEW && cmd != DEVLINK_CMD_DEL); - WARN_ON(!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)); + WARN_ON(!devl_is_registered(devlink)); msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); if (!msg) @@ -999,7 +999,7 @@ static void __devlink_flash_update_notify(struct devlink *devlink, cmd != DEVLINK_CMD_FLASH_UPDATE_END && cmd != DEVLINK_CMD_FLASH_UPDATE_STATUS); - if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) + if (!devl_is_registered(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/rate.c b/net/devlink/rate.c index 94b289b93ff2..e2190cf22beb 100644 --- a/net/devlink/rate.c +++ b/net/devlink/rate.c @@ -146,7 +146,7 @@ static void devlink_rate_notify(struct devlink_rate *devlink_rate, WARN_ON(cmd != DEVLINK_CMD_RATE_NEW && cmd != DEVLINK_CMD_RATE_DEL); - if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) + if (!devl_is_registered(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/trap.c b/net/devlink/trap.c index c26313e7ca08..908085e2c990 100644 --- a/net/devlink/trap.c +++ b/net/devlink/trap.c @@ -1173,7 +1173,8 @@ devlink_trap_group_notify(struct devlink *devlink, WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_GROUP_NEW && cmd != DEVLINK_CMD_TRAP_GROUP_DEL); - if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) + + if (!devl_is_registered(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); @@ -1234,7 +1235,8 @@ static void devlink_trap_notify(struct devlink *devlink, WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_NEW && cmd != DEVLINK_CMD_TRAP_DEL); - if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) + + if (!devl_is_registered(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); @@ -1710,7 +1712,8 @@ devlink_trap_policer_notify(struct devlink *devlink, WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_POLICER_NEW && cmd != DEVLINK_CMD_TRAP_POLICER_DEL); - if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) + + if (!devl_is_registered(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); From patchwork Wed Dec 6 18:21:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482134 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="kuEVFYUS" Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CBB8818D for ; Wed, 6 Dec 2023 10:21:27 -0800 (PST) Received: by mail-ed1-x52b.google.com with SMTP id 4fb4d7f45d1cf-54c5d041c23so95869a12.2 for ; Wed, 06 Dec 2023 10:21:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886886; x=1702491686; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GqAP4zVW3tr3kQv/U3Y5QSJhXtJi2tdSQ5AvLLkkNsk=; b=kuEVFYUS0hP48wShRpL4L9ddfD2uP7sEm9vt6ohWhKJocbtLf6KFFKFYtedEKKvzXg ZHjEd+yXLNTfV3IIhMksXWYT+wP8WKNtY9VjKuc7a53Gk5DkgLDiT8eI9gcwf0O8DPiY 1Pb9kghH1/oCybEJUxsE1J7iI58UkGxs8GJl0mCVE4dAGdYbGBjhD5vYbpZ1rCrQ9Asl G4piEeqjbi+Os15l5WT+p0YChHwxa3CR7di85qoCQ5prqRZFF3k+Ur/KWNeC9dDDftz0 IUie0unLiEt76ur3H87WcoPyNGfe2uiwszPD9DERH/Fmd5PMncIs3EeNFu0c/tKoEx2e QDUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886886; x=1702491686; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GqAP4zVW3tr3kQv/U3Y5QSJhXtJi2tdSQ5AvLLkkNsk=; b=LygFMt9zS9x2C2Ftah1qFPS1eVPeb9fmqtZ6PcXDyxebNOwSKkiZckLrv5FfNxt6T9 z0yxPiGdmH6xv6TL+gKAPlXJXfyXfXnpwqVx3dL4glyts98ptycY4B+xR+LfH0lSVmxX oQhZ63gLtusW0WFk62t+WbILKjscE2zjefOiebPRW54+YRryIemnkEE35sRjC+ORbMAS NX4AxXxLjawtTWHzTVjt7mVS8/hn2S466M6r5USxMeqVPR3OPF9rz8ENIrA4V6L9sqEf k0CQlJdWXHgKyGOcjnXzxcFYl2igmGaerKnh/0+GZxfQmLylO9/Ygj9W9ARHt6C1hPaK FDpQ== X-Gm-Message-State: AOJu0Yz4ywT0q8IUEMF7W4W5HrlkTdzsQoReEV6Ufy5iV/jL/RgTAN5x 3bvfxVIVYjbJWfEkJRBI+0EpsC1oFEwxz6TxrgI= X-Google-Smtp-Source: AGHT+IH9NElVj3xWmaKbAKNfU5eW7LXZCoBz9yyVqL07Kc/vY1lckoBHcjp9thRyiNuTPduSlmPOiw== X-Received: by 2002:a50:999a:0:b0:54c:4fec:f0 with SMTP id m26-20020a50999a000000b0054c4fec00f0mr408191edb.127.1701886886196; Wed, 06 Dec 2023 10:21:26 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id g6-20020a056402114600b0054cb316499dsm254638edw.10.2023.12.06.10.21.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:25 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 2/9] devlink: introduce __devl_is_registered() helper and use it instead of xa_get_mark() Date: Wed, 6 Dec 2023 19:21:13 +0100 Message-ID: <20231206182120.957225-3-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Introduce __devl_is_registered() which does not assert on devlink instance lock and use it in notifications which may be called without devlink instance lock held. Signed-off-by: Jiri Pirko --- net/devlink/devl_internal.h | 7 ++++++- net/devlink/linecard.c | 2 +- net/devlink/port.c | 2 +- net/devlink/region.c | 3 ++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index 5ea2e2012e93..59ae4761d10a 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -91,10 +91,15 @@ extern struct genl_family devlink_nl_family; struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *indexp); +static inline bool __devl_is_registered(struct devlink *devlink) +{ + return xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); +} + static inline bool devl_is_registered(struct devlink *devlink) { devl_assert_locked(devlink); - return xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); + return __devl_is_registered(devlink); } static inline void devl_dev_lock(struct devlink *devlink, bool dev_lock) diff --git a/net/devlink/linecard.c b/net/devlink/linecard.c index 2f1c317b64cd..9d080ac1734b 100644 --- a/net/devlink/linecard.c +++ b/net/devlink/linecard.c @@ -136,7 +136,7 @@ static void devlink_linecard_notify(struct devlink_linecard *linecard, WARN_ON(cmd != DEVLINK_CMD_LINECARD_NEW && cmd != DEVLINK_CMD_LINECARD_DEL); - if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) + if (!__devl_is_registered(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/port.c b/net/devlink/port.c index 7634f187fa50..f229a8699214 100644 --- a/net/devlink/port.c +++ b/net/devlink/port.c @@ -512,7 +512,7 @@ static void devlink_port_notify(struct devlink_port *devlink_port, WARN_ON(cmd != DEVLINK_CMD_PORT_NEW && cmd != DEVLINK_CMD_PORT_DEL); - if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) + if (!__devl_is_registered(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/region.c b/net/devlink/region.c index e3bab458db94..b65181aa269a 100644 --- a/net/devlink/region.c +++ b/net/devlink/region.c @@ -234,7 +234,8 @@ static void devlink_nl_region_notify(struct devlink_region *region, struct sk_buff *msg; WARN_ON(cmd != DEVLINK_CMD_REGION_NEW && cmd != DEVLINK_CMD_REGION_DEL); - if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) + + if (!__devl_is_registered(devlink)) return; msg = devlink_nl_region_notify_build(region, snapshot, cmd, 0, 0); From patchwork Wed Dec 6 18:21:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482135 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="k80AeNr7" Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 90BAF139 for ; Wed, 6 Dec 2023 10:21:29 -0800 (PST) Received: by mail-ed1-x52b.google.com with SMTP id 4fb4d7f45d1cf-54c67b0da54so135322a12.0 for ; Wed, 06 Dec 2023 10:21:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886888; x=1702491688; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=18IfAN7KDIkxv775Ca8YFrG+OIVicTKRVfFS2BJB29I=; b=k80AeNr7B6bnVGqBIs4mm056+1Bb5pEgOfzk3BOPUzssz4nsNbvLvLTxmThe0d8wEx Upxdg1/Tqy14j8xyFzmlbrk8ngE7qmdes6TxrvmwezfBtMOiwAu6iie+FeN2S23aZZYh 2/MpLacSPvJ7AhmFEu55tVGonhdgdUcG/2NGaanjwfCtnlGlVDxD0w99BH0Hy4eP3DXh PRAPnrHwhobZ/5cwLV/j+CgmueAFPMMqwAY6wAIGHZpdG7Ot11nHUfJiwUtD02yYG1B/ LEC2l/TBBr1pA/ZFX/LHw2g9UZFGPrkJZ8TmAbxfe9FUKL5xHDpmEm9tPzGMg2KG2diy CJuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886888; x=1702491688; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=18IfAN7KDIkxv775Ca8YFrG+OIVicTKRVfFS2BJB29I=; b=kbAX4Fd+fWMPhnwaFgVoOcciiCtVEoVrK4rhIBWAqHIq/9YhxPnW5q/SDgCyDn86T3 lyYkwuB8M42NBRwWWSP9PO9lBsLXA9tL5xCPAt+A/gy/I+EycNAgTsH6ZH0zz4VpKHKI x3hedTGsEc3y8OR2hu+r9t4rU2UGI/kjxtjImiNKtILxK2j3wMPOUWB9W3z2bVl3DCt5 HneB0+MbM+oxChAnnLHm9jOuk3dibF83Q8xynw+NAFVHjkn3iLjZGEx7PBDFNNNt7mtY waugrvl96wRvBeRINnc/CB9yL0aMDY5vYCS+51Dj38DWozfcTZOZqO4iJ3M/A7ojMEhq wD5Q== X-Gm-Message-State: AOJu0YzU739bGS9qvqXonpMwIACuUNpdjbYCqUgSVc3GvUyxfm6SxOfD QGmYY0pTe/WrUFCGE3dFQW82GVvWEe2uZesdJlA= X-Google-Smtp-Source: AGHT+IE20AX6K4nkbpgjfYllilSAYVV+rZofbcHnr5xSpu96+lVnMxxunZggsgdYxWDnMZ1H7WcTzg== X-Received: by 2002:aa7:d859:0:b0:54c:4837:81e8 with SMTP id f25-20020aa7d859000000b0054c483781e8mr799809eds.57.1701886887804; Wed, 06 Dec 2023 10:21:27 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id r25-20020aa7c159000000b0054c9177d18esm258004edp.2.2023.12.06.10.21.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:27 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 3/9] devlink: send notifications only if there are listeners Date: Wed, 6 Dec 2023 19:21:14 +0100 Message-ID: <20231206182120.957225-4-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Introduce devlink_nl_notify_need() helper and using it to check at the beginning of notification functions to avoid overhead of composing notification messages in case nobody listens. Signed-off-by: Jiri Pirko --- v4->v5: - swapped order in test in param.c --- net/devlink/dev.c | 5 ++++- net/devlink/devl_internal.h | 6 ++++++ net/devlink/health.c | 3 +++ net/devlink/linecard.c | 2 +- net/devlink/param.c | 2 +- net/devlink/port.c | 2 +- net/devlink/rate.c | 2 +- net/devlink/region.c | 2 +- net/devlink/trap.c | 6 +++--- 9 files changed, 21 insertions(+), 9 deletions(-) diff --git a/net/devlink/dev.c b/net/devlink/dev.c index 3fe93c8a9fe2..63fe3e02c928 100644 --- a/net/devlink/dev.c +++ b/net/devlink/dev.c @@ -204,6 +204,9 @@ static void devlink_notify(struct devlink *devlink, enum devlink_command cmd) WARN_ON(cmd != DEVLINK_CMD_NEW && cmd != DEVLINK_CMD_DEL); WARN_ON(!devl_is_registered(devlink)); + if (!devlink_nl_notify_need(devlink)) + return; + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); if (!msg) return; @@ -999,7 +1002,7 @@ static void __devlink_flash_update_notify(struct devlink *devlink, cmd != DEVLINK_CMD_FLASH_UPDATE_END && cmd != DEVLINK_CMD_FLASH_UPDATE_STATUS); - if (!devl_is_registered(devlink)) + if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index 59ae4761d10a..510990de094e 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -185,6 +185,12 @@ int devlink_nl_put_nested_handle(struct sk_buff *msg, struct net *net, struct devlink *devlink, int attrtype); int devlink_nl_msg_reply_and_new(struct sk_buff **msg, struct genl_info *info); +static inline bool devlink_nl_notify_need(struct devlink *devlink) +{ + return genl_has_listeners(&devlink_nl_family, devlink_net(devlink), + DEVLINK_MCGRP_CONFIG); +} + /* Notify */ void devlink_notify_register(struct devlink *devlink); void devlink_notify_unregister(struct devlink *devlink); diff --git a/net/devlink/health.c b/net/devlink/health.c index 71ae121dc739..0795dcf22ca8 100644 --- a/net/devlink/health.c +++ b/net/devlink/health.c @@ -496,6 +496,9 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter, WARN_ON(cmd != DEVLINK_CMD_HEALTH_REPORTER_RECOVER); ASSERT_DEVLINK_REGISTERED(devlink); + if (!devlink_nl_notify_need(devlink)) + return; + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); if (!msg) return; diff --git a/net/devlink/linecard.c b/net/devlink/linecard.c index 9d080ac1734b..45b36975ee6f 100644 --- a/net/devlink/linecard.c +++ b/net/devlink/linecard.c @@ -136,7 +136,7 @@ static void devlink_linecard_notify(struct devlink_linecard *linecard, WARN_ON(cmd != DEVLINK_CMD_LINECARD_NEW && cmd != DEVLINK_CMD_LINECARD_DEL); - if (!__devl_is_registered(devlink)) + if (!__devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/param.c b/net/devlink/param.c index d74df09311a9..7516b524ffb7 100644 --- a/net/devlink/param.c +++ b/net/devlink/param.c @@ -343,7 +343,7 @@ static void devlink_param_notify(struct devlink *devlink, * will replay the notifications if the params are added/removed * outside of the lifetime of the instance. */ - if (!devl_is_registered(devlink)) + if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/port.c b/net/devlink/port.c index f229a8699214..32f4d0331e63 100644 --- a/net/devlink/port.c +++ b/net/devlink/port.c @@ -512,7 +512,7 @@ static void devlink_port_notify(struct devlink_port *devlink_port, WARN_ON(cmd != DEVLINK_CMD_PORT_NEW && cmd != DEVLINK_CMD_PORT_DEL); - if (!__devl_is_registered(devlink)) + if (!__devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/rate.c b/net/devlink/rate.c index e2190cf22beb..0371a2dd3e0a 100644 --- a/net/devlink/rate.c +++ b/net/devlink/rate.c @@ -146,7 +146,7 @@ static void devlink_rate_notify(struct devlink_rate *devlink_rate, WARN_ON(cmd != DEVLINK_CMD_RATE_NEW && cmd != DEVLINK_CMD_RATE_DEL); - if (!devl_is_registered(devlink)) + if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); diff --git a/net/devlink/region.c b/net/devlink/region.c index b65181aa269a..bf61312f64bd 100644 --- a/net/devlink/region.c +++ b/net/devlink/region.c @@ -235,7 +235,7 @@ static void devlink_nl_region_notify(struct devlink_region *region, WARN_ON(cmd != DEVLINK_CMD_REGION_NEW && cmd != DEVLINK_CMD_REGION_DEL); - if (!__devl_is_registered(devlink)) + if (!__devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = devlink_nl_region_notify_build(region, snapshot, cmd, 0, 0); diff --git a/net/devlink/trap.c b/net/devlink/trap.c index 908085e2c990..3ca1ca7e2e64 100644 --- a/net/devlink/trap.c +++ b/net/devlink/trap.c @@ -1174,7 +1174,7 @@ devlink_trap_group_notify(struct devlink *devlink, WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_GROUP_NEW && cmd != DEVLINK_CMD_TRAP_GROUP_DEL); - if (!devl_is_registered(devlink)) + if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); @@ -1236,7 +1236,7 @@ static void devlink_trap_notify(struct devlink *devlink, WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_NEW && cmd != DEVLINK_CMD_TRAP_DEL); - if (!devl_is_registered(devlink)) + if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); @@ -1713,7 +1713,7 @@ devlink_trap_policer_notify(struct devlink *devlink, WARN_ON_ONCE(cmd != DEVLINK_CMD_TRAP_POLICER_NEW && cmd != DEVLINK_CMD_TRAP_POLICER_DEL); - if (!devl_is_registered(devlink)) + if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink)) return; msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); From patchwork Wed Dec 6 18:21:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482136 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="FZoZl3PJ" Received: from mail-ej1-x634.google.com (mail-ej1-x634.google.com [IPv6:2a00:1450:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A06D122 for ; Wed, 6 Dec 2023 10:21:31 -0800 (PST) Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-a00cbb83c80so4278566b.0 for ; Wed, 06 Dec 2023 10:21:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886890; x=1702491690; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Tsnq/J25xaBJGwu2WyLBaKp4IolP8KT1wW4jT6E/oeI=; b=FZoZl3PJdPs2RBVVr7snIEt5Wr9UR6T2DvEBPl2mWxKssgOluE6iAQdRLgdoOjGrl8 lBj0jspV0bdSRDfrEI0sLfGfVWJDllvm1t8kA1Karj/ynPQatFXth7v7anraQ3VM30JK i9fj/+dPy7AOsHyvt0B9jF6cPNidJTSe9TUueIzx4Azav/3p88qD+aRkmNkXS3bDQdB/ ppE3CMIW/6vR5QdlW+F0ZTTcgLfrYVUlakPTWT9a2lll0w65ag1HY7SuxI/POa1Q9oVR H6N4L3mBpIdJYi4Yg2gCVNK5pgIhntNuleUbGK5X8AWemexIXj5rxBPc0jpJ6hxCoA3l UFrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886890; x=1702491690; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Tsnq/J25xaBJGwu2WyLBaKp4IolP8KT1wW4jT6E/oeI=; b=hmH+7y9fa8XgQNG7q9BxjlSrHBo0EY4IdstPnNmbQK+CcAIjNxcaOKk7zT4+SqWoMp 21l2NNqL2xnjo3/bE7H22sofaOfwirEtPhoa9P5Vk0F14CYi7Lto9r1rqcKyI8gOG5mQ 94aSbjI8rJlHVKf41KLzqDMZNi7ONsQc+6DKm8qoLYlhOUoewQpt8vLH5c37MCl3oRAV TtjQYBWO/j2ToXO5uy8a7B53gIcnlXnLRb97kfsywA9ColYwFD/cqShWOqeEN9GUgzRN L91mvwktXpGPWW1LmVpa2xn1tK5TtmdtdGYVrsb7GNFkhKf+4TyOe96A+/Th/OjvfETY h5nA== X-Gm-Message-State: AOJu0YwgxahkRGzeIzo3yjp9n+DNKfdo8IwrpOQQrgsiBWYxn7Y69tVu M3JgGnFmSpSrpixf/4CyMd+dyk0Qt2BlH5hvjvc= X-Google-Smtp-Source: AGHT+IHUgreVyigo76btJ9f5DnqgRY01XG+8ls19/kWRL1i/PIZOn5EcDVNnMIH2T0eglGljIdaUKw== X-Received: by 2002:a17:906:7c4c:b0:a19:a19a:eab7 with SMTP id g12-20020a1709067c4c00b00a19a19aeab7mr846727ejp.112.1701886889941; Wed, 06 Dec 2023 10:21:29 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id c17-20020a170906341100b00a1e1a1dd318sm251476ejb.137.2023.12.06.10.21.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:28 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 4/9] devlink: introduce a helper for netlink multicast send Date: Wed, 6 Dec 2023 19:21:15 +0100 Message-ID: <20231206182120.957225-5-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Introduce a helper devlink_nl_notify_send() so each object notification function does not have to call genlmsg_multicast_netns() with the same arguments. Signed-off-by: Jiri Pirko --- net/devlink/dev.c | 6 ++---- net/devlink/devl_internal.h | 7 +++++++ net/devlink/health.c | 3 +-- net/devlink/linecard.c | 3 +-- net/devlink/param.c | 3 +-- net/devlink/port.c | 3 +-- net/devlink/rate.c | 3 +-- net/devlink/region.c | 3 +-- net/devlink/trap.c | 9 +++------ 9 files changed, 18 insertions(+), 22 deletions(-) diff --git a/net/devlink/dev.c b/net/devlink/dev.c index 63fe3e02c928..19dbf540748a 100644 --- a/net/devlink/dev.c +++ b/net/devlink/dev.c @@ -217,8 +217,7 @@ static void devlink_notify(struct devlink *devlink, enum devlink_command cmd) return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), - msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } int devlink_nl_get_doit(struct sk_buff *skb, struct genl_info *info) @@ -1013,8 +1012,7 @@ static void __devlink_flash_update_notify(struct devlink *devlink, if (err) goto out_free_msg; - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), - msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); return; out_free_msg: diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index 510990de094e..84dc9628d3f2 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -191,6 +191,13 @@ static inline bool devlink_nl_notify_need(struct devlink *devlink) DEVLINK_MCGRP_CONFIG); } +static inline void devlink_nl_notify_send(struct devlink *devlink, + struct sk_buff *msg) +{ + genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), + msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); +} + /* Notify */ void devlink_notify_register(struct devlink *devlink); void devlink_notify_unregister(struct devlink *devlink); diff --git a/net/devlink/health.c b/net/devlink/health.c index 0795dcf22ca8..1d59ec0202f6 100644 --- a/net/devlink/health.c +++ b/net/devlink/health.c @@ -509,8 +509,7 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter, return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, - 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } void diff --git a/net/devlink/linecard.c b/net/devlink/linecard.c index 45b36975ee6f..67f70a621d27 100644 --- a/net/devlink/linecard.c +++ b/net/devlink/linecard.c @@ -150,8 +150,7 @@ static void devlink_linecard_notify(struct devlink_linecard *linecard, return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), - msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } void devlink_linecards_notify_register(struct devlink *devlink) diff --git a/net/devlink/param.c b/net/devlink/param.c index 7516b524ffb7..22bc3b500518 100644 --- a/net/devlink/param.c +++ b/net/devlink/param.c @@ -356,8 +356,7 @@ static void devlink_param_notify(struct devlink *devlink, return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), - msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } static void devlink_params_notify(struct devlink *devlink, diff --git a/net/devlink/port.c b/net/devlink/port.c index 32f4d0331e63..758df3000a1b 100644 --- a/net/devlink/port.c +++ b/net/devlink/port.c @@ -525,8 +525,7 @@ static void devlink_port_notify(struct devlink_port *devlink_port, return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, - 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } static void devlink_ports_notify(struct devlink *devlink, diff --git a/net/devlink/rate.c b/net/devlink/rate.c index 0371a2dd3e0a..7139e67e93ae 100644 --- a/net/devlink/rate.c +++ b/net/devlink/rate.c @@ -159,8 +159,7 @@ static void devlink_rate_notify(struct devlink_rate *devlink_rate, return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, - 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } void devlink_rates_notify_register(struct devlink *devlink) diff --git a/net/devlink/region.c b/net/devlink/region.c index bf61312f64bd..7319127c5913 100644 --- a/net/devlink/region.c +++ b/net/devlink/region.c @@ -242,8 +242,7 @@ static void devlink_nl_region_notify(struct devlink_region *region, if (IS_ERR(msg)) return; - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, - 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } void devlink_regions_notify_register(struct devlink *devlink) diff --git a/net/devlink/trap.c b/net/devlink/trap.c index 3ca1ca7e2e64..5d18c7424df1 100644 --- a/net/devlink/trap.c +++ b/net/devlink/trap.c @@ -1188,8 +1188,7 @@ devlink_trap_group_notify(struct devlink *devlink, return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), - msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } void devlink_trap_groups_notify_register(struct devlink *devlink) @@ -1249,8 +1248,7 @@ static void devlink_trap_notify(struct devlink *devlink, return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), - msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } void devlink_traps_notify_register(struct devlink *devlink) @@ -1727,8 +1725,7 @@ devlink_trap_policer_notify(struct devlink *devlink, return; } - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), - msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + devlink_nl_notify_send(devlink, msg); } void devlink_trap_policers_notify_register(struct devlink *devlink) From patchwork Wed Dec 6 18:21:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482137 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="MCG4//m/" Received: from mail-ed1-x533.google.com (mail-ed1-x533.google.com [IPv6:2a00:1450:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 36BBE18D for ; Wed, 6 Dec 2023 10:21:33 -0800 (PST) Received: by mail-ed1-x533.google.com with SMTP id 4fb4d7f45d1cf-54cde11d0f4so105004a12.2 for ; Wed, 06 Dec 2023 10:21:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886891; x=1702491691; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=c8eRZcUioOUuE0TTLNday3/b0ppj4X7HB0QVPAfV+1E=; b=MCG4//m//B92j3GaGFj32o+9zr3T3LpiPKA2y2pSICwfZbzSnvRNFcO6fg6GhYBajs t8eEANfPjxShMqiAmLrtE/od0fwz/3QtdoPPFBgvR3Q8C6HLlAKk9AlR1OLNMmwgwSkH 0JsF2M8MfBWt1+D60Qe0fyFnTXEgKPPhvPDR4Xqv8aXIo/ztLyQZrdv2TqZtnVayD1aR 8Vozu/iddBjEzR9Nq1SArKggEC6opYmSnIHzOpu3dMBxjVCpANJxiUGulsL7KARceoY7 g/cGLTeehWpZzWuJVbq0PPczPOR97Rm5qVNxTFatb9B8OfA72kbMWJKPBAJY7LK8tERq IKyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886891; x=1702491691; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=c8eRZcUioOUuE0TTLNday3/b0ppj4X7HB0QVPAfV+1E=; b=JTJRuNJExBB978mh+9DtbYlm9lt3deqi9dgahwfIC5zHoeYgmPVWjLq4hSM9sWIFuR P8gGgdR9J6Kk6eNLFt6iZxZ/9+vBVX3liOTwn3sEvdiiq/Wcns/Jdb+7ueMntQ0ZwFJb RpApPashnmWMXC0bSOoBFfHcbK02UClsLzbl/IEzL1inOZF/Su5emsforlbWH2pSXCse AJv0N9uRZjONkd8+TQBubifmWjD87IgYyNkDGh76orkuxswyjadBPdBvL+od5CDVlrga uSK1h0NidInhX+8rnDtu5cd24QnC6ftiMiKpqpwmjlaT6KtF2ATyw3TACFhOCexXVjO9 wm6w== X-Gm-Message-State: AOJu0Yz4h4Bo1nGR+bz5RQiZkCqUX6OK5ga8R5OmSQHJ3RP+acWqaMqI a54Ayg4UI80HnXSE78M/GnJ3uzKIIEsIOmbxw1Y= X-Google-Smtp-Source: AGHT+IH3dR6Pjq3GKO6Rr1LDIMManT4l1jkVSh3Zc94ZvK25bUaEx9NsjklY6D7fxHk7owUJqCSWRQ== X-Received: by 2002:a17:906:6cf:b0:a1d:2739:7776 with SMTP id v15-20020a17090606cf00b00a1d27397776mr893958ejb.12.1701886891746; Wed, 06 Dec 2023 10:21:31 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id e3-20020a1709062c0300b00a1c99f67834sm259349ejh.70.2023.12.06.10.21.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:31 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 5/9] genetlink: introduce per-sock family private storage Date: Wed, 6 Dec 2023 19:21:16 +0100 Message-ID: <20231206182120.957225-6-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Introduce a wrapper sock struct for Generic netlink and store a pointer to family privs xarray. This per socket xarray contains family->id indexed priv storage. Note I used xarray instead of suggested linked list as it is more convenient. Introduce genl_sk_priv_get() to get the family priv pointer and initialize it in case it does not exist. Introduce __genl_sk_priv_get() to obtain family the priv pointer under RCU read lock. Allow family to specify the priv size, init() and destroy() callbacks. Signed-off-by: Jiri Pirko --- v4->v5: - s/Returns/Return/ in function comments - introduced wrapper genl sock struct and store xarray there - changed family helpers to genl_sk_priv_get() and __genl_sk_priv_get() - introduced sock_priv_size for family and use this to allocate the priv in generic netlink code - introduced init/destroy callbacks for family privs v3->v4: - new patch --- include/net/genetlink.h | 6 ++ net/netlink/af_netlink.c | 2 +- net/netlink/af_netlink.h | 15 ++++ net/netlink/genetlink.c | 146 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 1 deletion(-) diff --git a/include/net/genetlink.h b/include/net/genetlink.h index e18a4c0d69ee..dbf11464e96a 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h @@ -87,6 +87,9 @@ struct genl_family { int id; /* starting number of multicast group IDs in this family */ unsigned int mcgrp_offset; + size_t sock_priv_size; + void (*sock_priv_init)(void *priv); + void (*sock_priv_destroy)(void *priv); }; /** @@ -301,6 +304,9 @@ int genl_unregister_family(const struct genl_family *family); void genl_notify(const struct genl_family *family, struct sk_buff *skb, struct genl_info *info, u32 group, gfp_t flags); +void *__genl_sk_priv_get(struct sock *sk, struct genl_family *family); +void *genl_sk_priv_get(struct sock *sk, struct genl_family *family); + void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq, const struct genl_family *family, int flags, u8 cmd); diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 177126fb0484..5683b0ca23b1 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -632,7 +632,7 @@ static void netlink_remove(struct sock *sk) static struct proto netlink_proto = { .name = "NETLINK", .owner = THIS_MODULE, - .obj_size = sizeof(struct netlink_sock), + .obj_size = NETLINK_SOCK_SIZE, }; static int __netlink_create(struct net *net, struct socket *sock, diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h index 2145979b9986..1b3ed8919574 100644 --- a/net/netlink/af_netlink.h +++ b/net/netlink/af_netlink.h @@ -60,6 +60,21 @@ static inline struct netlink_sock *nlk_sk(struct sock *sk) #define nlk_test_bit(nr, sk) test_bit(NETLINK_F_##nr, &nlk_sk(sk)->flags) +struct genl_sock { + struct netlink_sock nlk_sk; + struct xarray *family_privs; +}; + +static inline struct genl_sock *genl_sk(struct sock *sk) +{ + return container_of(nlk_sk(sk), struct genl_sock, nlk_sk); +} + +/* Size of netlink sock is size of the biggest user with priv, + * which is currently just Generic Netlink. + */ +#define NETLINK_SOCK_SIZE sizeof(struct genl_sock) + struct netlink_table { struct rhashtable hash; struct hlist_head mc_list; diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index 92ef5ed2e7b0..51720c2c6bda 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c @@ -22,6 +22,8 @@ #include #include +#include "af_netlink.h" + static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */ static DECLARE_RWSEM(cb_lock); @@ -1699,12 +1701,156 @@ static int genl_bind(struct net *net, int group) return ret; } +struct genl_sk_priv { + void (*destructor)(void *priv); + long priv[]; +}; + +static struct genl_sk_priv *genl_sk_priv_alloc(struct genl_family *family) +{ + struct genl_sk_priv *priv; + + priv = kzalloc(size_add(sizeof(*priv), family->sock_priv_size), + GFP_KERNEL); + if (!priv) + return ERR_PTR(-ENOMEM); + priv->destructor = family->sock_priv_destroy; + if (family->sock_priv_init) + family->sock_priv_init(priv->priv); + return priv; +} + +static void genl_sk_priv_free(struct genl_sk_priv *priv) +{ + if (priv->destructor) + priv->destructor(priv->priv); + kfree(priv); +} + +static void genl_release(struct sock *sk, unsigned long *groups) +{ + struct genl_sock *gsk = genl_sk(sk); + struct genl_sk_priv *priv; + unsigned long family_id; + + if (!gsk->family_privs) + return; + xa_for_each(gsk->family_privs, family_id, priv) { + xa_erase(gsk->family_privs, family_id); + genl_sk_priv_free(priv); + } + xa_destroy(gsk->family_privs); + kfree(gsk->family_privs); +} + +static struct xarray *genl_family_privs_get(struct genl_sock *gsk) +{ + struct xarray *family_privs; + +again: + family_privs = READ_ONCE(gsk->family_privs); + if (family_privs) + return family_privs; + + family_privs = kzalloc(sizeof(*family_privs), GFP_KERNEL); + if (!family_privs) + return ERR_PTR(-ENOMEM); + xa_init_flags(family_privs, XA_FLAGS_ALLOC); + + /* Use genl lock to protect family_privs to be + * initialized in parallel by different CPU. + */ + genl_lock(); + if (unlikely(gsk->family_privs)) { + xa_destroy(family_privs); + kfree(family_privs); + genl_unlock(); + goto again; + } + WRITE_ONCE(gsk->family_privs, family_privs); + genl_unlock(); + return family_privs; +} + +/** + * __genl_sk_priv_get - Get per-socket private pointer for family + * + * @sk: socket + * @family: family + * + * Lookup a private pointer stored per-socket by a specified + * Generic netlink family. + * + * Caller should make sure this is called in RCU read locked section. + * + * Return: valid pointer on success, otherwise NULL. + */ +void *__genl_sk_priv_get(struct sock *sk, struct genl_family *family) +{ + struct genl_sock *gsk = genl_sk(sk); + struct genl_sk_priv *priv; + struct xarray *family_privs; + + family_privs = READ_ONCE(gsk->family_privs); + if (!family_privs) + return NULL; + priv = xa_load(family_privs, family->id); + return priv ? priv->priv : NULL; +} + +/** + * genl_sk_priv_get - Get per-socket private pointer for family + * + * @sk: socket + * @family: family + * + * Store a private pointer per-socket for a specified + * Generic netlink family. + * + * Caller has to make sure this is not called in parallel multiple times + * for the same sock and also in parallel to genl_release() for the same sock. + * + * Return: previously stored private pointer for the family (could be NULL) + * on success, otherwise negative error value encoded by ERR_PTR(). + */ +void *genl_sk_priv_get(struct sock *sk, struct genl_family *family) +{ + struct genl_sk_priv *priv, *old_priv; + struct genl_sock *gsk = genl_sk(sk); + struct xarray *family_privs; + + family_privs = genl_family_privs_get(gsk); + if (IS_ERR(family_privs)) + return ERR_CAST(family_privs); + + priv = xa_load(family_privs, family->id); + if (priv) + return priv->priv; + + /* priv for the family does not exist so far, create it. */ + + priv = genl_sk_priv_alloc(family); + if (IS_ERR(priv)) + return ERR_CAST(priv); + + old_priv = xa_cmpxchg(family_privs, family->id, NULL, priv, GFP_KERNEL); + if (xa_is_err(old_priv)) + return ERR_PTR(xa_err(old_priv)); + else if (!old_priv) + return priv->priv; + + /* Race happened, priv was already inserted. */ + genl_sk_priv_free(priv); + return old_priv->priv; +} + static int __net_init genl_pernet_init(struct net *net) { struct netlink_kernel_cfg cfg = { .input = genl_rcv, .flags = NL_CFG_F_NONROOT_RECV, .bind = genl_bind, + .release = genl_release, }; /* we'll bump the group number right afterwards */ From patchwork Wed Dec 6 18:21:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482138 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="z31cVYNV" Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E8754139 for ; Wed, 6 Dec 2023 10:21:34 -0800 (PST) Received: by mail-ed1-x536.google.com with SMTP id 4fb4d7f45d1cf-54cdef4c913so2463346a12.1 for ; Wed, 06 Dec 2023 10:21:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886893; x=1702491693; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=6+9Re8MPvPIHkS3XLRdqUkErHPRBEm/NXIkcpvf9Izw=; b=z31cVYNVllMIYLbXunbXOKEVQ21dHXWva8QpOScuUKKpN1agKktTYkETHEGZlGM2fV y2EngVmKCF6LxFmp9PxMqTSEX/Lr25vUo3a3B3CNSrNEmJJxTTfuTMOJXg3hahRJdNsz iyOfoao2dNhb3GR7fKFpp7osldmlqxAWb2GFn1qLGHwOMMW3icauy4av0j5FAn8mDiXD jSp5cv7pbTaET1C93TW0YVGC1OJds3H05GA9qMrkBinV0R633wz84LtKcblR7srXzwlU LczWPUERq5rys+BDTG/uS9E4weU2AuThjskFTEjm87FV9zQxI3ci1QpAj8/TvvexaX0d hYwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886893; x=1702491693; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6+9Re8MPvPIHkS3XLRdqUkErHPRBEm/NXIkcpvf9Izw=; b=ln4qKttqeciWdm0yLfuY8HIyihvWFf4fLJEOWlB/dQBNr0J3VTUozHwfR30BY4WvHI stAWSgELU6zGyee77gEWDU3Eb3BQRCV859Moro9tRPBkvbGwjkXXTZNyKI+ANFNCq8Ts b0C2DpQ35imrTSPTh1+KyKO0eGMbCjAN4yq1AEW0RUfPKKDLcoNRZ+hbrxQU6eRg7aoX m7aKK6xCPsieVVuSPtMqSlGHUv9GTUN22om4/X5AKIY2pSGACxYgTFgPZZofTc+kruTe CUCmTk9HxXNiY1SjhyOhFaGHFu5OMRq6WWV2zWgySSLb/ZwgtPNopJMBCQNVk6EupUaA JeIw== X-Gm-Message-State: AOJu0Yy0ZF0XStK7zbL+gPI/Suq0hgd8YvOZuiEBqlj3a5NJQXCU2Wzd cz+xfm5jbB6LjTD0NE6dKJuLMFlitRA0aYwFJaY= X-Google-Smtp-Source: AGHT+IEu+XR1ZXtl1RAic/EPq9i900MVk7fdYQrXjq4wEv4Sq1npUqgTVyKcYoLe2gGYGi4167HYjg== X-Received: by 2002:a17:906:297:b0:a1c:4c3e:99e2 with SMTP id 23-20020a170906029700b00a1c4c3e99e2mr4019197ejf.22.1701886893450; Wed, 06 Dec 2023 10:21:33 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id d22-20020aa7ce16000000b0054cb199600fsm243411edv.67.2023.12.06.10.21.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:32 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 6/9] netlink: introduce typedef for filter function Date: Wed, 6 Dec 2023 19:21:17 +0100 Message-ID: <20231206182120.957225-7-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Make the code using filter function a bit nicer by consolidating the filter function arguments using typedef. Suggested-by: Andy Shevchenko Signed-off-by: Jiri Pirko --- v2->v3: - left the original .c and .h arg names and types inconsistencies for cn_netlink_send_mult() and netlink_broadcast_filtered() v1->v2: - new patch --- drivers/connector/connector.c | 5 ++--- include/linux/connector.h | 3 +-- include/linux/netlink.h | 6 ++++-- net/netlink/af_netlink.c | 3 +-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 7f7b94f616a6..4028e8eeba82 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -59,9 +59,8 @@ static int cn_already_initialized; * both, or if both are zero then the group is looked up and sent there. */ int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 __group, - gfp_t gfp_mask, - int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data), - void *filter_data) + gfp_t gfp_mask, netlink_filter_fn filter, + void *filter_data) { struct cn_callback_entry *__cbq; unsigned int size; diff --git a/include/linux/connector.h b/include/linux/connector.h index cec2d99ae902..70bc1160f3d8 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h @@ -100,8 +100,7 @@ void cn_del_callback(const struct cb_id *id); */ int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 group, gfp_t gfp_mask, - int (*filter)(struct sock *dsk, struct sk_buff *skb, - void *data), + netlink_filter_fn filter, void *filter_data); /** diff --git a/include/linux/netlink.h b/include/linux/netlink.h index abe91ed6b9aa..1a4445bf2ab9 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -228,10 +228,12 @@ bool netlink_strict_get_check(struct sk_buff *skb); int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 portid, int nonblock); int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 portid, __u32 group, gfp_t allocation); + +typedef int (*netlink_filter_fn)(struct sock *dsk, struct sk_buff *skb, void *data); + int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, __u32 portid, __u32 group, gfp_t allocation, - int (*filter)(struct sock *dsk, - struct sk_buff *skb, void *data), + netlink_filter_fn filter, void *filter_data); int netlink_set_err(struct sock *ssk, __u32 portid, __u32 group, int code); int netlink_register_notifier(struct notifier_block *nb); diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 5683b0ca23b1..0efc1bd451fc 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1519,8 +1519,7 @@ static void do_one_broadcast(struct sock *sk, int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32 portid, u32 group, gfp_t allocation, - int (*filter)(struct sock *dsk, - struct sk_buff *skb, void *data), + netlink_filter_fn filter, void *filter_data) { struct net *net = sock_net(ssk); From patchwork Wed Dec 6 18:21:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482139 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="1PY/b8AV" Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 251A818D for ; Wed, 6 Dec 2023 10:21:38 -0800 (PST) Received: by mail-ej1-x631.google.com with SMTP id a640c23a62f3a-a1e116f2072so25907466b.0 for ; Wed, 06 Dec 2023 10:21:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886896; x=1702491696; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BlRSrg5smOW6dTCpma/Dwa5aq4EiIbE5VTt52Y7H/Ao=; b=1PY/b8AVJB2my4Jcl5EgB8e8Rzdb46E9sX6+EpUM+JZ/PWOTOX+R4XxhhOV6JS94TD Nu22/axunNxV+FncAk18BtDqOSi2exzzbY2LbqMvVyqrd05DGyXB0mpdZLL9XGfJddcL oiMygTXCVcu9yIMEkd3ks5Krmj+aUNUoY7j56pJw/eTLpkFdvuoPbsZJLn93NsrNWucd Lqfx9SEX22i1bgqIqpYe8L3HDO5sDrs/XAhsgw+m9Lt+jiM23RhtCgABwO0NyM8/diCo GPK23dEdn8geB5QhRIn6unWISUYCUM2TnmIsPAzVWhIvjM19hF+c3fAXOyMsNyXy7plR 8cEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886896; x=1702491696; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BlRSrg5smOW6dTCpma/Dwa5aq4EiIbE5VTt52Y7H/Ao=; b=WVBWQfJgcy7bD8+tG+4hUYaRtxRrFkEzClW7qpzyg4AJs2szg21MDc4rIaSmvaebQq /36pxIWi18RKr3FGzGubIFgy/jMuyvmthGuoG77Xrn/IMfhF4mLzaF9VtL4c9XD8G8jG KMftvkp4LHM8U8hzLP0EkQcmWnLnbhW+a5qyst8yQWravB4SDon61V+Fu9BQ4jNJBnPE nIMh9kVFqC7dH0w2KplEyWFSTxDIHWXNelgflR0RVAZpd4vpTBuRLEoeqEo8DjhOE6Wa vCmlYOXL00HPDNvbUJd9G/MTj3Np/4Uu56s0YJvLxLoPWpxiE5X9mxOM43i254XkP33u VGtw== X-Gm-Message-State: AOJu0YybywmVKYTYOX/BoGQwwOg9Lp0BGsbDG0xdp2RosJC94zEDlfB5 TpcLe65+Aqo6Lb03aeFvyteDNhrDs5rwWAOwiIU= X-Google-Smtp-Source: AGHT+IG2gwJ+rzWbYer/yZeheUCQrHmE8qaL0m+Gge6ZphRCG466jJXWqRj2obRt0R3AYGPJKPf2Aw== X-Received: by 2002:a17:907:97c3:b0:a1b:760c:e4de with SMTP id js3-20020a17090797c300b00a1b760ce4demr4820749ejc.15.1701886895342; Wed, 06 Dec 2023 10:21:35 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id ss26-20020a170907039a00b00a14311b5c5dsm252852ejb.185.2023.12.06.10.21.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:34 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 7/9] genetlink: introduce helpers to do filtered multicast Date: Wed, 6 Dec 2023 19:21:18 +0100 Message-ID: <20231206182120.957225-8-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Currently it is possible for netlink kernel user to pass custom filter function to broadcast send function netlink_broadcast_filtered(). However, this is not exposed to multicast send and to generic netlink users. Extend the api and introduce a netlink helper nlmsg_multicast_filtered() and a generic netlink helper genlmsg_multicast_netns_filtered() to allow generic netlink families to specify filter function while sending multicast messages. Signed-off-by: Jiri Pirko --- v1->v2: - used netlink_filter_fn introduce by the previous patch - added return comments to silence scripts/kernel-doc warnings --- include/net/genetlink.h | 35 +++++++++++++++++++++++++++++++---- include/net/netlink.h | 31 +++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/include/net/genetlink.h b/include/net/genetlink.h index dbf11464e96a..c3fe1d5b4254 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h @@ -441,6 +441,35 @@ static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr) nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); } +/** + * genlmsg_multicast_netns_filtered - multicast a netlink message + * to a specific netns with filter + * function + * @family: the generic netlink family + * @net: the net namespace + * @skb: netlink message as socket buffer + * @portid: own netlink portid to avoid sending to yourself + * @group: offset of multicast group in groups array + * @flags: allocation flags + * @filter: filter function + * @filter_data: filter function private data + * + * Return: 0 on success, negative error code for failure. + */ +static inline int +genlmsg_multicast_netns_filtered(const struct genl_family *family, + struct net *net, struct sk_buff *skb, + u32 portid, unsigned int group, gfp_t flags, + netlink_filter_fn filter, + void *filter_data) +{ + if (WARN_ON_ONCE(group >= family->n_mcgrps)) + return -EINVAL; + group = family->mcgrp_offset + group; + return nlmsg_multicast_filtered(net->genl_sock, skb, portid, group, + flags, filter, filter_data); +} + /** * genlmsg_multicast_netns - multicast a netlink message to a specific netns * @family: the generic netlink family @@ -454,10 +483,8 @@ static inline int genlmsg_multicast_netns(const struct genl_family *family, struct net *net, struct sk_buff *skb, u32 portid, unsigned int group, gfp_t flags) { - if (WARN_ON_ONCE(group >= family->n_mcgrps)) - return -EINVAL; - group = family->mcgrp_offset + group; - return nlmsg_multicast(net->genl_sock, skb, portid, group, flags); + return genlmsg_multicast_netns_filtered(family, net, skb, portid, + group, flags, NULL, NULL); } /** diff --git a/include/net/netlink.h b/include/net/netlink.h index 167b91348e57..2ba1438b7066 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h @@ -1087,27 +1087,50 @@ static inline void nlmsg_free(struct sk_buff *skb) } /** - * nlmsg_multicast - multicast a netlink message + * nlmsg_multicast_filtered - multicast a netlink message with filter function * @sk: netlink socket to spread messages to * @skb: netlink message as socket buffer * @portid: own netlink portid to avoid sending to yourself * @group: multicast group id * @flags: allocation flags + * @filter: filter function + * @filter_data: filter function private data + * + * Return: 0 on success, negative error code for failure. */ -static inline int nlmsg_multicast(struct sock *sk, struct sk_buff *skb, - u32 portid, unsigned int group, gfp_t flags) +static inline int nlmsg_multicast_filtered(struct sock *sk, struct sk_buff *skb, + u32 portid, unsigned int group, + gfp_t flags, + netlink_filter_fn filter, + void *filter_data) { int err; NETLINK_CB(skb).dst_group = group; - err = netlink_broadcast(sk, skb, portid, group, flags); + err = netlink_broadcast_filtered(sk, skb, portid, group, flags, + filter, filter_data); if (err > 0) err = 0; return err; } +/** + * nlmsg_multicast - multicast a netlink message + * @sk: netlink socket to spread messages to + * @skb: netlink message as socket buffer + * @portid: own netlink portid to avoid sending to yourself + * @group: multicast group id + * @flags: allocation flags + */ +static inline int nlmsg_multicast(struct sock *sk, struct sk_buff *skb, + u32 portid, unsigned int group, gfp_t flags) +{ + return nlmsg_multicast_filtered(sk, skb, portid, group, flags, + NULL, NULL); +} + /** * nlmsg_unicast - unicast a netlink message * @sk: netlink socket to spread message to From patchwork Wed Dec 6 18:21:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482140 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="NFZ06psT" Received: from mail-ed1-x530.google.com (mail-ed1-x530.google.com [IPv6:2a00:1450:4864:20::530]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70DB8D42 for ; Wed, 6 Dec 2023 10:21:39 -0800 (PST) Received: by mail-ed1-x530.google.com with SMTP id 4fb4d7f45d1cf-54ca43031d1so89539a12.0 for ; Wed, 06 Dec 2023 10:21:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886898; x=1702491698; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aZBh6tsZHAO6fNdeSjr4oXGlh0FMMO03jgj4YhVY2Ss=; b=NFZ06psTuuY5F6CO0umynqk842NezBqQ+dHCrprWBpLEQV5+ot0+7QsyDwD8XDt8L6 sr/bdIGSVOyEov2aqXVpAkpu5pslqRJ0KyXScz7pMEzxAGywVAha/8xix5mExqUJV/WQ 2sCDinSeyzuLuVjL5mNlybSv8MpM5pCmqutun6pBBri5aJLLWnIKbIDwfBDipPtpkjNN R7Z0CqZ7kcpNoXh86YKRFZUgRth4OspTXY73gcaBlLWnZwTQW+tY218F36fTe1QA2d5e ls8NUPDpN9bzbe63D72/YcaCHjOEXfAD+L2LlfbU2XRnAq/bMHdfmoq1XsQ+2wrSJhAk LhiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886898; x=1702491698; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aZBh6tsZHAO6fNdeSjr4oXGlh0FMMO03jgj4YhVY2Ss=; b=KgxQrjgEjXTme5WoB0ERgxXYkGovkFEY8GFnk6W4Tb55CCelJkCJOZ7GnrwwdSdVrv koech65dJ77qqGH5ax2R/tyZAu98HfTEhQKIl1zddLYuBcQSgEOnHkbUF2wKnBuJh8q9 acYDEG1M7e3UjlM+070kO9E/vWIVeBm6FhbkPLn1AMsP9BEZrU8e/koO0RdyaUWSkV4I prEeLgd+eAJgFWyVE85lgyHIhBcG3Gnpk6wNFZNi92Y+dYFpB2w8f4BVitrQwEXyiow8 ocx4737wMq6QUwl9CP3/MgDVCxwk9dQ5a79wnNVfs6VYM1t7b/A5s/JGQLCrAgBqdmRV Vqbw== X-Gm-Message-State: AOJu0Yw10r76ZskW6VF48n97tqO+GU2V+WnWcxaL+DzCD/bLn8IS3Nd1 LG78KO3iv1NnydsCNZyevnyJIYtY7QknePl4uDs= X-Google-Smtp-Source: AGHT+IEAhfxCEhgfgaueFV7KywKxSqVxuWm+JcplvC9vNjJwa/flOyO6QyYwWWXYtdUNXjD3YqeOMA== X-Received: by 2002:a50:9fe2:0:b0:54c:7c6d:c68a with SMTP id c89-20020a509fe2000000b0054c7c6dc68amr1102145edf.69.1701886897859; Wed, 06 Dec 2023 10:21:37 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id y19-20020a056402135300b0054cc2e952f0sm245951edw.81.2023.12.06.10.21.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:37 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 8/9] devlink: add a command to set notification filter and use it for multicasts Date: Wed, 6 Dec 2023 19:21:19 +0100 Message-ID: <20231206182120.957225-9-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Currently the user listening on a socket for devlink notifications gets always all messages for all existing instances, even if he is interested only in one of those. That may cause unnecessary overhead on setups with thousands of instances present. User is currently able to narrow down the devlink objects replies to dump commands by specifying select attributes. Allow similar approach for notifications. Introduce a new devlink NOTIFY_FILTER_SET which the user passes the select attributes. Store these per-socket and use them for filtering messages during multicast send. Signed-off-by: Jiri Pirko --- v4->v5: - rebased on top of generic netlink per sock per family pointer allocation code - changed the flt to be stored in family priv rcu pointer, protected by spin lock - changed to use size_add() helper for kzalloc() size computation - removed generated userspace bits v3->v4: - rebased on top of genl_sk_priv_*() introduction --- Documentation/netlink/specs/devlink.yaml | 10 +++ include/uapi/linux/devlink.h | 2 + net/devlink/devl_internal.h | 34 ++++++- net/devlink/netlink.c | 108 +++++++++++++++++++++++ net/devlink/netlink_gen.c | 15 +++- net/devlink/netlink_gen.h | 4 +- 6 files changed, 169 insertions(+), 4 deletions(-) diff --git a/Documentation/netlink/specs/devlink.yaml b/Documentation/netlink/specs/devlink.yaml index 43067e1f63aa..6bad1d3454b7 100644 --- a/Documentation/netlink/specs/devlink.yaml +++ b/Documentation/netlink/specs/devlink.yaml @@ -2055,3 +2055,13 @@ operations: - bus-name - dev-name - selftests + + - + name: notify-filter-set + doc: Set notification messages socket filter. + attribute-set: devlink + do: + request: + attributes: + - bus-name + - dev-name diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index b3c8383d342d..130cae0d3e20 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -139,6 +139,8 @@ enum devlink_command { DEVLINK_CMD_SELFTESTS_GET, /* can dump */ DEVLINK_CMD_SELFTESTS_RUN, + DEVLINK_CMD_NOTIFY_FILTER_SET, + /* add new commands above here */ __DEVLINK_CMD_MAX, DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1 diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index 84dc9628d3f2..82e0fb3bbebf 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -191,11 +191,41 @@ static inline bool devlink_nl_notify_need(struct devlink *devlink) DEVLINK_MCGRP_CONFIG); } +struct devlink_obj_desc { + struct rcu_head rcu; + const char *bus_name; + const char *dev_name; + long data[]; +}; + +static inline void devlink_nl_obj_desc_init(struct devlink_obj_desc *desc, + struct devlink *devlink) +{ + memset(desc, 0, sizeof(*desc)); + desc->bus_name = devlink->dev->bus->name; + desc->dev_name = dev_name(devlink->dev); +} + +int devlink_nl_notify_filter(struct sock *dsk, struct sk_buff *skb, void *data); + +static inline void devlink_nl_notify_send_desc(struct devlink *devlink, + struct sk_buff *msg, + struct devlink_obj_desc *desc) +{ + genlmsg_multicast_netns_filtered(&devlink_nl_family, + devlink_net(devlink), + msg, 0, DEVLINK_MCGRP_CONFIG, + GFP_KERNEL, + devlink_nl_notify_filter, desc); +} + static inline void devlink_nl_notify_send(struct devlink *devlink, struct sk_buff *msg) { - genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), - msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); + struct devlink_obj_desc desc; + + devlink_nl_obj_desc_init(&desc, devlink); + devlink_nl_notify_send_desc(devlink, msg, &desc); } /* Notify */ diff --git a/net/devlink/netlink.c b/net/devlink/netlink.c index fa9afe3e6d9b..06f294d34a04 100644 --- a/net/devlink/netlink.c +++ b/net/devlink/netlink.c @@ -17,6 +17,111 @@ static const struct genl_multicast_group devlink_nl_mcgrps[] = { [DEVLINK_MCGRP_CONFIG] = { .name = DEVLINK_GENL_MCGRP_CONFIG_NAME }, }; +struct devlink_nl_sock_priv { + struct devlink_obj_desc __rcu *flt; + spinlock_t flt_lock; /* Protects flt. */ +}; + +static void devlink_nl_sock_priv_init(void *priv) +{ + struct devlink_nl_sock_priv *sk_priv = priv; + + spin_lock_init(&sk_priv->flt_lock); +} + +static void devlink_nl_sock_priv_destroy(void *priv) +{ + struct devlink_nl_sock_priv *sk_priv = priv; + struct devlink_obj_desc *flt; + + flt = rcu_dereference_protected(sk_priv->flt, true); + kfree_rcu(flt, rcu); +} + +int devlink_nl_notify_filter_set_doit(struct sk_buff *skb, + struct genl_info *info) +{ + struct devlink_nl_sock_priv *sk_priv; + struct nlattr **attrs = info->attrs; + struct devlink_obj_desc *flt; + size_t data_offset = 0; + size_t data_size = 0; + char *pos; + + if (attrs[DEVLINK_ATTR_BUS_NAME]) + data_size = size_add(data_size, + nla_len(attrs[DEVLINK_ATTR_BUS_NAME]) + 1); + if (attrs[DEVLINK_ATTR_DEV_NAME]) + data_size = size_add(data_size, + nla_len(attrs[DEVLINK_ATTR_DEV_NAME]) + 1); + + flt = kzalloc(size_add(sizeof(*flt), data_size), GFP_KERNEL); + if (!flt) + return -ENOMEM; + + pos = (char *) flt->data; + if (attrs[DEVLINK_ATTR_BUS_NAME]) { + data_offset += nla_strscpy(pos, + attrs[DEVLINK_ATTR_BUS_NAME], + data_size) + 1; + flt->bus_name = pos; + pos += data_offset; + } + if (attrs[DEVLINK_ATTR_DEV_NAME]) { + nla_strscpy(pos, attrs[DEVLINK_ATTR_DEV_NAME], + data_size - data_offset); + flt->dev_name = pos; + } + + /* Don't attach empty filter. */ + if (!flt->bus_name && !flt->dev_name) { + kfree(flt); + flt = NULL; + } + + sk_priv = genl_sk_priv_get(NETLINK_CB(skb).sk, &devlink_nl_family); + if (IS_ERR(sk_priv)) { + kfree(flt); + return PTR_ERR(sk_priv); + } + spin_lock(&sk_priv->flt_lock); + flt = rcu_replace_pointer(sk_priv->flt, flt, + lockdep_is_held(&sk_priv->flt_lock)); + spin_unlock(&sk_priv->flt_lock); + kfree_rcu(flt, rcu); + return 0; +} + +static bool devlink_obj_desc_match(const struct devlink_obj_desc *desc, + const struct devlink_obj_desc *flt) +{ + if (desc->bus_name && flt->bus_name && + strcmp(desc->bus_name, flt->bus_name)) + return false; + if (desc->dev_name && flt->dev_name && + strcmp(desc->dev_name, flt->dev_name)) + return false; + return true; +} + +int devlink_nl_notify_filter(struct sock *dsk, struct sk_buff *skb, void *data) +{ + struct devlink_obj_desc *desc = data; + struct devlink_nl_sock_priv *sk_priv; + struct devlink_obj_desc *flt; + int ret = 0; + + rcu_read_lock(); + sk_priv = __genl_sk_priv_get(dsk, &devlink_nl_family); + if (sk_priv) { + flt = rcu_dereference(sk_priv->flt); + if (flt) + ret = !devlink_obj_desc_match(desc, flt); + } + rcu_read_unlock(); + return ret; +} + int devlink_nl_put_nested_handle(struct sk_buff *msg, struct net *net, struct devlink *devlink, int attrtype) { @@ -256,4 +361,7 @@ struct genl_family devlink_nl_family __ro_after_init = { .resv_start_op = DEVLINK_CMD_SELFTESTS_RUN + 1, .mcgrps = devlink_nl_mcgrps, .n_mcgrps = ARRAY_SIZE(devlink_nl_mcgrps), + .sock_priv_size = sizeof(struct devlink_nl_sock_priv), + .sock_priv_init = devlink_nl_sock_priv_init, + .sock_priv_destroy = devlink_nl_sock_priv_destroy, }; diff --git a/net/devlink/netlink_gen.c b/net/devlink/netlink_gen.c index 95f9b4350ab7..1cb0e05305d2 100644 --- a/net/devlink/netlink_gen.c +++ b/net/devlink/netlink_gen.c @@ -560,8 +560,14 @@ static const struct nla_policy devlink_selftests_run_nl_policy[DEVLINK_ATTR_SELF [DEVLINK_ATTR_SELFTESTS] = NLA_POLICY_NESTED(devlink_dl_selftest_id_nl_policy), }; +/* DEVLINK_CMD_NOTIFY_FILTER_SET - do */ +static const struct nla_policy devlink_notify_filter_set_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = { + [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, }, + [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, }, +}; + /* Ops table for devlink */ -const struct genl_split_ops devlink_nl_ops[73] = { +const struct genl_split_ops devlink_nl_ops[74] = { { .cmd = DEVLINK_CMD_GET, .validate = GENL_DONT_VALIDATE_STRICT, @@ -1233,4 +1239,11 @@ const struct genl_split_ops devlink_nl_ops[73] = { .maxattr = DEVLINK_ATTR_SELFTESTS, .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO, }, + { + .cmd = DEVLINK_CMD_NOTIFY_FILTER_SET, + .doit = devlink_nl_notify_filter_set_doit, + .policy = devlink_notify_filter_set_nl_policy, + .maxattr = DEVLINK_ATTR_DEV_NAME, + .flags = GENL_CMD_CAP_DO, + }, }; diff --git a/net/devlink/netlink_gen.h b/net/devlink/netlink_gen.h index 02f3c0bfae0e..8f2bd50ddf5e 100644 --- a/net/devlink/netlink_gen.h +++ b/net/devlink/netlink_gen.h @@ -16,7 +16,7 @@ extern const struct nla_policy devlink_dl_port_function_nl_policy[DEVLINK_PORT_F extern const struct nla_policy devlink_dl_selftest_id_nl_policy[DEVLINK_ATTR_SELFTEST_ID_FLASH + 1]; /* Ops table for devlink */ -extern const struct genl_split_ops devlink_nl_ops[73]; +extern const struct genl_split_ops devlink_nl_ops[74]; int devlink_nl_pre_doit(const struct genl_split_ops *ops, struct sk_buff *skb, struct genl_info *info); @@ -142,5 +142,7 @@ int devlink_nl_selftests_get_doit(struct sk_buff *skb, struct genl_info *info); int devlink_nl_selftests_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb); int devlink_nl_selftests_run_doit(struct sk_buff *skb, struct genl_info *info); +int devlink_nl_notify_filter_set_doit(struct sk_buff *skb, + struct genl_info *info); #endif /* _LINUX_DEVLINK_GEN_H */ From patchwork Wed Dec 6 18:21:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 13482141 X-Patchwork-Delegate: kuba@kernel.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20230601.gappssmtp.com header.i=@resnulli-us.20230601.gappssmtp.com header.b="GG4AmHvS" Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 25062139 for ; Wed, 6 Dec 2023 10:21:41 -0800 (PST) Received: by mail-ed1-x535.google.com with SMTP id 4fb4d7f45d1cf-54cfb03f1a8so103496a12.2 for ; Wed, 06 Dec 2023 10:21:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20230601.gappssmtp.com; s=20230601; t=1701886899; x=1702491699; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kjK8RDArNY4XLJtV3AvD49frNSNKdkXFX9QIwpglGH4=; b=GG4AmHvSqs7biVwGydwDDa46fBkdxIgIr2JXdGqFJelWQNoqSc3hQorKrZFLseGejD w7cAV2h9m2NHLpFhOFVTEVzsbsbfLEYKBHtSMBn2InBZJ+ywA75kWgL4tzMVouLiK6/L UI2+1I0X4uu9sB7OvfNDETWqr6xNvaHMAn+m9Fes78an8homoFijh6VcIJGRdJ/JZbwW ZCdEy4S15qZtsg9XpynuWEHM0Y5LrBV6WUAC3tYV06183wydQw/Dlcqe67CYvQKIj71F phlCbngMcBbi7l0GwzWTWxYAMj6t8GEMCJPXkBQgt0co3hQ6LFyATQuDjfOqoFr9vtLN TYYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701886899; x=1702491699; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kjK8RDArNY4XLJtV3AvD49frNSNKdkXFX9QIwpglGH4=; b=JmuGA6pHXd3ZIJCFrc/vbVDpbBaksOyhY17IYH/nAlzNuEs9D2L87Mq2Lc2rZLH1jv FH/mpRbN4SGUQq+6i5qYuHzDw/ZV5JvwwzYj5dBJ6rC9+2gNanaVTKwVcXfrgAFdhP65 r0ll+/hXp5sPNktFA/iIYoKBYDKoCM7AOTJEoZJQ/Bo0NBW+ejk+QE+xcmIGtbH5rN5Q i62CBseTcT4gcRDK3aGUsqnZAfFh++tW9xTgd3iZIob3miD+XEihaQ20X8NiOg3LSck3 fsXTWND/olQySSNRNqN0/cbRcxtgxgtv5tRH/JAewk4yUY7MwZNPzyA1oofp5em6CIsl IEWQ== X-Gm-Message-State: AOJu0YyeI+kfqanvtEQ+MYiWylnve6X0b9OMD02cjVTp9+pbgx7JtN9Q YyBXoA3oRRlVel3ZqeOu2uHBxd7/2DNx6ViUZqA= X-Google-Smtp-Source: AGHT+IHwDY7I1mCSvlBnVEIu3KnDOO7P4y1Fsw5Ds6aD+O9TE2e+t+jgK8AC5P2OnGIyABqau5gAyw== X-Received: by 2002:a05:6402:3139:b0:54c:4837:7594 with SMTP id dd25-20020a056402313900b0054c48377594mr781808edb.64.1701886899662; Wed, 06 Dec 2023 10:21:39 -0800 (PST) Received: from localhost (host-213-179-129-39.customer.m-online.net. [213.179.129.39]) by smtp.gmail.com with ESMTPSA id c7-20020aa7d607000000b0054b25e865f6sm255917edr.18.2023.12.06.10.21.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 10:21:39 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net, edumazet@google.com, jacob.e.keller@intel.com, jhs@mojatatu.com, johannes@sipsolutions.net, andriy.shevchenko@linux.intel.com, amritha.nambiar@intel.com, sdf@google.com, horms@kernel.org, przemyslaw.kitszel@intel.com Subject: [patch net-next v5 9/9] devlink: extend multicast filtering by port index Date: Wed, 6 Dec 2023 19:21:20 +0100 Message-ID: <20231206182120.957225-10-jiri@resnulli.us> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231206182120.957225-1-jiri@resnulli.us> References: <20231206182120.957225-1-jiri@resnulli.us> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Jiri Pirko Expose the previously introduced notification multicast messages filtering infrastructure and allow the user to select messages using port index. Signed-off-by: Jiri Pirko --- v4->v5: - removed generated userspace bits v3->v4: - rebased on top of genl_sk_priv_*() introduction --- Documentation/netlink/specs/devlink.yaml | 1 + net/devlink/devl_internal.h | 9 +++++++++ net/devlink/health.c | 6 +++++- net/devlink/netlink.c | 10 +++++++++- net/devlink/netlink_gen.c | 5 +++-- net/devlink/port.c | 5 ++++- 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Documentation/netlink/specs/devlink.yaml b/Documentation/netlink/specs/devlink.yaml index 6bad1d3454b7..4996ff7e09b6 100644 --- a/Documentation/netlink/specs/devlink.yaml +++ b/Documentation/netlink/specs/devlink.yaml @@ -2065,3 +2065,4 @@ operations: attributes: - bus-name - dev-name + - port-index diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index 82e0fb3bbebf..c7a8e13f917c 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -195,6 +195,8 @@ struct devlink_obj_desc { struct rcu_head rcu; const char *bus_name; const char *dev_name; + unsigned int port_index; + bool port_index_valid; long data[]; }; @@ -206,6 +208,13 @@ static inline void devlink_nl_obj_desc_init(struct devlink_obj_desc *desc, desc->dev_name = dev_name(devlink->dev); } +static inline void devlink_nl_obj_desc_port_set(struct devlink_obj_desc *desc, + struct devlink_port *devlink_port) +{ + desc->port_index = devlink_port->index; + desc->port_index_valid = true; +} + int devlink_nl_notify_filter(struct sock *dsk, struct sk_buff *skb, void *data); static inline void devlink_nl_notify_send_desc(struct devlink *devlink, diff --git a/net/devlink/health.c b/net/devlink/health.c index 1d59ec0202f6..acb8c0e174bb 100644 --- a/net/devlink/health.c +++ b/net/devlink/health.c @@ -490,6 +490,7 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter, enum devlink_command cmd) { struct devlink *devlink = reporter->devlink; + struct devlink_obj_desc desc; struct sk_buff *msg; int err; @@ -509,7 +510,10 @@ static void devlink_recover_notify(struct devlink_health_reporter *reporter, return; } - devlink_nl_notify_send(devlink, msg); + devlink_nl_obj_desc_init(&desc, devlink); + if (reporter->devlink_port) + devlink_nl_obj_desc_port_set(&desc, reporter->devlink_port); + devlink_nl_notify_send_desc(devlink, msg, &desc); } void diff --git a/net/devlink/netlink.c b/net/devlink/netlink.c index 06f294d34a04..c6de311130fb 100644 --- a/net/devlink/netlink.c +++ b/net/devlink/netlink.c @@ -73,8 +73,13 @@ int devlink_nl_notify_filter_set_doit(struct sk_buff *skb, flt->dev_name = pos; } + if (attrs[DEVLINK_ATTR_PORT_INDEX]) { + flt->port_index = nla_get_u32(attrs[DEVLINK_ATTR_PORT_INDEX]); + flt->port_index_valid = true; + } + /* Don't attach empty filter. */ - if (!flt->bus_name && !flt->dev_name) { + if (!flt->bus_name && !flt->dev_name && !flt->port_index_valid) { kfree(flt); flt = NULL; } @@ -101,6 +106,9 @@ static bool devlink_obj_desc_match(const struct devlink_obj_desc *desc, if (desc->dev_name && flt->dev_name && strcmp(desc->dev_name, flt->dev_name)) return false; + if (desc->port_index_valid && flt->port_index_valid && + desc->port_index != flt->port_index) + return false; return true; } diff --git a/net/devlink/netlink_gen.c b/net/devlink/netlink_gen.c index 1cb0e05305d2..c81cf2dd154f 100644 --- a/net/devlink/netlink_gen.c +++ b/net/devlink/netlink_gen.c @@ -561,9 +561,10 @@ static const struct nla_policy devlink_selftests_run_nl_policy[DEVLINK_ATTR_SELF }; /* DEVLINK_CMD_NOTIFY_FILTER_SET - do */ -static const struct nla_policy devlink_notify_filter_set_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = { +static const struct nla_policy devlink_notify_filter_set_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = { [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, }, [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, }, + [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, }, }; /* Ops table for devlink */ @@ -1243,7 +1244,7 @@ const struct genl_split_ops devlink_nl_ops[74] = { .cmd = DEVLINK_CMD_NOTIFY_FILTER_SET, .doit = devlink_nl_notify_filter_set_doit, .policy = devlink_notify_filter_set_nl_policy, - .maxattr = DEVLINK_ATTR_DEV_NAME, + .maxattr = DEVLINK_ATTR_PORT_INDEX, .flags = GENL_CMD_CAP_DO, }, }; diff --git a/net/devlink/port.c b/net/devlink/port.c index 758df3000a1b..62e54e152ecf 100644 --- a/net/devlink/port.c +++ b/net/devlink/port.c @@ -507,6 +507,7 @@ static void devlink_port_notify(struct devlink_port *devlink_port, enum devlink_command cmd) { struct devlink *devlink = devlink_port->devlink; + struct devlink_obj_desc desc; struct sk_buff *msg; int err; @@ -525,7 +526,9 @@ static void devlink_port_notify(struct devlink_port *devlink_port, return; } - devlink_nl_notify_send(devlink, msg); + devlink_nl_obj_desc_init(&desc, devlink); + devlink_nl_obj_desc_port_set(&desc, devlink_port); + devlink_nl_notify_send_desc(devlink, msg, &desc); } static void devlink_ports_notify(struct devlink *devlink,