From patchwork Fri Mar 22 16:56:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 1061407 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=resnulli.us Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="GaByZ6O5"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44QqZV4x8bz9sRf for ; Sat, 23 Mar 2019 03:57:06 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728845AbfCVQ5F (ORCPT ); Fri, 22 Mar 2019 12:57:05 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:33613 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728706AbfCVQ5E (ORCPT ); Fri, 22 Mar 2019 12:57:04 -0400 Received: by mail-wr1-f65.google.com with SMTP id q1so3150978wrp.0 for ; Fri, 22 Mar 2019 09:57:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=jSjk1UHph0V7iTg+WoNFHctDNWMQ/XAuBeJ3s0x2dsE=; b=GaByZ6O51GHVbJ+boYvM9PbDK5dvuMAo2I8jWZqi8sIV7Nk+Z3jJtSEN98mQJXth2F o3xXgse+nsvaJH+yM4AHS9LVllbkEGNqBvTa0iIHIUanmGi8PlnGlvBDemYEzjY3xNLA 1N3pE0/StSfO0VrOCrSf74wJI0wJ4CHe3CsSokySgC6DI5kZl4iN026x0dRV4m5ku1wi jGM41R7MwkNK8jztx1vJaHO0N8GEgsIZWk9i3Ejf7ZbTtjQ1WE0y6FxyDtWxmIIx8/U7 ZwJP3gYe0W0qImAaKLi4sqmgwTufYaSRa3em6JgwYvGMDV/Slz/4J82vMQAwLwPkBVUg ophg== 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; bh=jSjk1UHph0V7iTg+WoNFHctDNWMQ/XAuBeJ3s0x2dsE=; b=ZIU6hoQHN/XPr2khU+RxvAiPGcmXQdKahMHDRC3tWqnCnPEO9ZZjpyhT7W/sh6R+8n CI9gu2+8lPGwyuKB8b6m9yMzGfbVqkA6eXB3C9nJhg63Em6FDO3NZ21H5Ck12M4AzhEF p3La98SEazCLsyZIp2IynDy7p1U7ShCjowe0R/m9d+EVz/rWC/1kkihaNwDYOyPOwsEO ZBQwr7TfOagb5YHewwVsaNYvmwPETIlvi3n9KO6yX4C0qxDqxGzRDROB1Ug0xiG3vQvx jJ9mlq5J64z+UV1HEiuj9CuDXX21eeFNi1SsASJRiAgMAHTs1UNE4KMTe7m1u73yifig N1Vg== X-Gm-Message-State: APjAAAX539uQ42/+xkoCf8Vuink4QX/xZOis/Su9f6lDFh6SlPdhitnN yUZqXIBL/dE2frHWnxh37IaTEPNGyl4= X-Google-Smtp-Source: APXvYqwFw3YYV2ZX3C0pbJqaS61T0uCW886JnYXMcwZ61wO6CNbwB+pL1hthVahckP8dwoGyp3Oh3g== X-Received: by 2002:a05:6000:1291:: with SMTP id f17mr7100619wrx.201.1553273822363; Fri, 22 Mar 2019 09:57:02 -0700 (PDT) Received: from localhost ([195.39.71.253]) by smtp.gmail.com with ESMTPSA id q26sm8722705wmc.6.2019.03.22.09.57.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 22 Mar 2019 09:57:01 -0700 (PDT) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, mlxsw@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, f.fainelli@gmail.com, andrew@lunn.ch, vivien.didelot@gmail.com Subject: [patch net-next v2 14/15] net: devlink: add port type spinlock Date: Fri, 22 Mar 2019 17:56:35 +0100 Message-Id: <20190322165636.1725-15-jiri@resnulli.us> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190322165636.1725-1-jiri@resnulli.us> References: <20190322165636.1725-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko Add spinlock to protect port type and type_dev pointer consistency. Without that, userspace may see inconsistent type and type_dev combinations. Signed-off-by: Jiri Pirko v1->v2: - rebased --- include/net/devlink.h | 4 ++++ net/core/devlink.c | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index 63de99e09f04..cb9b060033e1 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -53,6 +54,9 @@ struct devlink_port { struct devlink *devlink; unsigned index; bool registered; + spinlock_t type_lock; /* Protects type and type_dev + * pointer consistency. + */ enum devlink_port_type type; enum devlink_port_type desired_type; void *type_dev; diff --git a/net/core/devlink.c b/net/core/devlink.c index ff3e31010954..cf389e26a32d 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -543,12 +544,14 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, goto nla_put_failure; if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index)) goto nla_put_failure; + + spin_lock(&devlink_port->type_lock); if (nla_put_u16(msg, DEVLINK_ATTR_PORT_TYPE, devlink_port->type)) - goto nla_put_failure; + goto nla_put_failure_type_locked; if (devlink_port->desired_type != DEVLINK_PORT_TYPE_NOTSET && nla_put_u16(msg, DEVLINK_ATTR_PORT_DESIRED_TYPE, devlink_port->desired_type)) - goto nla_put_failure; + goto nla_put_failure_type_locked; if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) { struct net_device *netdev = devlink_port->type_dev; @@ -557,7 +560,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, netdev->ifindex) || nla_put_string(msg, DEVLINK_ATTR_PORT_NETDEV_NAME, netdev->name))) - goto nla_put_failure; + goto nla_put_failure_type_locked; } if (devlink_port->type == DEVLINK_PORT_TYPE_IB) { struct ib_device *ibdev = devlink_port->type_dev; @@ -565,14 +568,17 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, if (ibdev && nla_put_string(msg, DEVLINK_ATTR_PORT_IBDEV_NAME, ibdev->name)) - goto nla_put_failure; + goto nla_put_failure_type_locked; } + spin_unlock(&devlink_port->type_lock); if (devlink_nl_port_attrs_put(msg, devlink_port)) goto nla_put_failure; genlmsg_end(msg, hdr); return 0; +nla_put_failure_type_locked: + spin_unlock(&devlink_port->type_lock); nla_put_failure: genlmsg_cancel(msg, hdr); return -EMSGSIZE; @@ -5337,6 +5343,7 @@ int devlink_port_register(struct devlink *devlink, devlink_port->devlink = devlink; devlink_port->index = port_index; devlink_port->registered = true; + spin_lock_init(&devlink_port->type_lock); list_add_tail(&devlink_port->list, &devlink->port_list); INIT_LIST_HEAD(&devlink_port->param_list); mutex_unlock(&devlink->lock); @@ -5367,8 +5374,10 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port, { if (WARN_ON(!devlink_port->registered)) return; + spin_lock(&devlink_port->type_lock); devlink_port->type = type; devlink_port->type_dev = type_dev; + spin_unlock(&devlink_port->type_lock); devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); }