From patchwork Fri Jan 18 13:03:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?QmrDtnJuIFTDtnBlbA==?= X-Patchwork-Id: 1027324 X-Patchwork-Delegate: bpf@iogearbox.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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="V5XpuNPh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43h1NS5PZqz9sCh for ; Sat, 19 Jan 2019 00:03:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727177AbfARNDv (ORCPT ); Fri, 18 Jan 2019 08:03:51 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:41590 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726810AbfARNDv (ORCPT ); Fri, 18 Jan 2019 08:03:51 -0500 Received: by mail-pl1-f196.google.com with SMTP id u6so6334324plm.8 for ; Fri, 18 Jan 2019 05:03:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5XAwWZ5CrpeiYWc0LszOySV/fE8d0J8DapWrgIHjrIY=; b=V5XpuNPhl8IzhEijcCXZaDkC88LoXmUYof286CO7m511aTdVmmBTaunLBKFBvjZ45b RupEcP1toRx/oGUO08Nn4mSdJLF0EnpRjcU1icDgEkNrEEGOOLD0f4+cz3LR2UiDAqyy yJlVdUyuUQhJBC8W3cnhUQlTE/eMl81JY1XLrf8nyoy7fuxRmM1TR64YC9/LMhMghDEW gZicsNZr8TFGKZKlPEm/TkRhJPhE/eNQ0KAQPNjotN+mdm5KqAsazArR9XpZDBKgvAVK 6CYJNa7jrGO9HdLkjJWdVFEGWrf6hT6PuDrDO7LCEcWw+HcAfRarDbK2cWh2acseXrhd JPrw== 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=5XAwWZ5CrpeiYWc0LszOySV/fE8d0J8DapWrgIHjrIY=; b=QlW/tbLEcOXpY4uZATAiuVYV53Nh3hvIEmsJQ0K4h9NKhZzy8AkAX0V2zaBLx3DJcm QVbCTBVfwTnk+H8+3mEGRWFGiMDTHnE6RerrxFmkQjFpzjpAnfWBpIfCXVLT+Lva0AEl KfAzzz8m4J1jwGe4QKr2nV7+8niPgWwD72QseQT+FeQpFXWGovwDpanuZp9ttO+kDUiE TKx3ASrz6ms3NBmpZWtrxxfbqn5MG3oK/vBhG0bJa8IhXCihqRj06IG7tXk8KkD8Vlp6 QLaE1e0AqCz3BNPmVzQWt8OoMzEasAFyTeitE7h5qNaFQDz1Sr8Hmxz5oDr88mxUsDmp 9FhQ== X-Gm-Message-State: AJcUukcYMJLoGfubvnNgdoVMhCPqFC53M6g9n8eO3uHRgXqKefoCLHr0 h52BznU1v5UhlajjWON8PGk= X-Google-Smtp-Source: ALg8bN6tNvver0WG/QiWTYTFLq6bGldfciaWA+5kwanbpVNagUQrLiIFJqTvOyCGO/3d6pvcVj/Qpg== X-Received: by 2002:a17:902:bd0b:: with SMTP id p11mr19213604pls.259.1547816630366; Fri, 18 Jan 2019 05:03:50 -0800 (PST) Received: from btopel-mobl.ger.intel.com (fmdmzpr04-ext.fm.intel.com. [192.55.54.39]) by smtp.gmail.com with ESMTPSA id 84sm12418712pfa.115.2019.01.18.05.03.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 Jan 2019 05:03:49 -0800 (PST) From: bjorn.topel@gmail.com To: ast@kernel.org, daniel@iogearbox.net, netdev@vger.kernel.org Cc: =?utf-8?b?QmrDtnJuIFTDtnBlbA==?= , magnus.karlsson@intel.com, magnus.karlsson@gmail.com Subject: [PATCH bpf-next 1/3] net: xsk: track AF_XDP sockets on a per-netns list Date: Fri, 18 Jan 2019 14:03:03 +0100 Message-Id: <20190118130305.11504-2-bjorn.topel@gmail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190118130305.11504-1-bjorn.topel@gmail.com> References: <20190118130305.11504-1-bjorn.topel@gmail.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Björn Töpel Track each AF_XDP socket in a per-netns list. This will be used later by the sock_diag interface for querying sockets from userspace. Signed-off-by: Björn Töpel --- include/net/net_namespace.h | 4 ++++ include/net/netns/xdp.h | 13 +++++++++++++ net/xdp/xsk.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 include/net/netns/xdp.h diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 99d4148e0f90..a68ced28d8f4 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -160,6 +161,9 @@ struct net { #endif #if IS_ENABLED(CONFIG_CAN) struct netns_can can; +#endif +#ifdef CONFIG_XDP_SOCKETS + struct netns_xdp xdp; #endif struct sock *diag_nlsk; atomic_t fnhe_genid; diff --git a/include/net/netns/xdp.h b/include/net/netns/xdp.h new file mode 100644 index 000000000000..e5734261ba0a --- /dev/null +++ b/include/net/netns/xdp.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __NETNS_XDP_H__ +#define __NETNS_XDP_H__ + +#include +#include + +struct netns_xdp { + struct mutex lock; + struct hlist_head list; +}; + +#endif /* __NETNS_XDP_H__ */ diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index a03268454a27..80ca48cefc42 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -350,6 +350,10 @@ static int xsk_release(struct socket *sock) net = sock_net(sk); + mutex_lock(&net->xdp.lock); + sk_del_node_init_rcu(sk); + mutex_unlock(&net->xdp.lock); + local_bh_disable(); sock_prot_inuse_add(net, sk->sk_prot, -1); local_bh_enable(); @@ -746,6 +750,10 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol, mutex_init(&xs->mutex); spin_lock_init(&xs->tx_completion_lock); + mutex_lock(&net->xdp.lock); + sk_add_node_rcu(sk, &net->xdp.list); + mutex_unlock(&net->xdp.lock); + local_bh_disable(); sock_prot_inuse_add(net, &xsk_proto, 1); local_bh_enable(); @@ -759,6 +767,23 @@ static const struct net_proto_family xsk_family_ops = { .owner = THIS_MODULE, }; +static int __net_init xsk_net_init(struct net *net) +{ + mutex_init(&net->xdp.lock); + INIT_HLIST_HEAD(&net->xdp.list); + return 0; +} + +static void __net_exit xsk_net_exit(struct net *net) +{ + WARN_ON_ONCE(!hlist_empty(&net->xdp.list)); +} + +static struct pernet_operations xsk_net_ops = { + .init = xsk_net_init, + .exit = xsk_net_exit, +}; + static int __init xsk_init(void) { int err; @@ -771,8 +796,13 @@ static int __init xsk_init(void) if (err) goto out_proto; + err = register_pernet_subsys(&xsk_net_ops); + if (err) + goto out_sk; return 0; +out_sk: + sock_unregister(PF_XDP); out_proto: proto_unregister(&xsk_proto); out: