Mon, Mar 23, 2026 at 02:21:36PM +0100, [email protected] wrote:
>Unify access API to shared devlink priv data with normal devlink.
>
>Thanks to Jiri Piro, we now have ability to create shared devlink
>instances [1]. Introduction series have added usege of those for mlx, but
>without priv data attached to the shared devlink.
>
>Current API makes it possible to access shared devlink instance's priv
>data:
>
>       void *devlink_shd_get_priv(struct devlink *devlink);
>
>but it is easy to to forget (especially during rebase from "before shared
>devlinks" era) and call:
>
>       void *devlink_priv(struct devlink *devlink);
>
>which even has the same signature, so it's hard to catch the error.
>
>New proposed API unifies both calls into one, without any increase in the
>observerd struct size. (Alternative could be to store additional pointer,
>set during devlink_alloc).

You should use some AI corrector :) too many typos.

>
>Unexport the less convenient API call.
>
>[1] commit 411ad0605875 ("Merge branch 
>'devlink-introduce-shared-devlink-instance-for-pfs-on-same-chip'")
>[1] https://lore.kernel.org/all/[email protected]
>
>Signed-off-by: Przemek Kitszel <[email protected]>
>---
>sorry that I have not mentioned it during [1] review, it got obvious
>for me only after working with the code
>---
> net/devlink/devl_internal.h |  4 ++++
> net/devlink/core.c          |  3 +++
> net/devlink/sh_dev.c        | 11 ++++++++---
> 3 files changed, 15 insertions(+), 3 deletions(-)
>
>diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h
>index 7dfb7cdd2d23..abbe308ee9bd 100644
>--- a/net/devlink/devl_internal.h
>+++ b/net/devlink/devl_internal.h
>@@ -58,6 +58,7 @@ struct devlink {
>       struct mutex lock;
>       struct lock_class_key lock_key;
>       u8 reload_failed:1;
>+      u8 is_shd:1;
>       refcount_t refcount;
>       struct rcu_work rwork;
>       struct devlink_rel *rel;
>@@ -72,6 +73,9 @@ struct devlink *__devlink_alloc(const struct devlink_ops 
>*ops, size_t priv_size,
>                               struct net *net, struct device *dev,
>                               const struct device_driver *dev_driver);
> 
>+/* Get private data from shared devlink instance */
>+void *devlink_shd_get_priv(struct devlink *devlink);
>+
> #define devl_warn(devlink, format, args...)                           \
>       do {                                                            \
>               if ((devlink)->dev)                                     \
>diff --git a/net/devlink/core.c b/net/devlink/core.c
>index eeb6a71f5f56..4c97e2e2c073 100644
>--- a/net/devlink/core.c
>+++ b/net/devlink/core.c
>@@ -232,6 +232,9 @@ int devlink_rel_devlink_handle_put(struct sk_buff *msg, 
>struct devlink *devlink,
> 
> void *devlink_priv(struct devlink *devlink)
> {
>+      if (devlink->is_shd)
>+              return devlink_shd_get_priv(devlink);
>+
>       return &devlink->priv;
> }
> EXPORT_SYMBOL_GPL(devlink_priv);
>diff --git a/net/devlink/sh_dev.c b/net/devlink/sh_dev.c
>index 9b7456d64b57..450e3218759e 100644
>--- a/net/devlink/sh_dev.c
>+++ b/net/devlink/sh_dev.c
>@@ -31,6 +31,11 @@ static struct devlink_shd *devlink_shd_lookup(const char 
>*id)
>       return NULL;
> }
> 
>+static struct devlink_shd *devlink_to_shd(struct devlink *devlink)
>+{
>+      return &devlink->priv;
>+}

Can you rather have unexported __devlink_priv() above existing
devlink_priv()?


>+
> static struct devlink_shd *devlink_shd_create(const char *id,
>                                             const struct devlink_ops *ops,
>                                             size_t priv_size,
>@@ -43,13 +48,14 @@ static struct devlink_shd *devlink_shd_create(const char 
>*id,
>                                 &init_net, NULL, driver);
>       if (!devlink)
>               return NULL;
>-      shd = devlink_priv(devlink);
>+      shd = devlink_to_shd(devlink);
> 
>       shd->id = kstrdup(id, GFP_KERNEL);
>       if (!shd->id)
>               goto err_devlink_free;
>       shd->priv_size = priv_size;
>       refcount_set(&shd->refcount, 1);
>+      devlink->is_shd = 1;
> 
>       devl_lock(devlink);
>       devl_register(devlink);
>@@ -137,7 +143,7 @@ void devlink_shd_put(struct devlink *devlink)
>       struct devlink_shd *shd;
> 
>       mutex_lock(&shd_mutex);
>-      shd = devlink_priv(devlink);
>+      shd = devlink_to_shd(devlink);
>       if (refcount_dec_and_test(&shd->refcount))
>               devlink_shd_destroy(shd);
>       mutex_unlock(&shd_mutex);
>@@ -159,4 +165,3 @@ void *devlink_shd_get_priv(struct devlink *devlink)
> 
>       return shd->priv;
> }
>-EXPORT_SYMBOL_GPL(devlink_shd_get_priv);
>-- 
>2.39.3
>

Reply via email to