From patchwork Fri Feb 22 22:07:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1047149 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="P76DbyQ8"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 445lyM2V1Sz9sBF for ; Sat, 23 Feb 2019 09:15:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726546AbfBVWPG (ORCPT ); Fri, 22 Feb 2019 17:15:06 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:43163 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726460AbfBVWPF (ORCPT ); Fri, 22 Feb 2019 17:15:05 -0500 Received: by mail-qt1-f196.google.com with SMTP id y4so4300373qtc.10 for ; Fri, 22 Feb 2019 14:15:04 -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=W0KInqHfxHpYsVM8Uw5Rmji+8D25kv7i/DL4ouf3wHE=; b=P76DbyQ8Ue4f2IWS4tPxWdOh1pWM+VMYembPKb+jZUz1MMYQsKkuynjktTgbg/7C91 aAoUSH8Yk6TTPCqMWRzn95wnrFv1zLWqMEeYY2rf2OqstedJKZO0uo/GBjTpLlXrAeAK dQiDnnT/IfAsiNv1vf8iRO4p9JTNXSzlFqceTr9mfyGGqFyOFvDpn5CTGKxWloRxF22M pJk6rLwwKI+BMLzt4dCFkHNlzWjsDS7ORDWmAC/GamkOJ0sZzUsysm9Y6cyISArUg0zL onQayxAErCNMeQ4g3+VD1xhSKEMcxGT7A5vWFTuGqAqZZfKHPWmQgeO3WI87EDegJCQb 4MfQ== 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=W0KInqHfxHpYsVM8Uw5Rmji+8D25kv7i/DL4ouf3wHE=; b=tLT3xrefkk07y5H9GPP8jmYzfijHYDA7/eK/Xr3K8/yFOmup4CjVvYkuODyHM8HEBP EBFTXOWzmfuofVqvcy+/X2DTUK8RlDaOu+wx5ofntZMRThf/PDSGPcgUpEH8X33q7gjR 0ElwyHKrIMfGE1btqxqsyuKAiZQebykwzP/sWw/0+OU+1ewD5yMCXJEahEEO/sXsm5Pm capkTIm9m81wmMn6ot9jZh52jOLJlVLcuRo+23QAAkX77kvZWn/PyRRv1RvSR6oeistm zMCUeAA9wyejZuvwYkGK0/CfuubGAlq7FOOzNyEhN4IzW5Za99XErPp4MXo756jKIScq TGMA== X-Gm-Message-State: AHQUAuZrbqFfkWiojwPhQwPKWvqBjSDODJeDwabSH2AdKlF442NEQVaJ zwfwjjue0/mlf6DKUlEIBJJEjw== X-Google-Smtp-Source: AHgI3IZVYU6xXPgfBhW7rTKQQGPTZAUAOKsU24FstBMqAzW8Wy0VOCucA74KIO/vSS0PBem57G/GLQ== X-Received: by 2002:a0c:9144:: with SMTP id q62mr4922222qvq.87.1550873703938; Fri, 22 Feb 2019 14:15:03 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id j66sm2707211qkj.27.2019.02.22.14.15.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 14:15:03 -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 v3 5/6] devlink: hold a reference to the netdevice around ethtool compat Date: Fri, 22 Feb 2019 14:07:56 -0800 Message-Id: <20190222220758.7117-6-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190222220758.7117-1-jakub.kicinski@netronome.com> References: <20190222220758.7117-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When ethtool is calling into devlink compat code make sure we have a reference on the netdevice on which the operation was invoked. v3: move the hold/lock logic into devlink_compat_* functions (Florian) Signed-off-by: Jakub Kicinski --- net/core/devlink.c | 34 +++++++++++++++++++++++----------- net/core/ethtool.c | 13 ++----------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/net/core/devlink.c b/net/core/devlink.c index a13055160be0..78c6ea1870ca 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -6430,27 +6430,39 @@ void devlink_compat_running_version(struct net_device *dev, { struct devlink *devlink; + dev_hold(dev); + rtnl_unlock(); + devlink = netdev_to_devlink(dev); - if (!devlink || !devlink->ops || !devlink->ops->info_get) - return; + if (devlink && devlink->ops && devlink->ops->info_get) { + mutex_lock(&devlink->lock); + __devlink_compat_running_version(devlink, buf, len); + mutex_unlock(&devlink->lock); + } - mutex_lock(&devlink->lock); - __devlink_compat_running_version(devlink, buf, len); - mutex_unlock(&devlink->lock); + rtnl_lock(); + dev_put(dev); } int devlink_compat_flash_update(struct net_device *dev, const char *file_name) { struct devlink *devlink; - int ret; + int ret = -EOPNOTSUPP; + + dev_hold(dev); + rtnl_unlock(); devlink = netdev_to_devlink(dev); - if (!devlink || !devlink->ops || !devlink->ops->flash_update) - return -EOPNOTSUPP; + if (devlink && devlink->ops && devlink->ops->flash_update) { + mutex_lock(&devlink->lock); + ret = devlink->ops->flash_update(devlink, file_name, + NULL, NULL); + mutex_unlock(&devlink->lock); + } + + rtnl_lock(); + dev_put(dev); - mutex_lock(&devlink->lock); - ret = devlink->ops->flash_update(devlink, file_name, NULL, NULL); - mutex_unlock(&devlink->lock); return ret; } diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 1320e8dce559..47558ffae423 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -805,11 +805,9 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, if (ops->get_eeprom_len) info.eedump_len = ops->get_eeprom_len(dev); - rtnl_unlock(); if (!info.fw_version[0]) devlink_compat_running_version(dev, info.fw_version, sizeof(info.fw_version)); - rtnl_lock(); if (copy_to_user(useraddr, &info, sizeof(info))) return -EFAULT; @@ -2040,15 +2038,8 @@ static noinline_for_stack int ethtool_flash_device(struct net_device *dev, return -EFAULT; efl.data[ETHTOOL_FLASH_MAX_FILENAME - 1] = 0; - if (!dev->ethtool_ops->flash_device) { - int ret; - - rtnl_unlock(); - ret = devlink_compat_flash_update(dev, efl.data); - rtnl_lock(); - - return ret; - } + if (!dev->ethtool_ops->flash_device) + return devlink_compat_flash_update(dev, efl.data); return dev->ethtool_ops->flash_device(dev, &efl); }