From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 77EC7C43381 for ; Tue, 26 Feb 2019 03:34:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3C01F206B8 for ; Tue, 26 Feb 2019 03:34:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="x+7U7NKB" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726443AbfBZDeU (ORCPT ); Mon, 25 Feb 2019 22:34:20 -0500 Received: from mail-qk1-f196.google.com ([209.85.222.196]:45307 "EHLO mail-qk1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726400AbfBZDeT (ORCPT ); Mon, 25 Feb 2019 22:34:19 -0500 Received: by mail-qk1-f196.google.com with SMTP id v139so6747872qkb.12 for ; Mon, 25 Feb 2019 19:34:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=u8vmEXIvP4cB8fNu8o/c9IIoDoN+Fz94sKmnEIrdIMA=; b=x+7U7NKBV/cxRl8E5ta1tjeQFgLg4Yv//4epP84JGqKNX2Xk7WZSbcExbSCi/RmXwO T/8vKMGT1NGSiDj+W03FkyEe93TqYPw8SMl9mCuTfXcz1VNTkjdRvLLCJ0GdwLZe3XHa tCJq+ptTjRDOxht3tFDuDodt3CeLCn+jLklEmMqHsQRV6zAgpbJISIsngF0p+AEFC6aw AJRutJY5ca5huyHeAAJZmoYx1faBUi7N6P2gfPaWbHjXdT3chS5d/vqbUxUTZFV1/iUu g1UShR/LO+Ne8zZrnelqNTxVucWYCJiuXSmMnSNGMbT5jUHMBljAz/knRMjwiiv5PkyU FN3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=u8vmEXIvP4cB8fNu8o/c9IIoDoN+Fz94sKmnEIrdIMA=; b=EiE1sBPh/Y9/2WKrUjNtb5JborAyEK3Yv9sNfNALydFqSrz+FxQpej0P6N4fdXrrgq pajw/EiGPtf45Sntuu703huSVLoNyi65GDL+9a3hBhK0iQdpGYp2CERUKLi+yx9i7XMb dLKG4qzzcCBChus0D5BwB4/nfn08S2TaM86dBlmJ9wNsSQw3K2/McY8r1Hu8xAK3vWjT RrZAfstc23+cgZ0ChufQEpPOIefE2A4sTn7QZuTg6pyW7MVBC9bn4NRtVubfxJUWBN7Y TJSLXaP5LkjuiuJnFhsqk7psaBrBOA/nMTQZp/d4T1Judo17rtuW9UzcF+3N4dYPXHCx iBPA== X-Gm-Message-State: AHQUAub7mAOAH0sXX40q8qRc/aPKagGEGeZ5AFcKMyT8UMODb8yigT+B oULGe0Vy2wsscshVKjYnwJrJhw== X-Google-Smtp-Source: AHgI3IZ8s0iS/msr/IOOjSkB3h5pDpyzTOmQtNNtHhGSJbpBXg4UMi9dwPAP/t5vW5fONHDKAjIIpQ== X-Received: by 2002:a37:bd1:: with SMTP id 200mr15445267qkl.272.1551152057964; Mon, 25 Feb 2019 19:34:17 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id i20sm8120317qta.19.2019.02.25.19.34.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Feb 2019 19:34:17 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net, jiri@resnulli.us Cc: mkubecek@suse.cz, andrew@lunn.ch, f.fainelli@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, Jakub Kicinski Subject: [PATCH net-next v4 2/6] devlink: create a special NDO for getting the devlink instance Date: Mon, 25 Feb 2019 19:34:03 -0800 Message-Id: <20190226033407.32625-3-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190226033407.32625-1-jakub.kicinski@netronome.com> References: <20190226033407.32625-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Instead of iterating over all devlink ports add a NDO which will return the devlink instance from the driver. v2: add the netdev_to_devlink() helper (Michal) v3: check that devlink has ops (Florian) v4: hold devlink_mutex (Jiri) Suggested-by: Jiri Pirko Signed-off-by: Jakub Kicinski Reviewed-by: Florian Fainelli --- include/linux/netdevice.h | 7 +++++ include/net/devlink.h | 9 +++++++ net/core/devlink.c | 56 ++++++++++++--------------------------- 3 files changed, 33 insertions(+), 39 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ffbddd03242b..58e83bd7a861 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -941,6 +941,8 @@ struct dev_ifalias { char ifalias[]; }; +struct devlink; + /* * This structure defines the management hooks for network devices. * The following hooks can be defined; unless noted otherwise, they are @@ -1249,6 +1251,10 @@ struct dev_ifalias { * that got dropped are freed/returned via xdp_return_frame(). * Returns negative number, means general error invoking ndo, meaning * no frames were xmit'ed and core-caller will free all frames. + * struct devlink *(*ndo_get_devlink)(struct net_device *dev); + * Get devlink instance associated with a given netdev. + * Called with a reference on the netdevice and devlink locks only, + * rtnl_lock is not held. */ struct net_device_ops { int (*ndo_init)(struct net_device *dev); @@ -1447,6 +1453,7 @@ struct net_device_ops { u32 flags); int (*ndo_xsk_async_xmit)(struct net_device *dev, u32 queue_id); + struct devlink * (*ndo_get_devlink)(struct net_device *dev); }; /** diff --git a/include/net/devlink.h b/include/net/devlink.h index f9f7fe974652..7f5a0bdca228 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -538,6 +538,15 @@ static inline struct devlink *priv_to_devlink(void *priv) return container_of(priv, struct devlink, priv); } +static inline struct devlink *netdev_to_devlink(struct net_device *dev) +{ +#if IS_ENABLED(CONFIG_NET_DEVLINK) + if (dev->netdev_ops->ndo_get_devlink) + return dev->netdev_ops->ndo_get_devlink(dev); +#endif + return NULL; +} + struct ib_device; #if IS_ENABLED(CONFIG_NET_DEVLINK) diff --git a/net/core/devlink.c b/net/core/devlink.c index 05e04ea0a5c7..24bfbd2d71e7 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -6397,9 +6397,6 @@ static void __devlink_compat_running_version(struct devlink *devlink, struct sk_buff *msg; int rem, err; - if (!devlink->ops->info_get) - return; - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); if (!msg) return; @@ -6431,55 +6428,36 @@ static void __devlink_compat_running_version(struct devlink *devlink, void devlink_compat_running_version(struct net_device *dev, char *buf, size_t len) { - struct devlink_port *devlink_port; struct devlink *devlink; mutex_lock(&devlink_mutex); - list_for_each_entry(devlink, &devlink_list, list) { - mutex_lock(&devlink->lock); - list_for_each_entry(devlink_port, &devlink->port_list, list) { - if (devlink_port->type == DEVLINK_PORT_TYPE_ETH && - devlink_port->type_dev == dev) { - __devlink_compat_running_version(devlink, - buf, len); - mutex_unlock(&devlink->lock); - goto out; - } - } - mutex_unlock(&devlink->lock); - } -out: + devlink = netdev_to_devlink(dev); + if (!devlink || !devlink->ops || !devlink->ops->info_get) + goto unlock_list; + + mutex_lock(&devlink->lock); + __devlink_compat_running_version(devlink, buf, len); + mutex_unlock(&devlink->lock); +unlock_list: mutex_unlock(&devlink_mutex); } int devlink_compat_flash_update(struct net_device *dev, const char *file_name) { - struct devlink_port *devlink_port; struct devlink *devlink; + int ret = -EOPNOTSUPP; mutex_lock(&devlink_mutex); - list_for_each_entry(devlink, &devlink_list, list) { - mutex_lock(&devlink->lock); - list_for_each_entry(devlink_port, &devlink->port_list, list) { - int ret = -EOPNOTSUPP; - - if (devlink_port->type != DEVLINK_PORT_TYPE_ETH || - devlink_port->type_dev != dev) - continue; + devlink = netdev_to_devlink(dev); + if (!devlink || !devlink->ops || !devlink->ops->flash_update) + goto unlock_list; - mutex_unlock(&devlink_mutex); - if (devlink->ops->flash_update) - ret = devlink->ops->flash_update(devlink, - file_name, - NULL, NULL); - mutex_unlock(&devlink->lock); - return ret; - } - mutex_unlock(&devlink->lock); - } + mutex_lock(&devlink->lock); + ret = devlink->ops->flash_update(devlink, file_name, NULL, NULL); + mutex_unlock(&devlink->lock); +unlock_list: mutex_unlock(&devlink_mutex); - - return -EOPNOTSUPP; + return ret; } static int __init devlink_init(void) -- 2.19.2