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=-7.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 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 34499C43381 for ; Fri, 22 Feb 2019 17:02:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F0FB420665 for ; Fri, 22 Feb 2019 17:02:10 +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="rCWTq0QU" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726380AbfBVRCJ (ORCPT ); Fri, 22 Feb 2019 12:02:09 -0500 Received: from mail-pl1-f194.google.com ([209.85.214.194]:46100 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726310AbfBVRCJ (ORCPT ); Fri, 22 Feb 2019 12:02:09 -0500 Received: by mail-pl1-f194.google.com with SMTP id o6so1330501pls.13 for ; Fri, 22 Feb 2019 09:02:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:in-reply-to:references :organization:mime-version:content-transfer-encoding; bh=je9NKpaA+fRWvsXMnd4XG24+joPlAgS7G2jxkhmo13U=; b=rCWTq0QUuERw5nQcMjcBfrgzYri+br7yCbx8NYwMl37vRdRVseNsoNjc06QOU1sa84 wCRm1iN2GgLsyqCVITB69bONrw6QF/xgtWja3RJrqhgVYkz8vcpP205xg4OLL/jGX2q+ 11Qll2/A5hNKhKw21Ej1nMCniHL1ZjImW69hVntSQrKI+A+MtUr4lER7zja9Cx9H07VQ dpRkbFVFo7im0zHxKuqGoSsUJ/ZT5XZuTHl6Wram2EeH3MqACUznWM6Grr04RrBM2FNJ 3X0xqOnCrtkJJTaDBljx0XIltycBeVYZ3mtXvEgrECON0s/9MGR+m78TKfOCk+e+LTCf uOQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:in-reply-to :references:organization:mime-version:content-transfer-encoding; bh=je9NKpaA+fRWvsXMnd4XG24+joPlAgS7G2jxkhmo13U=; b=sJTuOzqjV6DuGKODw/S+EDKQ71KjhuJr4VpT2TFZyU1nU0RIlJruX3qWY94amgHlIP 7xepb1heYQqkI3R8G/1T8gRxLUKRRC5CeCclvbS8ldd5CSrNKeYAlYlEhJ9XAFi9Vlw2 ccRa03OaScSEAVySWwQpM09V+pAdS8xe3/ebuurQ/FcbfBCrTvOkAen/Tg8jseLTn1Qf hHUKaYRJ9M4ZC7hR24EB3FUoVKxGG8GMQf8Z8ysonR9XAa6ORqE1Ksx4ZoR3EqOjJ4Z4 LGN1KqHp2ur15LNamvxV+E/9ldEStX8CXTA3F4lUzImJrfG4SnabedL4mGzcdgXO0jIq gXlw== X-Gm-Message-State: AHQUAuZb9LH7TgVKfRj+Kmi/kf4jfXvWujs51g6FEuccsYjW5R1mkMs8 IuOOL9z46R5KwEhNXqIccEPSQA== X-Google-Smtp-Source: AHgI3IY4IaZB0/AD3MqxDv76sPQCulg1p7mkYJdllWZ+ZYV2KBd/r2UbSXXMuEJQtWVjTFkoJ1Hhfg== X-Received: by 2002:a17:902:7402:: with SMTP id g2mr3821791pll.254.1550854928886; Fri, 22 Feb 2019 09:02:08 -0800 (PST) Received: from cakuba.netronome.com ([2601:646:8e00:1b7a::3]) by smtp.gmail.com with ESMTPSA id e2sm4211168pga.92.2019.02.22.09.02.08 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 22 Feb 2019 09:02:08 -0800 (PST) Date: Fri, 22 Feb 2019 09:02:04 -0800 From: Jakub Kicinski To: Michal Kubecek Cc: davem@davemloft.net, jiri@resnulli.us, andrew@lunn.ch, f.fainelli@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com Subject: Re: [PATCH net-next 4/5] nfp: add .ndo_get_devlink Message-ID: <20190222090204.20c410e3@cakuba.netronome.com> In-Reply-To: <20190222100450.GR23151@unicorn.suse.cz> References: <20190221174620.12144-1-jakub.kicinski@netronome.com> <20190221174620.12144-5-jakub.kicinski@netronome.com> <20190222100450.GR23151@unicorn.suse.cz> Organization: Netronome Systems, Ltd. MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Fri, 22 Feb 2019 11:04:50 +0100, Michal Kubecek wrote: > On Thu, Feb 21, 2019 at 09:46:19AM -0800, Jakub Kicinski wrote: > > Support getting devlink instance from a new NDO. > > > > Signed-off-by: Jakub Kicinski > > --- > > drivers/net/ethernet/netronome/nfp/nfp_app.h | 2 ++ > > drivers/net/ethernet/netronome/nfp/nfp_devlink.c | 11 +++++++++++ > > drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 1 + > > drivers/net/ethernet/netronome/nfp/nfp_net_repr.c | 1 + > > 4 files changed, 15 insertions(+) > > > > diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h > > index d578d856a009..f8d422713705 100644 > > --- a/drivers/net/ethernet/netronome/nfp/nfp_app.h > > +++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h > > @@ -433,4 +433,6 @@ int nfp_app_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, > > int nfp_app_nic_vnic_init_phy_port(struct nfp_pf *pf, struct nfp_app *app, > > struct nfp_net *nn, unsigned int id); > > > > +struct devlink *nfp_devlink_get_devlink(struct net_device *netdev); > > + > > #endif > > diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c > > index db2da99f6aa7..e9eca99cf493 100644 > > --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c > > +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c > > @@ -376,3 +376,14 @@ void nfp_devlink_port_unregister(struct nfp_port *port) > > { > > devlink_port_unregister(&port->dl_port); > > } > > + > > +struct devlink *nfp_devlink_get_devlink(struct net_device *netdev) > > +{ > > + struct nfp_app *app; > > + > > + app = nfp_app_from_netdev(netdev); > > + if (!app) > > + return NULL; > > + > > + return priv_to_devlink(app->pf); > > +} > > AFAICS this would return a pointer to zero initialized struct devlink > when built with CONFIG_DEVLINK=n. Then devlink_compat_running_version() > would execute > > if (!dev->netdev_ops->ndo_get_devlink) > return; > > devlink = dev->netdev_ops->ndo_get_devlink(dev); > if (!devlink || !devlink->ops->info_get) > return; > > with non-null devlink but null devlink->ops so that it dereferences null > pointer (and so does devlink_compat_flash_update()). devlink_compat_flash_update() is this if CONFIG_DEVLINK=n: static inline int devlink_compat_flash_update(struct net_device *dev, const char *file_name) { return -EOPNOTSUPP; } No? > Maybe it would be safer not to call ndo_get_devlink directly and have > an inline wrapper like > > #if IS_ENABLED(CONFIG_NET_DEVLINK) > static inline struct devlink *dev_get_devlink(struct net_device *dev) > { > if (dev->netdev_ops->ndo_get_devlink) > return dev->netdev_ops->ndo_get_devlink(); > else > retrurn NULL; > } > #else > static inline struct devlink *dev_get_devlink(struct net_device *dev) > { > return NULL; > } > #endif > > so that one can simply call the wrapper and check return value for NULL. Only devlink code can call this ndo, and it doesn't exist with DEVLINK=n. I don't dislike wrappers for NDOs, but I'll defer to Jiri to decide if we want a wrapper here (without the #if/#else, just the first part for code clarity) :)