From patchwork Thu Jun 22 01:25:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 779223 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wtP6k0lrfz9s4q for ; Thu, 22 Jun 2017 11:26:06 +1000 (AEST) 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="u593eQe2"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752150AbdFVB0F (ORCPT ); Wed, 21 Jun 2017 21:26:05 -0400 Received: from mail-pg0-f42.google.com ([74.125.83.42]:33327 "EHLO mail-pg0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752132AbdFVB0D (ORCPT ); Wed, 21 Jun 2017 21:26:03 -0400 Received: by mail-pg0-f42.google.com with SMTP id f127so1226805pgc.0 for ; Wed, 21 Jun 2017 18:26:03 -0700 (PDT) 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; bh=u4hQvEalXKh9QZ/ZZxeTij+6wgVGSiOYeCM6yuaONk4=; b=u593eQe2wskcBsrVsnBwHHdJK0NT7ARvvO2b+3lIqSAor42N4P9qoez4X1FaGRgDfM qxKc1+vkynvdfxZKQ2taLLc0mnVkhbiYIFaADNDAUl0Tv4/YMD0orNpTLsCcF37o680b 8bcKoTFai4Wc5iuPFr2cXcBdqbNnIArmxFODT0g1hmDrSFXgxkzxwJ9G0nBp2/rfoRp2 IC1HSOTB/ZNBaT6aEoG0JQ8+RoaX4cz0p2VHwP9LhUKkhCDt1dHKvYhtM+HrLU9BOYn4 71APXmhzVUV3CwiKWdSHxPBIJm1Bh4dLjEb1iaxLmHnZWk1QUsTMY3iJWjEaZjlmp7wS K2Tg== 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=u4hQvEalXKh9QZ/ZZxeTij+6wgVGSiOYeCM6yuaONk4=; b=KAQmWOAXIFL8/9MAEwxz3AoD7ujt9NUKSUHtd4NDuTqjqPuIoEJRvm9lR6NPIJErOn O3g436LVUPGJ602vDb17C2kpNxzc5QE554t61qs/qHnTmw8x4dYLNbmR5BiDoYQoI+Wl 9c5yRQ1VQ7iH6xk0wNBIqLDkL2M9YviZWlnenDKPvm5oJgjER4M2YRZbdo46Jad3nD6G K+kbVCVFtr9cwLKSRjyrPM5AedYmoKT+Xdmj/wFmWcIwwwULiSGshOIAJa3+3Ae0+IrH jCcDMONzpAgLoJd3uiJTPfSf1FoepM74dSxS/cjOPpYkpbkasi6AkLLy5OOGG1nuj0ia nfHA== X-Gm-Message-State: AKS2vOx8Qbds4q3BFQbevIvHvKHyb3beSlSK3QksMzJNTpHFn/1jEt1E asLx42F8EZnlyni9xRY= X-Received: by 10.84.224.199 with SMTP id k7mr49719pln.207.1498094762344; Wed, 21 Jun 2017 18:26:02 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id p90sm66806pfj.8.2017.06.21.18.26.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 21 Jun 2017 18:26:01 -0700 (PDT) From: Jakub Kicinski To: netdev@vger.kernel.org Cc: oss-drivers@netronome.com, kafai@fb.com, daniel@iogearbox.net, davem@davemloft.net, Jakub Kicinski Subject: [PATCH net-next 7/8] xdp: add reporting of offload mode Date: Wed, 21 Jun 2017 18:25:09 -0700 Message-Id: <20170622012510.5286-8-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170622012510.5286-1-jakub.kicinski@netronome.com> References: <20170622012510.5286-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Extend the XDP_ATTACHED_* values to include offloaded mode. Let drivers report whether program is installed in the driver or the HW by changing the prog_attached field from bool to u8 (type of the netlink attribute). Exploit the fact that the value of XDP_ATTACHED_DRV is 1, therefore since all drivers currently assign the mode with double negation: mode = !!xdp_prog; no drivers have to be modified. Signed-off-by: Jakub Kicinski Acked-by: Daniel Borkmann --- include/linux/netdevice.h | 7 ++++--- include/uapi/linux/if_link.h | 1 + net/core/dev.c | 3 +-- net/core/rtnetlink.c | 6 +++--- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index a838591aad28..68f5d899d1e6 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -809,7 +809,8 @@ enum xdp_netdev_command { XDP_SETUP_PROG, XDP_SETUP_PROG_HW, /* Check if a bpf program is set on the device. The callee should - * return true if a program is currently attached and running. + * set @prog_attached to one of XDP_ATTACHED_* values, note that "true" + * is equivalent to XDP_ATTACHED_DRV. */ XDP_QUERY_PROG, }; @@ -827,7 +828,7 @@ struct netdev_xdp { }; /* XDP_QUERY_PROG */ struct { - bool prog_attached; + u8 prog_attached; u32 prog_id; }; }; @@ -3307,7 +3308,7 @@ struct sk_buff *dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, typedef int (*xdp_op_t)(struct net_device *dev, struct netdev_xdp *xdp); int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, int fd, u32 flags); -bool __dev_xdp_attached(struct net_device *dev, xdp_op_t xdp_op, u32 *prog_id); +u8 __dev_xdp_attached(struct net_device *dev, xdp_op_t xdp_op, u32 *prog_id); int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb); int dev_forward_skb(struct net_device *dev, struct sk_buff *skb); diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index ce777ec88e1e..8d062c58d5cb 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -903,6 +903,7 @@ enum { XDP_ATTACHED_NONE = 0, XDP_ATTACHED_DRV, XDP_ATTACHED_SKB, + XDP_ATTACHED_HW, }; enum { diff --git a/net/core/dev.c b/net/core/dev.c index cd885e9e3363..a91572aa73d5 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -6934,8 +6934,7 @@ int dev_change_proto_down(struct net_device *dev, bool proto_down) } EXPORT_SYMBOL(dev_change_proto_down); -bool __dev_xdp_attached(struct net_device *dev, xdp_op_t xdp_op, - u32 *prog_id) +u8 __dev_xdp_attached(struct net_device *dev, xdp_op_t xdp_op, u32 *prog_id) { struct netdev_xdp xdp; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index a5bedd03a63e..9a1bd510c812 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1265,10 +1265,10 @@ static u8 rtnl_xdp_attached_mode(struct net_device *dev, u32 *prog_id) *prog_id = generic_xdp_prog->aux->id; return XDP_ATTACHED_SKB; } - if (ops->ndo_xdp && __dev_xdp_attached(dev, ops->ndo_xdp, prog_id)) - return XDP_ATTACHED_DRV; + if (!ops->ndo_xdp) + return XDP_ATTACHED_NONE; - return XDP_ATTACHED_NONE; + return __dev_xdp_attached(dev, ops->ndo_xdp, prog_id); } static int rtnl_xdp_fill(struct sk_buff *skb, struct net_device *dev)