From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574764787; cv=none; d=zohomail.com; s=zohoarc; b=Fe2tbm671J8utTBSP6716ciBBMgCKLFJUmOfIOGUiI9ljuP+krTXKvWjdsT8vEiDH4bdJM4ZGkvv4c2NR5oySC0LDZz+9rBEZVO2G9uQgSj7vSknv0e5ZpN7ouEATSsxSa6Nqs6jL4fEwoI7PwD+PdQb7kCvzJelXSChavK/A9w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574764787; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=1Sl43iVtC4+YcjLflynrQtIj0zEs25bg62I/x2OEQu0=; b=WJrXRs/629mmGiwVPXBo4gzIC2SkqLIYcOd+UolMy+eRmhewwAhzzgud2FYcEDr02IR8+W7d3OV7bayU4X71e3EZwaqqCCyGTipvHXcHy2gVQtps0ki8qDWxYu3lJMBlOlHflCvLMnLg838zn5jkoA9DxYJoLWqUyvUAw/dqaig= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574764787413959.9591231027435; Tue, 26 Nov 2019 02:39:47 -0800 (PST) Received: from localhost ([::1]:52518 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZYG1-0001Iu-QS for importer@patchew.org; Tue, 26 Nov 2019 05:39:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57349) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsM-0005R4-PE for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXm3-0002qT-52 for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:08:48 -0500 Received: from mail-pj1-x1042.google.com ([2607:f8b0:4864:20::1042]:43244) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXm2-0002qK-Va for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:08:47 -0500 Received: by mail-pj1-x1042.google.com with SMTP id a10so8054367pju.10 for ; Tue, 26 Nov 2019 02:08:46 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.08.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:08:45 -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=1Sl43iVtC4+YcjLflynrQtIj0zEs25bg62I/x2OEQu0=; b=rA6x08okN9S24McUdG2LHlghnPmhIHd24jmymmQaGlT2PAs6RXcIrFN4KgQ3vtEJQH ienFzUlPPNlyI9b9KsozGHG9jQpVMUrYON+jnaQvRyei7uhWiVfPBjDJK/c0EY88qnZp ZDkq7a+rI2J1MXnLhIb+/EQ22pDhhmb3BAM7x8wEHqFYQ02bE0rYvl/KjEMarmxBop+q p94+hXB+SsDfHHCvbR+iONGBx5fsJeIFS9XDNF/UJ7uD0+X9HjxSjqCZa8oiIpnB76Hg UUUoXmIcImh1gfbohC0t5i//haGFawSR5oYyXeA/IjzMZkOh/+g99F3i75HTqeit7+cx TveQ== 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=1Sl43iVtC4+YcjLflynrQtIj0zEs25bg62I/x2OEQu0=; b=fx3f6QLmZvbavRB7Mk90Za2/X7aYlhmnHhiaVfGPKJBhES4uQpbXepR56hRyGkKpT/ GoaTK7ru77nbkW47JfKumtDFogU2aP1kNemjx34Q7FK3utPRCqpWIKcK8V3Pe4OY9dfX +ibQnY5VbqamFUJnOeHG7f9VRyGKONZNY0Tp0S13TqiehSo6dSKk3qNN58L74DTBJAO+ DehD6zaSlyj59fI1p4UB+yfnoIn897/lUqVnQ5AIII5O2BfRCYYgwSzBTffKL7Ih5NqV HmUkBCXos1KmCSj26jeFy0L6SQXGhyqpWlNDfCeEC9Gz9UsqwBUVDy7yxBgtzAM2B98+ 3ksQ== X-Gm-Message-State: APjAAAWpiXlCx9iMaP3wVzufF3wNAcXh2/LqO63ohdJjvwmPNRKQrbbr /fCf49Zy5I2siTSk0EiaoJI= X-Google-Smtp-Source: APXvYqxA6tuNs0G2K7BYOi/UgwxlWXR+3qbxnD5Hrpm6hj4529qhKxDgIXplkY5qr6yeBIl6U2CJIw== X-Received: by 2002:a17:90a:5aa3:: with SMTP id n32mr5651673pji.97.1574762926051; Tue, 26 Nov 2019 02:08:46 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 01/18] bpf: introduce bpf_prog_offload_verifier_setup() Date: Tue, 26 Nov 2019 19:07:27 +0900 Message-Id: <20191126100744.5083-2-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::1042 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang Background: This change was initiated from virtio_net XDP offload work. As per the implementation plan, a copy of original program with map fds from guest replaced with map fds from host needs to be offloaded to the host. To implement this fd replacement, insn_hook() must provide an insn with map fd intact. bpf_map and driver specific map data can be derived from map_fd. Since verifier calls all the offload callbacks after replacing map fds, it was difficult to implement virtio_net XDP offload feature. If virtio_net gets only one callback with original bpf program, it will get a chance to perform the fd replacement in its own copy of the program. Solution: Let's introduce a setup() callback in bpf_prog_offload_ops. It will be non mandetory. The verifier will call it just before replacing the map fds. Signed-off-by: Jason Wang Signed-off-by: Prashant Bhole --- include/linux/bpf.h | 1 + include/linux/bpf_verifier.h | 1 + kernel/bpf/offload.c | 14 ++++++++++++++ kernel/bpf/verifier.c | 6 ++++++ 4 files changed, 22 insertions(+) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 35903f148be5..1cdba120357c 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -361,6 +361,7 @@ struct bpf_prog_offload_ops { struct bpf_insn *insn); int (*remove_insns)(struct bpf_verifier_env *env, u32 off, u32 cnt); /* program management callbacks */ + int (*setup)(struct bpf_prog *prog); int (*prepare)(struct bpf_prog *prog); int (*translate)(struct bpf_prog *prog); void (*destroy)(struct bpf_prog *prog); diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 26e40de9ef55..de7028e17c0d 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -418,6 +418,7 @@ static inline struct bpf_reg_state *cur_regs(struct bpf= _verifier_env *env) return cur_func(env)->regs; } =20 +int bpf_prog_offload_verifier_setup(struct bpf_prog *prog); int bpf_prog_offload_verifier_prep(struct bpf_prog *prog); int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx); diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c index 5b9da0954a27..04ca7a31d947 100644 --- a/kernel/bpf/offload.c +++ b/kernel/bpf/offload.c @@ -124,6 +124,20 @@ int bpf_prog_offload_init(struct bpf_prog *prog, union= bpf_attr *attr) return err; } =20 +int bpf_prog_offload_verifier_setup(struct bpf_prog *prog) +{ + struct bpf_prog_offload *offload; + int ret =3D 0; + + down_read(&bpf_devs_lock); + offload =3D prog->aux->offload; + if (offload && offload->offdev->ops->setup) + ret =3D offload->offdev->ops->setup(prog); + up_read(&bpf_devs_lock); + + return ret; +} + int bpf_prog_offload_verifier_prep(struct bpf_prog *prog) { struct bpf_prog_offload *offload; diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index a0482e1c4a77..94b43542439e 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -9737,6 +9737,12 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr= *attr, =20 env->allow_ptr_leaks =3D is_priv; =20 + if (bpf_prog_is_dev_bound(env->prog->aux)) { + ret =3D bpf_prog_offload_verifier_setup(env->prog); + if (ret) + goto skip_full_check; + } + if (is_priv) env->test_state_freq =3D attr->prog_flags & BPF_F_TEST_STATE_FREQ; =20 --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763992; cv=none; d=zohomail.com; s=zohoarc; b=TLYwcWCvgIECl37r0vcSSga6FRXA0xKjDCbrbKee44ZuzpiqdCpLLGQx1HhFuVqMS0WREGSkwotpks116/H/8u3KPP4/zQKD3O96zHeXlecGE+644o32D+nrmrF/jraABo8JXHAUWLbSlZ4+h9DzvP35K7aLiLDihwtkyHre+i0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763992; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=TORKveKiyyu6m2oHodE9IBcjkbwEar3Vt5jDpzgDylY=; b=GXWD+m21d+BYiaitajLOWno3XTvziBl5rwlf+G8WggoghZYoEpJ4jQFY1HYgFczgSsq3Vu0DARrmFdMdxE62cMnTKds1IZ7kiJRHs3+tExTX2e++iXZuncxYPe/vfvVtC7CRpdxKhfPlhlDXsD/RNk6mwkC1SLKOMoi0da3vuNY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763992302635.7723451446838; Tue, 26 Nov 2019 02:26:32 -0800 (PST) Received: from localhost ([::1]:52310 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY3C-0002y5-W1 for importer@patchew.org; Tue, 26 Nov 2019 05:26:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57439) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsM-0005fI-IF for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXm6-0002re-Nx for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:08:51 -0500 Received: from mail-pj1-x1042.google.com ([2607:f8b0:4864:20::1042]:34727) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXm6-0002rZ-Ig for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:08:50 -0500 Received: by mail-pj1-x1042.google.com with SMTP id bo14so8069590pjb.1 for ; Tue, 26 Nov 2019 02:08:50 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.08.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:08:49 -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=TORKveKiyyu6m2oHodE9IBcjkbwEar3Vt5jDpzgDylY=; b=olv12Gp3grnekpbckL4cgsuKfI3uibM/xyKgxKaXAgysBCG0gD1zfwzI4bdTig2QPa bYj2KhBwBQCyeYdYx2+f9ANR6ntDY1QlasYD6qxyDMTFGZj2uvm7ko8kE58GZXl1Gx83 yxZQsAPqwNrJ0vcBYS7ybC0BFUlHVtzRy09jDp4McRhur9+hRM3WTEt+lbKHstbWmP9z At4RGyUZXvbnGh/bg5mBCIRT9jJzXZ/XyUpQTxrGKC9T6fcorgnyhMn8Hm9GLjMjBr2J pd/ik9nqYGr+vwPtpw0IYIaT05AfrD53fQBnlXT6YI9axZ6zErZc8n6ZW5g2ZslzHp5l 2UEA== 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=TORKveKiyyu6m2oHodE9IBcjkbwEar3Vt5jDpzgDylY=; b=Tn1DFshuUTrhfJLWiab+IittF8NmIHLYNURZsYVt2vW1tZaEqVVxBQf7Vk+rKoSqt5 MNUkiDc6CpRLxsgoW0ANmWF0xGWEpQBkbAOnIPG2LExYK5cIBVSWmbVBW1hNcocN96dV k1Ix9D+OC0umb8vF0/NOiL1CS27wfSR5QZT4w1Ca1HdtWEckl5G5Cah/i466iECeDceo VO99Y/VRy9scL9LY5/JJydQSRnNceeRCBphuWsaoIeISStZ38kPc7+LgiBpBu26N5tKx pFfDxERqSUEPjthn934HGstXt4b8p0YSs8MNatgzyxlQ+Ql8gh+L4GvWFyUNEHwOyFUy ipcg== X-Gm-Message-State: APjAAAUoi1OcaxCW2/fjoRUXssZbv4SAjy6bZHaheiqCuTlxxNXjVHKD 8J6wZfdDlDJBAHvJEHEVums= X-Google-Smtp-Source: APXvYqy7uBDP8l0aXZ/j5b2P/uoXgigesp5vSEQ3UrSFY/YqyNb+UCqonnG8Y2jEb1rpt6g0c9YHbg== X-Received: by 2002:a17:90a:c789:: with SMTP id gn9mr5574668pjb.99.1574762929845; Tue, 26 Nov 2019 02:08:49 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 02/18] net: core: rename netif_receive_generic_xdp() to do_generic_xdp_core() Date: Tue, 26 Nov 2019 19:07:28 +0900 Message-Id: <20191126100744.5083-3-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::1042 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang In skb generic path, we need a way to run XDP program on skb but to have customized handling of XDP actions. netif_receive_generic_xdp will be more helpful in such cases than do_xdp_generic. This patch prepares netif_receive_generic_xdp() to be used as general purpose function by renaming it. Signed-off-by: Jason Wang Signed-off-by: Prashant Bhole --- net/core/dev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/net/core/dev.c b/net/core/dev.c index c7fc902ccbdc..5ae647b9914f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4461,9 +4461,9 @@ static struct netdev_rx_queue *netif_get_rxqueue(stru= ct sk_buff *skb) return rxqueue; } =20 -static u32 netif_receive_generic_xdp(struct sk_buff *skb, - struct xdp_buff *xdp, - struct bpf_prog *xdp_prog) +static u32 do_xdp_generic_core(struct sk_buff *skb, + struct xdp_buff *xdp, + struct bpf_prog *xdp_prog) { struct netdev_rx_queue *rxqueue; void *orig_data, *orig_data_end; @@ -4610,7 +4610,7 @@ int do_xdp_generic(struct bpf_prog *xdp_prog, struct = sk_buff *skb) u32 act; int err; =20 - act =3D netif_receive_generic_xdp(skb, &xdp, xdp_prog); + act =3D do_xdp_generic_core(skb, &xdp, xdp_prog); if (act !=3D XDP_PASS) { switch (act) { case XDP_REDIRECT: --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763844; cv=none; d=zohomail.com; s=zohoarc; b=lnO0XI95jzOv2CGZ6VruG4EAZyj48TmoLUCag2s8t1C/ofVMQuBWu0csYkVzk1zoERGFfHsbGbBIBy3JBQDLjWiOaK0OFPO2knWy1Nk+SPUscHay/roS/FDNhUr8CzvjwvAJOdfznB2/ZlE9J4dcQHJ/lmwEaIq29HZ9h5VLvWA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763844; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=2bAHX0FXOgqRwz29p5ya1CXvQIHb2CLin8kXdVB/0KE=; b=Rmriw5+rPkDUfrkQgBR3G+FqZgaxdhmHpcWcsUwYjn8THM012tA9FweD/1oZpzu98sd+EAi0MXOW4IcedQhx3MKGHvSFSCGU/z8eTF5RUCx/M2CWF9ynVK44HR0e64XsOnj3B4D7wZVlzZM4xD1bentnYOHBUdxFZXZg2P14pRg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763844537874.0481606247381; Tue, 26 Nov 2019 02:24:04 -0800 (PST) Received: from localhost ([::1]:52278 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY0k-0007by-7E for importer@patchew.org; Tue, 26 Nov 2019 05:23:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57434) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsM-0005f2-8h for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmA-0002t5-JW for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:08:56 -0500 Received: from mail-pj1-x1042.google.com ([2607:f8b0:4864:20::1042]:40844) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmA-0002sg-EF for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:08:54 -0500 Received: by mail-pj1-x1042.google.com with SMTP id ep1so8068919pjb.7 for ; Tue, 26 Nov 2019 02:08:54 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.08.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:08:53 -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=2bAHX0FXOgqRwz29p5ya1CXvQIHb2CLin8kXdVB/0KE=; b=LIZgXrZnUx86XNNP0wmHAcrNw9/JIZ8Z/K+g4m7VRaHAmOxfSZCyPu0eA26cNr146y o7pf4ACxMyylsjo6uGEODbNQv8BRy46PhL70owQw/xwCKefsVPclpEamrqGo72ehYh+9 v63wDQiT5CznqvW3e78uI6rd3/N+sk3gekTAk9Ai4rTTvwCGcYckKvWPtFjd9xcw1oOG 8R1NnTguMJFxf9tZ09BhOA6+IrzVhQlaOh9GYKE9/yZf9zK1SwVLEIg5oFO2RFCUDefS 13vpeM20b7IeXPytkqCO5Efyk0g/6IAoInedl5KOOFZshV6zSMntUF6MhlF1jpnMUsy2 W+Ig== 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=2bAHX0FXOgqRwz29p5ya1CXvQIHb2CLin8kXdVB/0KE=; b=WJMSp3WnIiicw0kmXEAUL0jiCFFeWfLrISiy53+4QcJQFtDce7Wul9pDKJzZum6SzW 94vtSk0y8+Xo1ZoMeCRx1K1G1OW7fjExw+vj4uWe6u3vL7KWTNX0PwdLv2qxnmgXvW+4 xCjfN8gfvg4kM6lBdFy4HvmRMwg/ygKBuiFnegPT92gk7kYCfjfpu6Kz0OF/g9lJIFwj 070roNI/YUMpO3cpIxZKRYf4EhpSwwfW+uw59VlIWP70Q8OISIIAEvs7/S/knoHyQ2af YTaJ9vlBlUUC73SL9YIQgRME2gWEdh2P0hKCYh8nmsOWj/s3s/TgCaruhJdnw9Rk7A8R B/Iw== X-Gm-Message-State: APjAAAXJQ04sYb3VJzhaHCyGqEpuM3yTJsP52P/70nnXaiFmLvnX/yWD i7J6J3E498GmVDpI+rgTOpQ= X-Google-Smtp-Source: APXvYqyvpP2N7hYAzxx2bd4M9VJ+Jp8Kjxs/E28fT/8KVvvGyoey0uyI2syTr1ITSFDcJg6CMebg+A== X-Received: by 2002:a17:902:7290:: with SMTP id d16mr32584601pll.340.1574762933671; Tue, 26 Nov 2019 02:08:53 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 03/18] net: core: export do_xdp_generic_core() Date: Tue, 26 Nov 2019 19:07:29 +0900 Message-Id: <20191126100744.5083-4-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::1042 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang Let's export do_xdp_generic as a general purpose function. It will just run XDP program on skb but will not handle XDP actions. Signed-off-by: Jason Wang Signed-off-by: Prashant Bhole --- include/linux/netdevice.h | 2 ++ net/core/dev.c | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 9e6fb8524d91..2b6317ac9795 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3648,6 +3648,8 @@ static inline void dev_consume_skb_any(struct sk_buff= *skb) =20 void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog); int do_xdp_generic(struct bpf_prog *xdp_prog, struct sk_buff *skb); +u32 do_xdp_generic_core(struct sk_buff *skb, struct xdp_buff *xdp, + struct bpf_prog *xdp_prog); int netif_rx(struct sk_buff *skb); int netif_rx_ni(struct sk_buff *skb); int netif_receive_skb(struct sk_buff *skb); diff --git a/net/core/dev.c b/net/core/dev.c index 5ae647b9914f..d97c3f35e047 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4461,9 +4461,8 @@ static struct netdev_rx_queue *netif_get_rxqueue(stru= ct sk_buff *skb) return rxqueue; } =20 -static u32 do_xdp_generic_core(struct sk_buff *skb, - struct xdp_buff *xdp, - struct bpf_prog *xdp_prog) +u32 do_xdp_generic_core(struct sk_buff *skb, struct xdp_buff *xdp, + struct bpf_prog *xdp_prog) { struct netdev_rx_queue *rxqueue; void *orig_data, *orig_data_end; @@ -4574,6 +4573,7 @@ static u32 do_xdp_generic_core(struct sk_buff *skb, =20 return act; } +EXPORT_SYMBOL_GPL(do_xdp_generic_core); =20 /* When doing generic XDP we have to bypass the qdisc layer and the * network taps in order to match in-driver-XDP behavior. --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763434; cv=none; d=zohomail.com; s=zohoarc; b=T5/L8rz6PMtLYIuXUA2nGSLcyNfg6Z8aXCxt1nuiUIvYpidkKBKK7j0wdpOfAEvdKrHqyXLgtxedtB+l37A7zpExMGxJt6K0gHJPINMwzRjRGa7G6z+zovVAqhs9xS7++oH4LkiisFKIRxbm26ctwFsasHT7CqKki7psIW52yqY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763434; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=V/KNFyebQK7C43tEw7YnjUgOQj/Np7ljq5WcxHdrR0c=; b=JceNM777f0rnNp/8lAtyUT1l5+3BwnxXsKZzTcg7U8UJNoug0KUEEIWypEIqj3fIGjVJm6VUVkELFHSL2UIVW1afr/cAQy49aD6A/LuWAOldKdPcO7kjoTnkUlEGvLJJOQHIUpmVKKdXkpe2Maq7b323IlIucayCtMgiDrZLRBU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763434048310.3466559377017; Tue, 26 Nov 2019 02:17:14 -0800 (PST) Received: from localhost ([::1]:52192 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXuB-0006q0-Ng for importer@patchew.org; Tue, 26 Nov 2019 05:17:11 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57349) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXru-0005R4-E7 for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:14:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmE-0002z4-IJ for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:08:59 -0500 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]:34875) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmE-0002xx-Ce for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:08:58 -0500 Received: by mail-pl1-x643.google.com with SMTP id s10so7940095plp.2 for ; Tue, 26 Nov 2019 02:08:58 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.08.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:08:57 -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=V/KNFyebQK7C43tEw7YnjUgOQj/Np7ljq5WcxHdrR0c=; b=dzBZCOnaWE7Ha7XRUgoI1TMso7rPaEIgzx/qbfK80VCj2jnRcx784yIM+tcJz7c1W4 SX24el6V4d3P89iqBPTFv2AmbDubMl9yoJqacCzuZhlnR3Bk050iQx1k6m6poXeq+bfl nCsgtrM1+U9l5Ye2fGXuufDnG0O2Gs/JqEuATOJ5p/18g7oqYF+NooT1+Mdardio8ul3 GV1l4Qd/F5C3N0Vmi+3MI6zR9VuP0jtaYWvbvIgF8HfBcTH1gioMVf0mIhU757jNqbji SVXIEm14A7LiPCXAPyyVnHOhayKjwJrvX2PGeac7T9Z21XmzwuLidD9Nq6gJQVhxwP8a f/wA== 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=V/KNFyebQK7C43tEw7YnjUgOQj/Np7ljq5WcxHdrR0c=; b=Pju+rV+p1Oz87vMF9ZlgFkVVFlN9NN3x0zH7KMxO63TES7cGEWK0KiEUj/E8Eow1WZ eZvi7P0Pc8X7jWwcLRa7AExfXyeaXnf9xQTw/7GbBtUgYgrpOYDgI1DvtUZyNhZidDhc PLngrDtk8tRKYFSEIL7zKER6+1cCq30IcmBZ0/H+yGRvPlrMYoPPKmRAFl9uA6VaLvs+ 86GTFq1iCrXxQBHG2mrZs4W6UvjLrUyyvj9xBuc9CRBp+9/AzYrJ6PAAKSTSjfnT4y8S MyLXCbSxsxW7DRtMYSu5gv2tFlX+nD9NNgCQMlm59RmjFbnspDFUlXSKPDhPHdjD5TOr Z/qA== X-Gm-Message-State: APjAAAVCaXLy1g2jWzcpRGwWOQtENj4FYp3TA7+THYF/iY73I8NEAoRP kuLtym42bM90mb4GY1tIct4= X-Google-Smtp-Source: APXvYqwzcOMViqGh/CDqZ6GTDBF1yWFhOG4mwf7CZlGyeqi/dlAtJKkC4MdApMy1ZQ7I10+ijRtVKw== X-Received: by 2002:a17:90a:d58e:: with SMTP id v14mr5946678pju.142.1574762937533; Tue, 26 Nov 2019 02:08:57 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 04/18] tuntap: check tun_msg_ctl type at necessary places Date: Tue, 26 Nov 2019 19:07:30 +0900 Message-Id: <20191126100744.5083-5-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::643 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" tun_msg_ctl is used by vhost_net to communicate with tuntap. We will introduce another type in soon. As a preparation this patch adds conditions to check tun_msg_ctl type at necessary places. Signed-off-by: Prashant Bhole --- drivers/net/tap.c | 7 +++++-- drivers/net/tun.c | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 3ae70c7e6860..4df7bf00af66 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -1213,6 +1213,7 @@ static int tap_sendmsg(struct socket *sock, struct ms= ghdr *m, struct tap_queue *q =3D container_of(sock, struct tap_queue, sock); struct tun_msg_ctl *ctl =3D m->msg_control; struct xdp_buff *xdp; + void *ptr =3D NULL; int i; =20 if (ctl && (ctl->type =3D=3D TUN_MSG_PTR)) { @@ -1223,8 +1224,10 @@ static int tap_sendmsg(struct socket *sock, struct m= sghdr *m, return 0; } =20 - return tap_get_user(q, ctl ? ctl->ptr : NULL, &m->msg_iter, - m->msg_flags & MSG_DONTWAIT); + if (ctl && ctl->type =3D=3D TUN_MSG_UBUF) + ptr =3D ctl->ptr; + + return tap_get_user(q, ptr, &m->msg_iter, m->msg_flags & MSG_DONTWAIT); } =20 static int tap_recvmsg(struct socket *sock, struct msghdr *m, diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 683d371e6e82..1e436d9ec4e1 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -2529,6 +2529,7 @@ static int tun_sendmsg(struct socket *sock, struct ms= ghdr *m, size_t total_len) struct tun_struct *tun =3D tun_get(tfile); struct tun_msg_ctl *ctl =3D m->msg_control; struct xdp_buff *xdp; + void *ptr =3D NULL; =20 if (!tun) return -EBADFD; @@ -2560,7 +2561,10 @@ static int tun_sendmsg(struct socket *sock, struct m= sghdr *m, size_t total_len) goto out; } =20 - ret =3D tun_get_user(tun, tfile, ctl ? ctl->ptr : NULL, &m->msg_iter, + if (ctl && ctl->type =3D=3D TUN_MSG_UBUF) + ptr =3D ctl->ptr; + + ret =3D tun_get_user(tun, tfile, ptr, &m->msg_iter, m->msg_flags & MSG_DONTWAIT, m->msg_flags & MSG_MORE); out: --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574764558; cv=none; d=zohomail.com; s=zohoarc; b=TVnj/A1QDu/NqBdkPbQRWqIfPDA0CPLTEt3t0KD1Cy63b3j8ip3ZEGI1eRv+RrcJUFsB8UynKBwYbAv4ohrVAdIesPV95aj7nR6ilDt7lwpwNgLP83EfffvBnZhvz2XKJdu++UzXUrAfSEDW1nAlZEADQKQeYQHns8/jlCAJpvE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574764558; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JOqfaTjB9hR4SvgWUY3wyefTnNCZb7GyoEbULC6AJJo=; b=XAB9abR7avkY8ZJvdQS+15wyFMhyACimnzgO2KeVs/vIkmaAO08UYloIU5oJ52SCZDoKX6NEQRIczdBsMPWlf+xvAcVD/haPspsC3SZCtOfPCoU2plO0pWQsG8Zz38+oPSIqSL8sLpe6MevWVx1DhswVWWQLavMmhK523XZPjic= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574764558429424.9737214427795; Tue, 26 Nov 2019 02:35:58 -0800 (PST) Received: from localhost ([::1]:52458 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZYCL-0004nT-2T for importer@patchew.org; Tue, 26 Nov 2019 05:35:57 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57458) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsL-0005g9-RE for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmI-00032L-Fc for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:03 -0500 Received: from mail-pj1-x1041.google.com ([2607:f8b0:4864:20::1041]:35121) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmI-00031y-9S for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:02 -0500 Received: by mail-pj1-x1041.google.com with SMTP id s8so8071090pji.2 for ; Tue, 26 Nov 2019 02:09:02 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.08.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:00 -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=JOqfaTjB9hR4SvgWUY3wyefTnNCZb7GyoEbULC6AJJo=; b=QkhGdXqAqq10xMSu+2CnyH8h3k9xRLREYvQrc7Kl+Q0+83MDkF+tuhBxvnRiUIrU5H eLqXuIZUtQQQafXXx5KJYDzw+cbyREKs1xo+xDhrhWrKOz2Hfe+KnD5BCeK8L6z7FoGB H8uL0SKa0QBz+PC6YnjRyHOBKKwWwEqH1f4T41+MgFl+QMvSklHCyhIdh8muKtDnfRAe wnppauQ8mL6ut7U+3hHZwdGgDP61KM8PE2qspO4rG1wmunzRjivSxjNu6ss3SQdisLdS 3CD2OlXrfUF8AsknNCn14UV/RDnRG4uS2zPqKLV30IbvCAr64AsnlplUmR+oN2N7ka5Y wSMg== 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=JOqfaTjB9hR4SvgWUY3wyefTnNCZb7GyoEbULC6AJJo=; b=r1HQErNXhMJuAqWRgQHy3zA/D8NjN9+wDLpajNoQONnS+bcXXGnu6qxHpmZ+ezWu5J PRAIcp4lB6zAhtdu4PwcixuAJ9dmriplIHLJoqexqwPP/mAXL4QYQPluDi4UymdLUFuQ geTEEdijM+9LnWrkL/9LwcOl3W2Ocrp/cDdK7SuIOjjIBhBC+YZJzNDc4vCwrvr1FAjA K+zf0kqcuygRA7nyj2Gv/uJtTzgg+a2/0SgJFUIfAFmlH0JGo87/4B5KvHpxvF8qXiTS yygvEG4S1jdQZUgKJGmi1QbUOAO1y1IiK1W/Ijl/zHXXw8YJ7Zvj5YTyR1O3BbTIH1rv +SQA== X-Gm-Message-State: APjAAAUZF+DiX07ZkvyDEwMtz4Y8LPLxgd5eZpeg2JD8LUkaj8hcgJ+d OWWDqZ0Y0ENpSeX7EkSeFseDnnaz X-Google-Smtp-Source: APXvYqwPyv6+pc3DP4PZm1a3x96MwS0Kc6f03xdB6l2+mtJteT+8mFJPIbbpCn/sngodhdsZCCyQtA== X-Received: by 2002:a17:90b:f0c:: with SMTP id br12mr5745156pjb.67.1574762941343; Tue, 26 Nov 2019 02:09:01 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 05/18] vhost_net: user tap recvmsg api to access ptr ring Date: Tue, 26 Nov 2019 19:07:31 +0900 Message-Id: <20191126100744.5083-6-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::1041 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Currently vhost_net directly accesses ptr ring of tap driver to fetch Rx packet pointers. In order to avoid it this patch modifies tap driver's recvmsg api to do additional task of fetching Rx packet pointers. A special struct tun_msg_ctl is already being passed via msg_control for tun Rx XDP batching. This patch extends tun_msg_ctl usage to send sub commands to recvmsg api. Now tun_recvmsg will handle commands to consume and unconsume packet pointers from ptr ring. This will be useful in implementation of virtio-net XDP offload feature, where packets will be XDP processed before they are passed to vhost_net. Signed-off-by: Prashant Bhole --- drivers/net/tap.c | 22 ++++++++++++++++++- drivers/net/tun.c | 24 ++++++++++++++++++++- drivers/vhost/net.c | 48 +++++++++++++++++++++++++++++++----------- include/linux/if_tun.h | 18 ++++++++++++++++ 4 files changed, 98 insertions(+), 14 deletions(-) diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 4df7bf00af66..8635cdfd7aa4 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -1234,8 +1234,28 @@ static int tap_recvmsg(struct socket *sock, struct m= sghdr *m, size_t total_len, int flags) { struct tap_queue *q =3D container_of(sock, struct tap_queue, sock); - struct sk_buff *skb =3D m->msg_control; + struct tun_msg_ctl *ctl =3D m->msg_control; + struct sk_buff *skb =3D NULL; int ret; + + if (ctl) { + switch (ctl->type) { + case TUN_MSG_PKT: + skb =3D ctl->ptr; + break; + case TUN_MSG_CONSUME_PKTS: + return ptr_ring_consume_batched(&q->ring, + ctl->ptr, + ctl->num); + case TUN_MSG_UNCONSUME_PKTS: + ptr_ring_unconsume(&q->ring, ctl->ptr, ctl->num, + tun_ptr_free); + return 0; + default: + return -EINVAL; + } + } + if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) { kfree_skb(skb); return -EINVAL; diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 1e436d9ec4e1..4f28f2387435 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -2577,7 +2577,8 @@ static int tun_recvmsg(struct socket *sock, struct ms= ghdr *m, size_t total_len, { struct tun_file *tfile =3D container_of(sock, struct tun_file, socket); struct tun_struct *tun =3D tun_get(tfile); - void *ptr =3D m->msg_control; + struct tun_msg_ctl *ctl =3D m->msg_control; + void *ptr =3D NULL; int ret; =20 if (!tun) { @@ -2585,6 +2586,27 @@ static int tun_recvmsg(struct socket *sock, struct m= sghdr *m, size_t total_len, goto out_free; } =20 + if (ctl) { + switch (ctl->type) { + case TUN_MSG_PKT: + ptr =3D ctl->ptr; + break; + case TUN_MSG_CONSUME_PKTS: + ret =3D ptr_ring_consume_batched(&tfile->tx_ring, + ctl->ptr, + ctl->num); + goto out; + case TUN_MSG_UNCONSUME_PKTS: + ptr_ring_unconsume(&tfile->tx_ring, ctl->ptr, + ctl->num, tun_ptr_free); + ret =3D 0; + goto out; + default: + ret =3D -EINVAL; + goto out_put_tun; + } + } + if (flags & ~(MSG_DONTWAIT|MSG_TRUNC|MSG_ERRQUEUE)) { ret =3D -EINVAL; goto out_put_tun; diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 1a2dd53caade..0f91b374a558 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -175,24 +175,44 @@ static void *vhost_net_buf_consume(struct vhost_net_b= uf *rxq) =20 static int vhost_net_buf_produce(struct vhost_net_virtqueue *nvq) { + struct vhost_virtqueue *vq =3D &nvq->vq; + struct socket *sock =3D vq->private_data; struct vhost_net_buf *rxq =3D &nvq->rxq; + struct tun_msg_ctl ctl =3D { + .type =3D TUN_MSG_CONSUME_PKTS, + .ptr =3D (void *) rxq->queue, + .num =3D VHOST_NET_BATCH, + }; + struct msghdr msg =3D { + .msg_control =3D &ctl, + }; =20 rxq->head =3D 0; - rxq->tail =3D ptr_ring_consume_batched(nvq->rx_ring, rxq->queue, - VHOST_NET_BATCH); + rxq->tail =3D sock->ops->recvmsg(sock, &msg, 0, 0); + if (WARN_ON_ONCE(rxq->tail < 0)) + rxq->tail =3D 0; + return rxq->tail; } =20 static void vhost_net_buf_unproduce(struct vhost_net_virtqueue *nvq) { + struct vhost_virtqueue *vq =3D &nvq->vq; + struct socket *sock =3D vq->private_data; struct vhost_net_buf *rxq =3D &nvq->rxq; + struct tun_msg_ctl ctl =3D { + .type =3D TUN_MSG_UNCONSUME_PKTS, + .ptr =3D (void *) (rxq->queue + rxq->head), + .num =3D vhost_net_buf_get_size(rxq), + }; + struct msghdr msg =3D { + .msg_control =3D &ctl, + }; =20 - if (nvq->rx_ring && !vhost_net_buf_is_empty(rxq)) { - ptr_ring_unconsume(nvq->rx_ring, rxq->queue + rxq->head, - vhost_net_buf_get_size(rxq), - tun_ptr_free); - rxq->head =3D rxq->tail =3D 0; - } + if (!vhost_net_buf_is_empty(rxq)) + sock->ops->recvmsg(sock, &msg, 0, 0); + + rxq->head =3D rxq->tail =3D 0; } =20 static int vhost_net_buf_peek_len(void *ptr) @@ -1109,6 +1129,7 @@ static void handle_rx(struct vhost_net *net) .flags =3D 0, .gso_type =3D VIRTIO_NET_HDR_GSO_NONE }; + struct tun_msg_ctl ctl; size_t total_len =3D 0; int err, mergeable; s16 headcount; @@ -1166,8 +1187,11 @@ static void handle_rx(struct vhost_net *net) goto out; } busyloop_intr =3D false; - if (nvq->rx_ring) - msg.msg_control =3D vhost_net_buf_consume(&nvq->rxq); + if (nvq->rx_ring) { + ctl.type =3D TUN_MSG_PKT; + ctl.ptr =3D vhost_net_buf_consume(&nvq->rxq); + msg.msg_control =3D &ctl; + } /* On overrun, truncate and discard */ if (unlikely(headcount > UIO_MAXIOV)) { iov_iter_init(&msg.msg_iter, READ, vq->iov, 1, 1); @@ -1346,8 +1370,8 @@ static struct socket *vhost_net_stop_vq(struct vhost_= net *n, mutex_lock(&vq->mutex); sock =3D vq->private_data; vhost_net_disable_vq(n, vq); - vq->private_data =3D NULL; vhost_net_buf_unproduce(nvq); + vq->private_data =3D NULL; nvq->rx_ring =3D NULL; mutex_unlock(&vq->mutex); return sock; @@ -1538,8 +1562,8 @@ static long vhost_net_set_backend(struct vhost_net *n= , unsigned index, int fd) } =20 vhost_net_disable_vq(n, vq); - vq->private_data =3D sock; vhost_net_buf_unproduce(nvq); + vq->private_data =3D sock; r =3D vhost_vq_init_access(vq); if (r) goto err_used; diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h index 5bda8cf457b6..bb94843e3829 100644 --- a/include/linux/if_tun.h +++ b/include/linux/if_tun.h @@ -11,8 +11,26 @@ =20 #define TUN_XDP_FLAG 0x1UL =20 +/* + * tun_msg_ctl types + */ + #define TUN_MSG_UBUF 1 #define TUN_MSG_PTR 2 +/* + * Used for passing a packet pointer from vhost to tun + */ +#define TUN_MSG_PKT 3 +/* + * Used for passing an array of pointer from vhost to tun. + * tun consumes packets from ptr ring and stores in pointer array. + */ +#define TUN_MSG_CONSUME_PKTS 4 +/* + * Used for passing an array of pointer from vhost to tun. + * tun consumes get pointer from array and puts back into ptr ring. + */ +#define TUN_MSG_UNCONSUME_PKTS 5 struct tun_msg_ctl { unsigned short type; unsigned short num; --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763984; cv=none; d=zohomail.com; s=zohoarc; b=PEhs/SCmP+edyyLgsMQ9xEu1YysAaz5WGII6QaGkBFiHMi7vET2zd4t8NOkuev+okMD0LxzGfzg9PxvAmm19KONaBo+t8Nr2uKLc6BVvmH+WJyNrBgET5LCe/RxK4SX9wi/pRJCqtdBQJntb0y3T2aXbOPBgJJigkYpqqCl3ZN8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763984; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=+QD4/vKzpUKJ7oAMMcWF4SBVUkQv/vIBx+F+3VPKSIM=; b=iBuaKL5Gs+G3eJE/qKq4x4XWmT1CUUyOQc7a9cxeJX0vdpQ+V6L+YpTK0EyAqJ8N65KPFh/awpj76jnW4hGFgRSrBt5WJ5P+ls42277qpq7hnhiUXNk05daEkmqCeFaOkmNkhicJy8AIKOIgx0WVDhhN9Piv9JoQoaSiz6XU2uk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763984967204.096712445462; Tue, 26 Nov 2019 02:26:24 -0800 (PST) Received: from localhost ([::1]:52306 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY35-0002hm-6k for importer@patchew.org; Tue, 26 Nov 2019 05:26:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57426) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsL-0005eM-Pg for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmM-000341-RC for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:08 -0500 Received: from mail-pl1-x644.google.com ([2607:f8b0:4864:20::644]:40799) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmM-00033Z-Ld for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:06 -0500 Received: by mail-pl1-x644.google.com with SMTP id f9so7935164plr.7 for ; Tue, 26 Nov 2019 02:09:06 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:04 -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=+QD4/vKzpUKJ7oAMMcWF4SBVUkQv/vIBx+F+3VPKSIM=; b=Dad2fXqh5PjlpIH3rO+thxIGofHNhYZUm+ZLETyge4e7luum6aCm1A3AI5ThMS310E R4Xj/8Eh+TByGj7pfweNNFqDHyqQKsaKv7ujNrigl64aOA5ORPDVuVwF8DBwlLQA/xsN 2ICt4DG1Q+3waVVvDBsMLEigv3rmbn1vXvQDRuRdH7w2/jXjlYjlC09XERU2kaL7p9Db MEY1/8o4irNqzMaJuU5BozHQ9JT/4oEIQ6655AN0p1nRUuGHXJHKBb/VYgmPs+Bzrcx6 VcfSImSIuac8mJWcGQMOg8yxKY4j1WneWZfogz3EYkU6dkoWEiuYjotAtqoP44jBGAOe Utcg== 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=+QD4/vKzpUKJ7oAMMcWF4SBVUkQv/vIBx+F+3VPKSIM=; b=c5IVbOu1bAatxLIg2Zo7eiadI3gbFci0LQgUhhJi68XQzjb4TXakVbUqTC4DTzL4Od F4LFX7qBYu3XJC6S3KTJSmlRGuP2JiyiXtF4nqA8Pg4OM6Dterfg/9AbrmW+ye5A6MH6 c1lJVt6ZRhEozsbUfRqAZzBCs2rQY1uNthddT3n4vqSXZgRHJLESiQwH7tBKKOtBAlx4 A2peNmnmzhoGjptkU1KHjc3fGpz+0R269cwCepsTU6imh9yNIF/IlI04WBnzTAMKxnRq vbOVX5UPJ19ulQjn49f6ffEzXOqrBwn4nhwTnznKQ6yd/+Cd+AfZuamWfxtNNz2lCEMK QiUg== X-Gm-Message-State: APjAAAVl6NIrgXEZNGN7qK4BmTk1QzVm7/a/oEyFra1w9poELh0ca508 Q2dw+mb1oEatlr5fsb20Ho4= X-Google-Smtp-Source: APXvYqxxHoIpfqZB5NCqWS+mIJcFEPH5D91ww1dQwvhntGuceZdTfPynWee8zZHRxK2/XD+OeSmwNA== X-Received: by 2002:a17:902:9891:: with SMTP id s17mr33484924plp.101.1574762945278; Tue, 26 Nov 2019 02:09:05 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 06/18] tuntap: remove usage of ptr ring in vhost_net Date: Tue, 26 Nov 2019 19:07:32 +0900 Message-Id: <20191126100744.5083-7-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::644 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Remove usage of ptr ring of tuntap in vhost_net and remove the functions exported from tuntap drivers to get ptr ring. Signed-off-by: Prashant Bhole --- drivers/net/tap.c | 13 ------------- drivers/net/tun.c | 13 ------------- drivers/vhost/net.c | 31 ++++--------------------------- include/linux/if_tap.h | 5 ----- include/linux/if_tun.h | 5 ----- 5 files changed, 4 insertions(+), 63 deletions(-) diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 8635cdfd7aa4..6426501b8d0e 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -1298,19 +1298,6 @@ struct socket *tap_get_socket(struct file *file) } EXPORT_SYMBOL_GPL(tap_get_socket); =20 -struct ptr_ring *tap_get_ptr_ring(struct file *file) -{ - struct tap_queue *q; - - if (file->f_op !=3D &tap_fops) - return ERR_PTR(-EINVAL); - q =3D file->private_data; - if (!q) - return ERR_PTR(-EBADFD); - return &q->ring; -} -EXPORT_SYMBOL_GPL(tap_get_ptr_ring); - int tap_queue_resize(struct tap_dev *tap) { struct net_device *dev =3D tap->dev; diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 4f28f2387435..d078b4659897 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -3750,19 +3750,6 @@ struct socket *tun_get_socket(struct file *file) } EXPORT_SYMBOL_GPL(tun_get_socket); =20 -struct ptr_ring *tun_get_tx_ring(struct file *file) -{ - struct tun_file *tfile; - - if (file->f_op !=3D &tun_fops) - return ERR_PTR(-EINVAL); - tfile =3D file->private_data; - if (!tfile) - return ERR_PTR(-EBADFD); - return &tfile->tx_ring; -} -EXPORT_SYMBOL_GPL(tun_get_tx_ring); - module_init(tun_init); module_exit(tun_cleanup); MODULE_DESCRIPTION(DRV_DESCRIPTION); diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 0f91b374a558..2e069d1ef946 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -122,7 +122,6 @@ struct vhost_net_virtqueue { /* Reference counting for outstanding ubufs. * Protected by vq mutex. Writers must also take device mutex. */ struct vhost_net_ubuf_ref *ubufs; - struct ptr_ring *rx_ring; struct vhost_net_buf rxq; /* Batched XDP buffs */ struct xdp_buff *xdp; @@ -997,8 +996,9 @@ static int peek_head_len(struct vhost_net_virtqueue *rv= q, struct sock *sk) int len =3D 0; unsigned long flags; =20 - if (rvq->rx_ring) - return vhost_net_buf_peek(rvq); + len =3D vhost_net_buf_peek(rvq); + if (len) + return len; =20 spin_lock_irqsave(&sk->sk_receive_queue.lock, flags); head =3D skb_peek(&sk->sk_receive_queue); @@ -1187,7 +1187,7 @@ static void handle_rx(struct vhost_net *net) goto out; } busyloop_intr =3D false; - if (nvq->rx_ring) { + if (!vhost_net_buf_is_empty(&nvq->rxq)) { ctl.type =3D TUN_MSG_PKT; ctl.ptr =3D vhost_net_buf_consume(&nvq->rxq); msg.msg_control =3D &ctl; @@ -1343,7 +1343,6 @@ static int vhost_net_open(struct inode *inode, struct= file *f) n->vqs[i].batched_xdp =3D 0; n->vqs[i].vhost_hlen =3D 0; n->vqs[i].sock_hlen =3D 0; - n->vqs[i].rx_ring =3D NULL; vhost_net_buf_init(&n->vqs[i].rxq); } vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX, @@ -1372,7 +1371,6 @@ static struct socket *vhost_net_stop_vq(struct vhost_= net *n, vhost_net_disable_vq(n, vq); vhost_net_buf_unproduce(nvq); vq->private_data =3D NULL; - nvq->rx_ring =3D NULL; mutex_unlock(&vq->mutex); return sock; } @@ -1468,25 +1466,6 @@ static struct socket *get_raw_socket(int fd) return ERR_PTR(r); } =20 -static struct ptr_ring *get_tap_ptr_ring(int fd) -{ - struct ptr_ring *ring; - struct file *file =3D fget(fd); - - if (!file) - return NULL; - ring =3D tun_get_tx_ring(file); - if (!IS_ERR(ring)) - goto out; - ring =3D tap_get_ptr_ring(file); - if (!IS_ERR(ring)) - goto out; - ring =3D NULL; -out: - fput(file); - return ring; -} - static struct socket *get_tap_socket(int fd) { struct file *file =3D fget(fd); @@ -1570,8 +1549,6 @@ static long vhost_net_set_backend(struct vhost_net *n= , unsigned index, int fd) r =3D vhost_net_enable_vq(n, vq); if (r) goto err_used; - if (index =3D=3D VHOST_NET_VQ_RX) - nvq->rx_ring =3D get_tap_ptr_ring(fd); =20 oldubufs =3D nvq->ubufs; nvq->ubufs =3D ubufs; diff --git a/include/linux/if_tap.h b/include/linux/if_tap.h index 915a187cfabd..68fe366fb185 100644 --- a/include/linux/if_tap.h +++ b/include/linux/if_tap.h @@ -4,7 +4,6 @@ =20 #if IS_ENABLED(CONFIG_TAP) struct socket *tap_get_socket(struct file *); -struct ptr_ring *tap_get_ptr_ring(struct file *file); #else #include #include @@ -14,10 +13,6 @@ static inline struct socket *tap_get_socket(struct file = *f) { return ERR_PTR(-EINVAL); } -static inline struct ptr_ring *tap_get_ptr_ring(struct file *f) -{ - return ERR_PTR(-EINVAL); -} #endif /* CONFIG_TAP */ =20 #include diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h index bb94843e3829..f01a255e076d 100644 --- a/include/linux/if_tun.h +++ b/include/linux/if_tun.h @@ -44,7 +44,6 @@ struct tun_xdp_hdr { =20 #if defined(CONFIG_TUN) || defined(CONFIG_TUN_MODULE) struct socket *tun_get_socket(struct file *); -struct ptr_ring *tun_get_tx_ring(struct file *file); bool tun_is_xdp_frame(void *ptr); void *tun_xdp_to_ptr(void *ptr); void *tun_ptr_to_xdp(void *ptr); @@ -58,10 +57,6 @@ static inline struct socket *tun_get_socket(struct file = *f) { return ERR_PTR(-EINVAL); } -static inline struct ptr_ring *tun_get_tx_ring(struct file *f) -{ - return ERR_PTR(-EINVAL); -} static inline bool tun_is_xdp_frame(void *ptr) { return false; --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574764584; cv=none; d=zohomail.com; s=zohoarc; b=HrLCr8OA0Iv1GjIP/Wt/kXgK/qUFLc2CQcp68pNiaMrWGMeUt8jsC3SjJ3U00kwnYT8zxqiIXwcCgq0/BRqLd4OuAauo63A/nvpUEnlOtykLyGMiPA+p98kBXVfvGtQPaB7K39aQTBUPBkkekaO5ibPSs15AF17xrRIUWhQ+E8c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574764584; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=o7wWeRbc+tNqQMSjrOB4Aqcs6TIYjdNZ6xF+Z6+tUq0=; b=YijKqAAgMmFcHGggo+nIHSW4Oivo7CKIb2D7MYRWjoFToFMBQ7IeSI7zhMXG53SKknvG8byzsDbn74q1BNiKnCTkjEv0O/i970P92syUjXf1VkacQBXtobslJpWFtZj7V4McxP5krbzRu6w9rtiSEHleSewH3t45k17xfXKpBRU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574764584616566.380056155057; Tue, 26 Nov 2019 02:36:24 -0800 (PST) Received: from localhost ([::1]:52486 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZYCl-0005Wb-90 for importer@patchew.org; Tue, 26 Nov 2019 05:36:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57422) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsL-0005e4-Ja for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmQ-00037J-BC for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:11 -0500 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:44193) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmQ-00036b-2i for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:10 -0500 Received: by mail-pg1-x542.google.com with SMTP id e6so8732569pgi.11 for ; Tue, 26 Nov 2019 02:09:10 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:08 -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=o7wWeRbc+tNqQMSjrOB4Aqcs6TIYjdNZ6xF+Z6+tUq0=; b=T0I1EGJ6YTSRSu/Y4XLTUBBYnqBS9LwqseER/BjzdXl8Q7YQ6BBhOS6hWPwJ+Fampz P7EI5RxePE3I3u7Y94Tky0n+nFE78T2UBuBrF7foiUu5ODFJMPS7xZL9Attd9J/fv2xk YC0mrtwZW0lEhmUYXkLjAnrzjGf0MLJJzOGH6wypDpR4PUbQQZUzKRmWBcG+SeZ9cW79 sSdTVoF36tW8MK07iZfRmuRxtHw8eS3BBMGKOv/L1m+aD66CZK50R2dRXBlpOSt96TbP YzvoGyvxaN5aONyAay/kSX0/Rb7Ga8eSzdNDD3OD5e5IZ1t55ny2HbvmNcgnnY5mr39+ 5zeQ== 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=o7wWeRbc+tNqQMSjrOB4Aqcs6TIYjdNZ6xF+Z6+tUq0=; b=GMGmW5Y8m7INysfbiSg6JqAFJcDd/EUovNOObRPxIOvJxlNBkvTPRExjm8doau2/6N GMLhYPMfU8zCb47CIaXGnPHxC5o5QOl38uNwp6vOBXgWtEdpsRmYr8lF3/dD5lDC0oaE BMoDcplzh1JzCe0OTZFcc/M3s02Nfr8SeQ0ZZvMx2sCrvinOZV6zy/wCB6WDIPgvKmCj rLqhLhThhnnAeqYsZpXo/fI3jeK+pIkSgdLxVNUwht57GBG+dGxnuytQix/jwkGNaruH KOUtWjO0yRrlfHvvofpBn83gcHEM/bA+kKupqaxTOT2HiCfY77gTu3IpyZTZN9rTiPJq cwLQ== X-Gm-Message-State: APjAAAVLu/Hw11cdMCl7u/04C2FsNF5lyOAjj9T29VHkbKkUgSVTALby vrMrA+JxlLNhkYT4OAeYRf4= X-Google-Smtp-Source: APXvYqwfaVLiFIs0iXc/+SHQsi0c/jFNHsDcCU5mOA5Ky5UmlUqcVt7e8bS0r/y9o05pZ3I6c6EV8A== X-Received: by 2002:a65:4342:: with SMTP id k2mr38951684pgq.63.1574762949130; Tue, 26 Nov 2019 02:09:09 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 07/18] tun: set offloaded xdp program Date: Tue, 26 Nov 2019 19:07:33 +0900 Message-Id: <20191126100744.5083-8-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang This patch introduces an ioctl way to set an offloaded XDP program to tun driver. This ioctl will be used by qemu to offload XDP program from virtio_net in the guest. Signed-off-by: Jason Wang Signed-off-by: Prashant Bhole --- drivers/net/tun.c | 19 ++++++++++++++----- include/uapi/linux/if_tun.h | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index d078b4659897..ecb49101b0b5 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -241,6 +241,7 @@ struct tun_struct { struct bpf_prog __rcu *xdp_prog; struct tun_prog __rcu *steering_prog; struct tun_prog __rcu *filter_prog; + struct tun_prog __rcu *offloaded_xdp_prog; struct ethtool_link_ksettings link_ksettings; }; =20 @@ -2256,7 +2257,7 @@ static void tun_prog_free(struct rcu_head *rcu) { struct tun_prog *prog =3D container_of(rcu, struct tun_prog, rcu); =20 - bpf_prog_destroy(prog->prog); + bpf_prog_put(prog->prog); kfree(prog); } =20 @@ -2301,6 +2302,7 @@ static void tun_free_netdev(struct net_device *dev) security_tun_dev_free_security(tun->security); __tun_set_ebpf(tun, &tun->steering_prog, NULL); __tun_set_ebpf(tun, &tun->filter_prog, NULL); + __tun_set_ebpf(tun, &tun->offloaded_xdp_prog, NULL); } =20 static void tun_setup(struct net_device *dev) @@ -3036,7 +3038,7 @@ static int tun_set_queue(struct file *file, struct if= req *ifr) } =20 static int tun_set_ebpf(struct tun_struct *tun, struct tun_prog **prog_p, - void __user *data) + void __user *data, int type) { struct bpf_prog *prog; int fd; @@ -3047,7 +3049,7 @@ static int tun_set_ebpf(struct tun_struct *tun, struc= t tun_prog **prog_p, if (fd =3D=3D -1) { prog =3D NULL; } else { - prog =3D bpf_prog_get_type(fd, BPF_PROG_TYPE_SOCKET_FILTER); + prog =3D bpf_prog_get_type(fd, type); if (IS_ERR(prog)) return PTR_ERR(prog); } @@ -3345,11 +3347,18 @@ static long __tun_chr_ioctl(struct file *file, unsi= gned int cmd, break; =20 case TUNSETSTEERINGEBPF: - ret =3D tun_set_ebpf(tun, &tun->steering_prog, argp); + ret =3D tun_set_ebpf(tun, &tun->steering_prog, argp, + BPF_PROG_TYPE_SOCKET_FILTER); break; =20 case TUNSETFILTEREBPF: - ret =3D tun_set_ebpf(tun, &tun->filter_prog, argp); + ret =3D tun_set_ebpf(tun, &tun->filter_prog, argp, + BPF_PROG_TYPE_SOCKET_FILTER); + break; + + case TUNSETOFFLOADEDXDP: + ret =3D tun_set_ebpf(tun, &tun->offloaded_xdp_prog, argp, + BPF_PROG_TYPE_XDP); break; =20 case TUNSETCARRIER: diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h index 454ae31b93c7..21dbd8db2401 100644 --- a/include/uapi/linux/if_tun.h +++ b/include/uapi/linux/if_tun.h @@ -61,6 +61,7 @@ #define TUNSETFILTEREBPF _IOR('T', 225, int) #define TUNSETCARRIER _IOW('T', 226, int) #define TUNGETDEVNETNS _IO('T', 227) +#define TUNSETOFFLOADEDXDP _IOW('T', 228, int) =20 /* TUNSETIFF ifr flags */ #define IFF_TUN 0x0001 --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574764374; cv=none; d=zohomail.com; s=zohoarc; b=gzaQZky597bE5WoQKJm0beZh596SmleJ6yF9TQBF1mAzAx+WkYMSo4n6UosBQVetyt+YV/lFAiGHqn2y0A0+1OY75KKBxo+K8ce6jkORsNSfN0oJQMxEfNZTb7EGXtEqMwYyWexkC7EREwWtDdTcMbIxNk6c/Iy36PZB5xxv8hI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574764374; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=B6QMMXb6Lc0tWH98wR58tzl2/7IOcJXsAUoOf1rCNto=; b=M2CrGodTTbgpR+/GTGm/K9BDo/sXNGFqhy/cgCd4pUbK8m2NDSMycQdQYOaS1FXNZjxoJ43g52pZqLY4tNBsTGVkNneNYMa3w8XTD/0TI3sGCPplDHYR5IiYwV50+w6hZBhMqMBXNyKlQTE5ZOBLxwdUNLeY7yE/edTpFBADUxA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574764374605876.9182820690271; Tue, 26 Nov 2019 02:32:54 -0800 (PST) Received: from localhost ([::1]:52406 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY9M-00015m-Sv for importer@patchew.org; Tue, 26 Nov 2019 05:32:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57439) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsL-0005fI-4T for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmU-0003Ar-E0 for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:19 -0500 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:42731) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmU-0003AV-8L for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:14 -0500 Received: by mail-pf1-x443.google.com with SMTP id s5so8932875pfh.9 for ; Tue, 26 Nov 2019 02:09:14 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:12 -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=B6QMMXb6Lc0tWH98wR58tzl2/7IOcJXsAUoOf1rCNto=; b=TcQUjhhkWtAHHBo7BGhoPxdH+OkQBuhIxzcHX5EgouRjPkgbXzarm0y1vo1NhR8gDf eG2Lo7ddCpKcjSeJMFMlcP8tJQ/55Jt0TGNgznW4/XjmDldCe92mvnBxFGEghuAeWujG 7zNia4tH4IGRLOy70KvJXM+j82tbJ8nUIicPouLS6TjkV6HD27P/W/h6R5O7MmSu2k+V 143iMJdLR6+6bv9luW2P50ryb4MAyiIUafw49CErl7oj+EMEJ7fXiv42whVv9WX7vO8P re3ksZIi50XxOCmuXJZr+0KLAm6i5NuOZT8Bux4mTYLARNU4OGVu3EBoIPihOhj+s8jc e7dg== 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=B6QMMXb6Lc0tWH98wR58tzl2/7IOcJXsAUoOf1rCNto=; b=Ou/qi6Tm5KlbSiFyCYVj2d31mz5Bk8lNyFoT0zYQbLT4vmp0pG1ADfCXBU+jqZCCnv Ci53P6dIGawn5ZWAicwE3VCzAunvkiMUSYztRqU6JqnmxXH5fbd7XhaS5Ah1QaSh4Vvv 9vw3WOoyEViZ9lZ8DICVCVOphs13GHkYy89bnAFmVNdqzBf7kFGbq1GAxoLbMQSBJcnO zf4j47A0CGarx2JFXxVNUavnxLi7U+0fT8bbG635+/NJ8FbdQWrD3nKTh9/rasOrnzO9 HtN+xXLIta+YMlrJT5RTdogfxQJxJg8GRT9GDxettg9iA8Y2tuZcUpm2ygr7ab4sspoM fYpw== X-Gm-Message-State: APjAAAUmqlpIbBqGZgQI8CVrEfP5hm93vv6wkjy0dR9YeEKdyoxUYM7+ tV2y/T1nf1NtWoDe5Hs1lU4= X-Google-Smtp-Source: APXvYqzpyS68KcI5oBdWBrSJfaGRRiRmODA4vA4zTy1YjkKqKqQWp2z/hxWs5tczO+UmDNsD9QUaSw== X-Received: by 2002:a63:d14d:: with SMTP id c13mr18566161pgj.227.1574762953032; Tue, 26 Nov 2019 02:09:13 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 08/18] tun: run offloaded XDP program in Tx path Date: Tue, 26 Nov 2019 19:07:34 +0900 Message-Id: <20191126100744.5083-9-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" run offloaded XDP program as soon as packet is removed from the ptr ring. Since this is XDP in Tx path, the traditional handling of XDP actions XDP_TX/REDIRECT isn't valid. For this reason we call do_xdp_generic_core instead of do_xdp_generic. do_xdp_generic_core just runs the program and leaves the action handling to us. Signed-off-by: Prashant Bhole --- drivers/net/tun.c | 149 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 146 insertions(+), 3 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index ecb49101b0b5..466ea69f00ee 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -131,6 +131,7 @@ struct tap_filter { /* MAX_TAP_QUEUES 256 is chosen to allow rx/tx queues to be equal * to max number of VCPUs in guest. */ #define MAX_TAP_QUEUES 256 +#define MAX_TAP_BATCH 64 #define MAX_TAP_FLOWS 4096 =20 #define TUN_FLOW_EXPIRE (3 * HZ) @@ -2156,6 +2157,109 @@ static ssize_t tun_put_user(struct tun_struct *tun, return total; } =20 +static struct sk_buff *tun_prepare_xdp_skb(struct sk_buff *skb) +{ + struct sk_buff *nskb; + + if (skb_shared(skb) || skb_cloned(skb)) { + nskb =3D skb_copy(skb, GFP_ATOMIC); + consume_skb(skb); + return nskb; + } + + return skb; +} + +static u32 tun_do_xdp_offload_generic(struct tun_struct *tun, + struct sk_buff *skb) +{ + struct tun_prog *xdp_prog; + struct xdp_buff xdp; + u32 act =3D XDP_PASS; + + xdp_prog =3D rcu_dereference(tun->offloaded_xdp_prog); + if (xdp_prog) { + skb =3D tun_prepare_xdp_skb(skb); + if (!skb) { + act =3D XDP_DROP; + kfree_skb(skb); + goto drop; + } + + act =3D do_xdp_generic_core(skb, &xdp, xdp_prog->prog); + switch (act) { + case XDP_TX: + /* + * Rx path generic XDP will be called in this path + */ + netif_receive_skb(skb); + break; + case XDP_PASS: + break; + case XDP_REDIRECT: + /* + * Since we are not handling this case yet, let's free + * skb here. In case of XDP_DROP/XDP_ABORTED, the skb + * was already freed in do_xdp_generic_core() + */ + kfree_skb(skb); + /* fall through */ + default: + bpf_warn_invalid_xdp_action(act); + /* fall through */ + case XDP_ABORTED: + trace_xdp_exception(tun->dev, xdp_prog->prog, act); + /* fall through */ + case XDP_DROP: + goto drop; + } + } + + return act; +drop: + this_cpu_inc(tun->pcpu_stats->tx_dropped); + return act; +} + +static u32 tun_do_xdp_offload(struct tun_struct *tun, struct tun_file *tfi= le, + struct xdp_frame *frame) +{ + struct tun_prog *xdp_prog; + struct tun_page tpage; + struct xdp_buff xdp; + u32 act =3D XDP_PASS; + int flush =3D 0; + + xdp_prog =3D rcu_dereference(tun->offloaded_xdp_prog); + if (xdp_prog) { + xdp.data_hard_start =3D frame->data - frame->headroom; + xdp.data =3D frame->data; + xdp.data_end =3D xdp.data + frame->len; + xdp.data_meta =3D xdp.data - frame->metasize; + + act =3D bpf_prog_run_xdp(xdp_prog->prog, &xdp); + switch (act) { + case XDP_PASS: + break; + case XDP_TX: + /* fall through */ + case XDP_REDIRECT: + /* fall through */ + default: + bpf_warn_invalid_xdp_action(act); + /* fall through */ + case XDP_ABORTED: + trace_xdp_exception(tun->dev, xdp_prog->prog, act); + /* fall through */ + case XDP_DROP: + xdp_return_frame_rx_napi(frame); + break; + } + } + + return act; +} + static void *tun_ring_recv(struct tun_file *tfile, int noblock, int *err) { DECLARE_WAITQUEUE(wait, current); @@ -2574,6 +2678,47 @@ static int tun_sendmsg(struct socket *sock, struct m= sghdr *m, size_t total_len) return ret; } =20 +static int tun_consume_packets(struct tun_file *tfile, void **ptr_array, i= nt n) +{ + struct tun_prog *xdp_prog; + struct xdp_frame *frame; + struct tun_struct *tun; + int i, num_ptrs; + int pkt_cnt =3D 0; + void *pkts[MAX_TAP_BATCH]; + void *ptr; + u32 act; + + if (unlikely(!tfile)) + return 0; + + if (n > MAX_TAP_BATCH) + n =3D MAX_TAP_BATCH; + + rcu_read_lock(); + tun =3D rcu_dereference(tfile->tun); + if (unlikely(!tun)) + return 0; + xdp_prog =3D rcu_dereference(tun->offloaded_xdp_prog); + + num_ptrs =3D ptr_ring_consume_batched(&tfile->tx_ring, pkts, n); + for (i =3D 0; i < num_ptrs; i++) { + ptr =3D pkts[i]; + if (tun_is_xdp_frame(ptr)) { + frame =3D tun_ptr_to_xdp(ptr); + act =3D tun_do_xdp_offload(tun, tfile, frame); + } else { + act =3D tun_do_xdp_offload_generic(tun, ptr); + } + + if (act =3D=3D XDP_PASS) + ptr_array[pkt_cnt++] =3D ptr; + } + + rcu_read_unlock(); + return pkt_cnt; +} + static int tun_recvmsg(struct socket *sock, struct msghdr *m, size_t total= _len, int flags) { @@ -2594,9 +2739,7 @@ static int tun_recvmsg(struct socket *sock, struct ms= ghdr *m, size_t total_len, ptr =3D ctl->ptr; break; case TUN_MSG_CONSUME_PKTS: - ret =3D ptr_ring_consume_batched(&tfile->tx_ring, - ctl->ptr, - ctl->num); + ret =3D tun_consume_packets(tfile, ctl->ptr, ctl->num); goto out; case TUN_MSG_UNCONSUME_PKTS: ptr_ring_unconsume(&tfile->tx_ring, ctl->ptr, --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574764421; cv=none; d=zohomail.com; s=zohoarc; b=QntZpeAMAE5pk4+aH7UHlMOnxyYE00nuW9ItCEt2KO0rUiX/V9JpPQB5yhkwKquHye+8iNC5+SLiHD3abGDJMeC0nJIm+iSImAX5tTfGMkJZ8+zSBphpf6JiO9vNmz1OqEy1sR8ZEGOI/CAJncsGPGqN7HXBPhmw2ho3gqA1sTY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574764421; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=A+zZHbHPcf2+kZRFz8qYInOcnfbpxMipg8cRARobJQk=; b=ik0eiAtg/gQM4YSfSAMwe1SGb4DzXc2ILSJAziE5XhXEwWt0LtfwavWtNitEzmfzK8Ai1uYD1L4lo2prHFR1PI6OoOccXC//tstZwDp0b3yC9UmArcA7YhOQ8WidHUZH/tOapXRtIhYyHFEPXFJYywaeFRjswgSlqIohqefoYu8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574764421555178.1074925942014; Tue, 26 Nov 2019 02:33:41 -0800 (PST) Received: from localhost ([::1]:52430 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZYA5-00022w-1v for importer@patchew.org; Tue, 26 Nov 2019 05:33:37 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57349) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsL-0005R4-He for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmY-0003FS-4J for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:19 -0500 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:42163) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmX-0003FA-Ul for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:18 -0500 Received: by mail-pg1-x543.google.com with SMTP id i5so479321pgj.9 for ; Tue, 26 Nov 2019 02:09:17 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:16 -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=A+zZHbHPcf2+kZRFz8qYInOcnfbpxMipg8cRARobJQk=; b=ajEYLyOj6rPflxN/F4j7gzmTTfjkzFiOUEnj4x/mlPjwT6HScKGEYBOt5supKzMBi7 YBKGt62f0nlaJKL+4zEw20xBeu1qYjK6d3SjEQUAl982WY7KJ01zVqk8DP3SnV/E/4fE CvaL6nj6eGp7V+momNglWpxUiWUrQvkycbmynW0f+hE5TfdRhAIloHm1ZaWraGj06zkS pbNZdnR7LBGBbDTgO7C2YbNJOL1telar0aLkM/XV6T7hkE7/6YBVYNdFfy3Jeey0Oa37 By6HHXTNu/fbLWGSKnYoHiZtOXRdndYXg/KtDhSuf3L0sVTRKHyC/x4qHts5RUV3kdo8 txrA== 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=A+zZHbHPcf2+kZRFz8qYInOcnfbpxMipg8cRARobJQk=; b=ED0RwVLROOHKuiyISVTOLQkU4T6a/C53aIRq7LL8kL78ttgXrY6iGxeD3KwQVAuvKW KeGW6hIRoHWyleh2Q0K0QSbIrGEHX9grof+b4cQ1Kbk1dGj6z6NIeGVKVb+biItRLWHL f3qGE+LLJlV/fUASAwVZRuAn3V5K6URgNx/HnTWsoKNZrFsE9QKttA9dWlxFBwvP1b4D u2bnCbwA0QCLjrVpIf1j7yORUtnzvTOS4XEKilM/85CqBfQNGnIgyG80r/vhVaR3ZujT qaik9HmHVM8vnSEDqkAUQTfHzgKuxswQclLwoJs1YJ/Q3V5GS168wv5tEvAFaM2hcxHl G53g== X-Gm-Message-State: APjAAAW3ugsu87NI7D4w7bb9SSd4iAYCaSsMxVZNdz8CzvdeIduwrcQo o+nIRVWBjOAt1bxOk9pBQDk= X-Google-Smtp-Source: APXvYqza/1KXHr4vy/bIqcXkAf21DPD3YjEsUIsSGZ5/9H4FB/QXnB77j4wEUyEgpjV4ork9q/KtvA== X-Received: by 2002:a63:b40d:: with SMTP id s13mr38800406pgf.215.1574762957081; Tue, 26 Nov 2019 02:09:17 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 09/18] tun: add a way to inject Tx path packet into Rx path Date: Tue, 26 Nov 2019 19:07:35 +0900 Message-Id: <20191126100744.5083-10-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" In order to support XDP_TX from offloaded XDP program, we need a way to inject Tx path packet into Rx path. Let's modify the Rx path function tun_xdp_one() for this purpose. This patch adds a parameter to pass information whether packet has virtio_net header. When header isn't present, it is considered as XDP_TX'ed packet from offloaded program. Signed-off-by: Prashant Bhole --- drivers/net/tun.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 466ea69f00ee..8d6cdd3e5139 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -2221,6 +2221,13 @@ static u32 tun_do_xdp_offload_generic(struct tun_str= uct *tun, return act; } =20 +static int tun_xdp_one(struct tun_struct *tun, + struct tun_file *tfile, + struct xdp_buff *xdp, int *flush, + struct tun_page *tpage, int has_hdr); + +static void tun_put_page(struct tun_page *tpage); + static u32 tun_do_xdp_offload(struct tun_struct *tun, struct tun_file *tfi= le, struct xdp_frame *frame) { @@ -2527,23 +2534,36 @@ static void tun_put_page(struct tun_page *tpage) static int tun_xdp_one(struct tun_struct *tun, struct tun_file *tfile, struct xdp_buff *xdp, int *flush, - struct tun_page *tpage) + struct tun_page *tpage, int has_hdr) { unsigned int datasize =3D xdp->data_end - xdp->data; - struct tun_xdp_hdr *hdr =3D xdp->data_hard_start; - struct virtio_net_hdr *gso =3D &hdr->gso; + struct tun_xdp_hdr *hdr; + struct virtio_net_hdr *gso; struct tun_pcpu_stats *stats; struct bpf_prog *xdp_prog; struct sk_buff *skb =3D NULL; + unsigned int headroom; u32 rxhash =3D 0, act; - int buflen =3D hdr->buflen; + int buflen; int err =3D 0; bool skb_xdp =3D false; struct page *page; =20 + if (has_hdr) { + hdr =3D xdp->data_hard_start; + gso =3D &hdr->gso; + buflen =3D hdr->buflen; + } else { + /* came here from tun tx path */ + xdp->data_hard_start -=3D sizeof(struct xdp_frame); + headroom =3D xdp->data - xdp->data_hard_start; + buflen =3D datasize + headroom + + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + } + xdp_prog =3D rcu_dereference(tun->xdp_prog); if (xdp_prog) { - if (gso->gso_type) { + if (has_hdr && gso->gso_type) { skb_xdp =3D true; goto build; } @@ -2588,7 +2608,8 @@ static int tun_xdp_one(struct tun_struct *tun, skb_reserve(skb, xdp->data - xdp->data_hard_start); skb_put(skb, xdp->data_end - xdp->data); =20 - if (virtio_net_hdr_to_skb(skb, gso, tun_is_little_endian(tun))) { + if (has_hdr && + virtio_net_hdr_to_skb(skb, gso, tun_is_little_endian(tun))) { this_cpu_inc(tun->pcpu_stats->rx_frame_errors); kfree_skb(skb); err =3D -EINVAL; @@ -2652,7 +2673,7 @@ static int tun_sendmsg(struct socket *sock, struct ms= ghdr *m, size_t total_len) =20 for (i =3D 0; i < n; i++) { xdp =3D &((struct xdp_buff *)ctl->ptr)[i]; - tun_xdp_one(tun, tfile, xdp, &flush, &tpage); + tun_xdp_one(tun, tfile, xdp, &flush, &tpage, true); } =20 if (flush) --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763691; cv=none; d=zohomail.com; s=zohoarc; b=kDfxUtwMqPc1S9GPZQe7/inmFJZmcyx6D35s+Mpmg615ldESurybOu8q0Aqev95kEKPvJHi/m9xVoXk/wBy7LE9C00r2p9DgX0F0nlypwDRtn9/09tDzrjsylYrtHyFFkEhTakokGyGF8N/019sxovzRXNJM0yv49WuXquqzi+Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763691; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=svo/DJZyqQpUo02aclcCc0QABc66WKSHZ6zQKD7a+Ow=; b=i8bPF+2SI072ohy8nMTN+c/5eGmLeqz1vTExH58YAn6im0CUlXIitPX+dNMyRer4cOGTIchR13Qgo+ZLIyGnDZyO/5ldmnl1QkkMA7xMtcgG/M8Bx8FpOkEKtjaC6grFdDcYAHX+GpP+qFrNeDWl5bicUvxwJJ/EY3WZQSvB4tE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763691612125.8669142284341; Tue, 26 Nov 2019 02:21:31 -0800 (PST) Received: from localhost ([::1]:52240 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXyM-00043F-6T for importer@patchew.org; Tue, 26 Nov 2019 05:21:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57458) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsK-0005g9-Mw for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmb-0003HF-WE for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:22 -0500 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:40834) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmb-0003Gl-Qx for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:21 -0500 Received: by mail-pf1-x444.google.com with SMTP id i187so4767844pfc.7 for ; Tue, 26 Nov 2019 02:09:21 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:20 -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=svo/DJZyqQpUo02aclcCc0QABc66WKSHZ6zQKD7a+Ow=; b=fru48dzlPmxdsRDObkYQrHO7JapBQH3c9E855CQRNtWbayYXM0dPryQmi5/whFOlpS GH/fVBCqvL0AWAPenfff2xRlbHbJeyN0FRY1MhHhuPk2ZlwRT9JdOfr9u4eKWjej1HTC q8G8loaTXtCX8EcOlrVw8hLTEh4GJrvM6aVuqV67oJNuisl5NmKblB7E+689x4Qa7LIa 4SQq9JNWkXDoaqj5RJYNpcE68Ha/YC5zbmY6IAUN1+QQ+4kJDzhyh+LTm5ZfOUaLxAhM sWkA++CI/tDwSaPETlK0YUOCfMRpR+0Q+b9L8Xpbo+zpd9pTLP+X50M8f7aw4NZ0ZvnG QC3Q== 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=svo/DJZyqQpUo02aclcCc0QABc66WKSHZ6zQKD7a+Ow=; b=Pw+/VHpewCCUoDqew8WBcgQ4L7QEunkTa5Yai/wYfhFJBwln7Csb7TdUjo+DouwXvh tDEiCJCpzVMZhBF3xkj1QwurUUDOUVEpwCwYE0ZJMYWpyqRXgmKvLBFOJSM1kvdcCUp8 lV4fEiLJFJzQ/Wkm16avy7S+GVBhkGYyCjUE5a4wc7VACyyi4Hfry1X+gfxtcbIfSMn9 ujGVM0CP9ZiXwlp0uq+ShzW7+RN0uKNqaYLH4o5uTDGbChNSoFf4eiyZp/t18qzLSd49 183r4i6SNDhnUtcyZxFm+Em/h0Zdi9Fv494k0DFjZLYP7lkjvMmsY2954MkFMpvY3f0W Xqvw== X-Gm-Message-State: APjAAAVqleTR2agp6cWBjH33aMpIIvmIfeTWJdotIHOpVRm88Q0i9oxg FGbGOy+Spdan9zDa5zrnWO8= X-Google-Smtp-Source: APXvYqx1KJySu2VSUlGFNdx7ooxLmUOdCiiNdkl+RVxrLvkON5zLWT+2U/MjtFSUA7MS5Y/R8paLmg== X-Received: by 2002:a63:ff26:: with SMTP id k38mr39206249pgi.128.1574762960938; Tue, 26 Nov 2019 02:09:20 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 10/18] tun: handle XDP_TX action of offloaded program Date: Tue, 26 Nov 2019 19:07:36 +0900 Message-Id: <20191126100744.5083-11-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::444 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" When offloaded program returns XDP_TX, we need to inject the packet in Rx path of tun. This patch injects such packets in Rx path using tun_xdp_one. Signed-off-by: Prashant Bhole --- drivers/net/tun.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 8d6cdd3e5139..084ca95358fe 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -2249,7 +2249,13 @@ static u32 tun_do_xdp_offload(struct tun_struct *tun= , struct tun_file *tfile, case XDP_PASS: break; case XDP_TX: - /* fall through */ + tpage.page =3D NULL; + tpage.count =3D 0; + tun_xdp_one(tun, tfile, &xdp, &flush, &tpage, false); + tun_put_page(&tpage); + if (flush) + xdp_do_flush_map(); + break; case XDP_REDIRECT: /* fall through */ default: --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763534; cv=none; d=zohomail.com; s=zohoarc; b=Jy3TfidrmYGfHVpZ+wJou9U1wnFT3d0TWFrZ8XXYOhdpP4cMoUGDIG0ByUIixhQMiAxBQrsAWBFLEUe3EHy4WFOgtGl/18GU6CaVfULXp2pfDbwAQVZ769QfiWcrCHXvZ7q5WIzq866CQbQisz/fUXJ6sG/5s8LsgEXvTNIAYpY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763534; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=EWBtU+IlOUXhhtmkIhJ52D/yxzedCQhAg5N/fljwEYM=; b=I6wG0ctjno/5bxAeL1YZZnm/1QVTLaI3H0LYiqO+BzdI7iRdY/qYTf0i+OCCwF+Rz5sjg6trdNqlInc51bP+SPRKMXp55rQyDf4IF/WKQgv7vw0rCRbQR6TQfvl5/e4FSxv3NRFfjE4xRg1OEUU+6tWwGpKW6fGxNFRaEa5xHNg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763534339523.1261892144587; Tue, 26 Nov 2019 02:18:54 -0800 (PST) Received: from localhost ([::1]:52208 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXvo-0000aI-FN for importer@patchew.org; Tue, 26 Nov 2019 05:18:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57349) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsK-0005R4-9X for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmf-0003Iq-NZ for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:26 -0500 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:38914) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmf-0003IZ-IG for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:25 -0500 Received: by mail-pg1-x542.google.com with SMTP id b137so6441484pga.6 for ; Tue, 26 Nov 2019 02:09:25 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:24 -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=EWBtU+IlOUXhhtmkIhJ52D/yxzedCQhAg5N/fljwEYM=; b=mc9u7EWTbaAvtKBfR1FxVgVgSAqvpWaqH4I+At8oqCl0wPs4cfCfmxX5bUF+7APNl4 Xmw2dKPJ0fdmby7ayXU98TCOKpU3tQ1wLifizZBS9IU8NwE5tsD4IoVzY5pYlcirUpf9 GML0jDXsPkYpnJe+/RALaLB8XlL6sdizXEjybBT7EgZxdovS1whnnDXgS67wftULUchR O3p4sPYpo+nunkY6U7wrAUIFDpc4+vzXWVNuD0tkqqUfIITHpRM0zfXFvhm5VUEnlf0k FecGp1HqFADGdhQP1ea4gIcNAQRIySeCIanS7L8aCvBvaHue4K/B4u8Yk6YJPLPoV0QZ x0AQ== 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=EWBtU+IlOUXhhtmkIhJ52D/yxzedCQhAg5N/fljwEYM=; b=PVaHsPmnSaBAoIewRpmzJmfZq5fV5nLfNy93C8l+NMKvPl+z2BsS/D3j4CQwSCbm5Q 94OCaZhqyintRtuA5iPvo00f322K5lBDvS2uttcAoUxFCRw1bPv+HzTmvEfX1h+VHxka ajnldUiR+2+APDxVzDDyoBE6F9reCwbgkthHMIdhRT5D+aAxQf8uIkwENPsIXGiqIh6b LIfhYxslH1W1TkvYFMQALClYhNT1IKp2mHBnv0Orjk1IRjPf/arLordQAIlq1S79w0Je ANM8OmTo6YAzo5EfDiWG+Yc05ZZdXzTaJ6/RirspYlAfY5UQ6n6xAJi9TxEgdgayA94q MKLQ== X-Gm-Message-State: APjAAAW689sirDqQY+U4xOl9jjcA3M6T5zHD0A98zDdZzWpVR8G9LGiF qPbNt1OdHN5Ow2cQk/fWaxU= X-Google-Smtp-Source: APXvYqz49czbgi+kYj34fPF5hK5fvqdKlFHvat1AI4Q3wYxfqfWIPNVeAlyJ9wlfZ+jcUET4SjDAZg== X-Received: by 2002:a63:6b87:: with SMTP id g129mr29079841pgc.438.1574762964825; Tue, 26 Nov 2019 02:09:24 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 11/18] tun: run xdp prog when tun is read from file interface Date: Tue, 26 Nov 2019 19:07:37 +0900 Message-Id: <20191126100744.5083-12-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" It handles the case when qemu performs read on tun using file operations. Signed-off-by: Prashant Bhole --- drivers/net/tun.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 084ca95358fe..639921c10e32 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -2318,8 +2318,10 @@ static ssize_t tun_do_read(struct tun_struct *tun, s= truct tun_file *tfile, struct iov_iter *to, int noblock, void *ptr) { + struct xdp_frame *frame; ssize_t ret; int err; + u32 act; =20 tun_debug(KERN_INFO, tun, "tun_do_read\n"); =20 @@ -2333,6 +2335,15 @@ static ssize_t tun_do_read(struct tun_struct *tun, s= truct tun_file *tfile, ptr =3D tun_ring_recv(tfile, noblock, &err); if (!ptr) return err; + + if (tun_is_xdp_frame(ptr)) { + frame =3D tun_ptr_to_xdp(ptr); + act =3D tun_do_xdp_offload(tun, tfile, frame); + } else { + act =3D tun_do_xdp_offload_generic(tun, ptr); + } + if (act !=3D XDP_PASS) + return err; } =20 if (tun_is_xdp_frame(ptr)) { --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574764190; cv=none; d=zohomail.com; s=zohoarc; b=a4v4nxiabKec1+TgRR9qhwzYAK1piCaprmHV1eWce7U6U4zLCwe9FMe8rv1YxuWvwxc6PpGUsSddFWlSyy3YT+OK4Yqx9IOcOXXEsL8JfQKpZ4KFxEQGV0UlFV1eEbdyHXIJ/1G80Q/awGtp1/hoHUeleibyQw15C7s5fDdNQQM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574764190; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=04y2jMBz+TniBsSijixdhxAgItaCRW1Bg/M7TEdqtZw=; b=MshEbaZZJiwhAKkqKoh32aQGWjGH2jQfMxlDLiMm1ngraLwsOmV9tzChXXVCTJwzk55sKYy5QLqQUlJI6rqJ5ZcjiK07ybrjiRWbFRvnJ83h6shtfWp9Fv7zvjyuyqRy99Z7FFKQ2ErDShRKCOyh+QtAHqKs5w7aCB3IzaywgjY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574764190677228.00875878570537; Tue, 26 Nov 2019 02:29:50 -0800 (PST) Received: from localhost ([::1]:52378 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY6P-0006sb-2e for importer@patchew.org; Tue, 26 Nov 2019 05:29:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57426) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsK-0005eM-4Z for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmj-0003Mt-QM for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:31 -0500 Received: from mail-pj1-x1043.google.com ([2607:f8b0:4864:20::1043]:43251) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmj-0003M8-KN for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:29 -0500 Received: by mail-pj1-x1043.google.com with SMTP id a10so8055355pju.10 for ; Tue, 26 Nov 2019 02:09:29 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:28 -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=04y2jMBz+TniBsSijixdhxAgItaCRW1Bg/M7TEdqtZw=; b=qNxv9romfmc3q9HrRe1SsyMGoaUYYBfCAqMUu5CAK2O3s3+yZxepf2025cJPH3wVaq YdPZyUS+KjlG/AyXxckpOaJIFC/CznF+s9mOw22e/xJsgsAaSfC+QzI6FDrXI81xPOtl jHxPnXyPvnymn3KeFZk8QSD+AqaskNH3wrtAVq4sk73gCruVUF8q2EL+osao+obGfuXa E4Yvk9grWBs1sV7Ecjvmb2aJXX2sdhUMcocV9tdygaC/9AnOyqH6hyLQHPQRz4EYZYed OROth7uyN6VTu0xFGEmoI2bu6lRMgCUIYSq4c1GTkIT6StqdUJfKPl1MlLtm9JNoEsMG eJtg== 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=04y2jMBz+TniBsSijixdhxAgItaCRW1Bg/M7TEdqtZw=; b=BY3wq07Yy9TYQYW5GNQPRsfK0Vc8Nxs9H9mh7JzQOpIIJdJzU52iQGANo2eC5lbQP5 v2ACNE2z0YJRuJ5LeKo/ETdJwlVrt74P6QWxDmCNZRHYB9Oi1GmT++wjyBwsfUTToeKy d1ndZgKyaNhb0JM9Hev+yrg9nXTbrTqPzR89ZEibFJjDk/YHUvpvxpU3iA2pdzN2PqQl CbZspZV3ZWlO+ZNSUiwmNXncSAiM9w7xC4PNPacPPaEIOX0KoPOAFoweTNfGyTJ6OBMm q5bbuDQlOz9IQvvm5Uzzoj0/D78Kq0B0XPqZVFrdtCqIzMb7i/Vy0XCR9OU4rGgr4gBu 0Mag== X-Gm-Message-State: APjAAAV/1X3lIMp4UMWv6B3E3nSCLYSVtdl5Lsv9U9iKgnKX9gFaXhOK psYRU4xD0bHcxmry+nA8hHA= X-Google-Smtp-Source: APXvYqwRnyofw+ROJrA/0vdTheynnaSCjgx1858Q2XAMEgN8s0N0WdIa2wiPcUAvtMOS75RBHUMq6A== X-Received: by 2002:a17:902:758a:: with SMTP id j10mr34601161pll.29.1574762968666; Tue, 26 Nov 2019 02:09:28 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 12/18] virtio-net: store xdp_prog in device Date: Tue, 26 Nov 2019 19:07:38 +0900 Message-Id: <20191126100744.5083-13-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::1043 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang This is a preparation for adding XDP offload support in virtio_net driver. By storing XDP program in virtionet_info will make it consistent with the offloaded program which will introduce in next patches. Signed-off-by: Jason Wang Co-developed-by: Prashant Bhole Signed-off-by: Prashant Bhole --- drivers/net/virtio_net.c | 62 ++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 4d7d5434cc5d..c8bbb1b90c1c 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -137,8 +137,6 @@ struct receive_queue { =20 struct napi_struct napi; =20 - struct bpf_prog __rcu *xdp_prog; - struct virtnet_rq_stats stats; =20 /* Chain pages by the private ptr. */ @@ -229,6 +227,8 @@ struct virtnet_info { =20 /* failover when STANDBY feature enabled */ struct failover *failover; + + struct bpf_prog __rcu *xdp_prog; }; =20 struct padded_vnet_hdr { @@ -486,7 +486,6 @@ static int virtnet_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames, u32 flags) { struct virtnet_info *vi =3D netdev_priv(dev); - struct receive_queue *rq =3D vi->rq; struct bpf_prog *xdp_prog; struct send_queue *sq; unsigned int len; @@ -501,7 +500,7 @@ static int virtnet_xdp_xmit(struct net_device *dev, /* Only allow ndo_xdp_xmit if XDP is loaded on dev, as this * indicate XDP resources have been successfully allocated. */ - xdp_prog =3D rcu_dereference(rq->xdp_prog); + xdp_prog =3D rcu_dereference(vi->xdp_prog); if (!xdp_prog) return -ENXIO; =20 @@ -649,7 +648,7 @@ static struct sk_buff *receive_small(struct net_device = *dev, stats->bytes +=3D len; =20 rcu_read_lock(); - xdp_prog =3D rcu_dereference(rq->xdp_prog); + xdp_prog =3D rcu_dereference(vi->xdp_prog); if (xdp_prog) { struct virtio_net_hdr_mrg_rxbuf *hdr =3D buf + header_offset; struct xdp_frame *xdpf; @@ -798,7 +797,7 @@ static struct sk_buff *receive_mergeable(struct net_dev= ice *dev, stats->bytes +=3D len - vi->hdr_len; =20 rcu_read_lock(); - xdp_prog =3D rcu_dereference(rq->xdp_prog); + xdp_prog =3D rcu_dereference(vi->xdp_prog); if (xdp_prog) { struct xdp_frame *xdpf; struct page *xdp_page; @@ -2060,7 +2059,7 @@ static int virtnet_set_channels(struct net_device *de= v, * also when XDP is loaded all RX queues have XDP programs so we only * need to check a single RX queue. */ - if (vi->rq[0].xdp_prog) + if (vi->xdp_prog) return -EINVAL; =20 get_online_cpus(); @@ -2441,13 +2440,10 @@ static int virtnet_xdp_set(struct net_device *dev, = struct bpf_prog *prog, return -ENOMEM; } =20 - old_prog =3D rtnl_dereference(vi->rq[0].xdp_prog); + old_prog =3D rtnl_dereference(vi->xdp_prog); if (!prog && !old_prog) return 0; =20 - if (prog) - bpf_prog_add(prog, vi->max_queue_pairs - 1); - /* Make sure NAPI is not using any XDP TX queues for RX. */ if (netif_running(dev)) { for (i =3D 0; i < vi->max_queue_pairs; i++) { @@ -2457,11 +2453,8 @@ static int virtnet_xdp_set(struct net_device *dev, s= truct bpf_prog *prog, } =20 if (!prog) { - for (i =3D 0; i < vi->max_queue_pairs; i++) { - rcu_assign_pointer(vi->rq[i].xdp_prog, prog); - if (i =3D=3D 0) - virtnet_restore_guest_offloads(vi); - } + rcu_assign_pointer(vi->xdp_prog, prog); + virtnet_restore_guest_offloads(vi); synchronize_net(); } =20 @@ -2472,16 +2465,12 @@ static int virtnet_xdp_set(struct net_device *dev, = struct bpf_prog *prog, vi->xdp_queue_pairs =3D xdp_qp; =20 if (prog) { - for (i =3D 0; i < vi->max_queue_pairs; i++) { - rcu_assign_pointer(vi->rq[i].xdp_prog, prog); - if (i =3D=3D 0 && !old_prog) - virtnet_clear_guest_offloads(vi); - } + rcu_assign_pointer(vi->xdp_prog, prog); + if (!old_prog) + virtnet_clear_guest_offloads(vi); } =20 for (i =3D 0; i < vi->max_queue_pairs; i++) { - if (old_prog) - bpf_prog_put(old_prog); if (netif_running(dev)) { virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi); virtnet_napi_tx_enable(vi, vi->sq[i].vq, @@ -2489,13 +2478,15 @@ static int virtnet_xdp_set(struct net_device *dev, = struct bpf_prog *prog, } } =20 + if (old_prog) + bpf_prog_put(old_prog); + return 0; =20 err: if (!prog) { virtnet_clear_guest_offloads(vi); - for (i =3D 0; i < vi->max_queue_pairs; i++) - rcu_assign_pointer(vi->rq[i].xdp_prog, old_prog); + rcu_assign_pointer(vi->xdp_prog, old_prog); } =20 if (netif_running(dev)) { @@ -2514,13 +2505,11 @@ static u32 virtnet_xdp_query(struct net_device *dev) { struct virtnet_info *vi =3D netdev_priv(dev); const struct bpf_prog *xdp_prog; - int i; =20 - for (i =3D 0; i < vi->max_queue_pairs; i++) { - xdp_prog =3D rtnl_dereference(vi->rq[i].xdp_prog); - if (xdp_prog) - return xdp_prog->aux->id; - } + xdp_prog =3D rtnl_dereference(vi->xdp_prog); + if (xdp_prog) + return xdp_prog->aux->id; + return 0; } =20 @@ -2657,18 +2646,17 @@ static void virtnet_free_queues(struct virtnet_info= *vi) =20 static void _free_receive_bufs(struct virtnet_info *vi) { - struct bpf_prog *old_prog; + struct bpf_prog *old_prog =3D rtnl_dereference(vi->xdp_prog); int i; =20 for (i =3D 0; i < vi->max_queue_pairs; i++) { while (vi->rq[i].pages) __free_pages(get_a_page(&vi->rq[i], GFP_KERNEL), 0); - - old_prog =3D rtnl_dereference(vi->rq[i].xdp_prog); - RCU_INIT_POINTER(vi->rq[i].xdp_prog, NULL); - if (old_prog) - bpf_prog_put(old_prog); } + + RCU_INIT_POINTER(vi->xdp_prog, NULL); + if (old_prog) + bpf_prog_put(old_prog); } =20 static void free_receive_bufs(struct virtnet_info *vi) --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763848; cv=none; d=zohomail.com; s=zohoarc; b=TShTlvMoJTS/LvIlvnWRjvDMNtT2x/Tp2BFlwkcRzvbPctKYdOIiWqwhudvxSAtXcqf1yE5M9y6uC4mrmNZ6SL+KRNjWKs12VomS+/aHUlIu6i+xbs+1MpJQ4kpwBW49vGArMRO1lDvY5NMn1xNnXrc71te6ovu6IwPJRGNs7O4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763848; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=zx5Ey469MhuUUqEJoZa/8N8K8LFzbIEk0ZZ64tnsKp0=; b=c6YFohCTO7blzuxHHvd112B2kHk4/6yFijGxBoXxlBSvRGCpEvwbis6A/i5q8Fodu6L4DbuRju86XCtuSEkphuJ/gv3WVzPmFw8xKNRzVAWCKGbYqGTvgtzjJuhYEFwBfcWsch+SedvIY5c5IJmnCfhmzVCz5rNv3Lfosp6DIJg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763848310576.3798518077308; Tue, 26 Nov 2019 02:24:08 -0800 (PST) Received: from localhost ([::1]:52280 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY0s-0007nx-Lc for importer@patchew.org; Tue, 26 Nov 2019 05:24:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57422) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsJ-0005e4-T9 for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmn-0003OR-H4 for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:34 -0500 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:42164) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmn-0003O8-BV for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:33 -0500 Received: by mail-pg1-x541.google.com with SMTP id i5so479698pgj.9 for ; Tue, 26 Nov 2019 02:09:33 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:32 -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=zx5Ey469MhuUUqEJoZa/8N8K8LFzbIEk0ZZ64tnsKp0=; b=tLp6iRQl3sTOSSAx/gYoWpZG6XJZLoT8Zsh4xTn5YujxIAIlwEJMfJD/rbDLDKunxB PPLhWNxdNgkLYho5QUCo4jvD2cNjRkGWG6TUcgyp8JAnzvNAS/wBqESuBabVuZ58ZXMA CjvxUg68D5TAnjrU3ucmi0vThEn2NdeL2t0OCC+t1mzws0+Uo2GF7nK9INOfwKCC+uvF 8tn+hq13m8b2koupUYky/h2w8ql+9nXEVhJybe8LqphIjRZMW5HRezUzTCS/F9spcCWo ReC2AEI2NuSoPd4v59sHgkAEbAfWOp9Mdh5J9/gpiK41Xs5JEe0O3S4M624X2enKwNJd lrrQ== 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=zx5Ey469MhuUUqEJoZa/8N8K8LFzbIEk0ZZ64tnsKp0=; b=SmYc8wv3nbDlYKrBuzhzgF2A8ZapFdPfMXJH9ckSNQAd0dkzylxMjLGtTUwGA2vo0T 7NIpa277kpCcD9Tt0m0LJoKEh70lQggUy2PMshQvqRMK5VPGyIi2A+7gxCXHiQsP+ZSM 6hDN700Ndeam93px+QNTRMIdqOQU+3uTzJeDc/Rb0TnW4iCT7Bru7TTGI0J2Imdl/K9u j+wnPTpu4biiQ8gx/ejP7HdwUVLl2kpCorGMGPAL4meWDYhve+ebxyYYI94onOwWfC2C MFqlIJxh6DgEfqNFr3g/Vmp59ZD4I3e9ehcI6N3PUKWlQe4zeEsUo6Z065HL8JvmvdCJ cX8A== X-Gm-Message-State: APjAAAUZnNgVb/19lpOjVy/mui9UT1KHXtTJPiThH8D40P0jR7G+cLjz AD8r+1IAtsBncT8nVndPQGA= X-Google-Smtp-Source: APXvYqy5nSGYMuA9W/Y541xqtiKlrCKtpPV27lN87wYp1YRIe1p9W24OXy6SRFejVlg/PWYn3qdtdA== X-Received: by 2002:a63:6b46:: with SMTP id g67mr37703871pgc.371.1574762972460; Tue, 26 Nov 2019 02:09:32 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 13/18] virtio_net: use XDP attachment helpers Date: Tue, 26 Nov 2019 19:07:39 +0900 Message-Id: <20191126100744.5083-14-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Next patches will introduce virtio_net XDP offloading. In that case we need to manage offloaded and non-offload program. In order to make it consistent this patch introduces use of XDP attachment helpers. Signed-off-by: Prashant Bhole --- drivers/net/virtio_net.c | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index c8bbb1b90c1c..cee5c2b15c62 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -229,6 +229,8 @@ struct virtnet_info { struct failover *failover; =20 struct bpf_prog __rcu *xdp_prog; + + struct xdp_attachment_info xdp; }; =20 struct padded_vnet_hdr { @@ -2398,15 +2400,19 @@ static int virtnet_restore_guest_offloads(struct vi= rtnet_info *vi) return virtnet_set_guest_offloads(vi, offloads); } =20 -static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog, - struct netlink_ext_ack *extack) +static int virtnet_xdp_set(struct net_device *dev, struct netdev_bpf *bpf) { unsigned long int max_sz =3D PAGE_SIZE - sizeof(struct padded_vnet_hdr); + struct netlink_ext_ack *extack =3D bpf->extack; struct virtnet_info *vi =3D netdev_priv(dev); + struct bpf_prog *prog =3D bpf->prog; struct bpf_prog *old_prog; u16 xdp_qp =3D 0, curr_qp; int i, err; =20 + if (!xdp_attachment_flags_ok(&vi->xdp, bpf)) + return -EBUSY; + if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS) && (virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO4) || virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO6) || @@ -2478,8 +2484,7 @@ static int virtnet_xdp_set(struct net_device *dev, st= ruct bpf_prog *prog, } } =20 - if (old_prog) - bpf_prog_put(old_prog); + xdp_attachment_setup(&vi->xdp, bpf); =20 return 0; =20 @@ -2501,26 +2506,13 @@ static int virtnet_xdp_set(struct net_device *dev, = struct bpf_prog *prog, return err; } =20 -static u32 virtnet_xdp_query(struct net_device *dev) -{ - struct virtnet_info *vi =3D netdev_priv(dev); - const struct bpf_prog *xdp_prog; - - xdp_prog =3D rtnl_dereference(vi->xdp_prog); - if (xdp_prog) - return xdp_prog->aux->id; - - return 0; -} - static int virtnet_xdp(struct net_device *dev, struct netdev_bpf *xdp) { switch (xdp->command) { case XDP_SETUP_PROG: - return virtnet_xdp_set(dev, xdp->prog, xdp->extack); + return virtnet_xdp_set(dev, xdp); case XDP_QUERY_PROG: - xdp->prog_id =3D virtnet_xdp_query(dev); - return 0; + return xdp_attachment_query(&vi->xdp, xdp); default: return -EINVAL; } --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574764139; cv=none; d=zohomail.com; s=zohoarc; b=BseldY/m1jz68VSg+Zenn6ioTyAuFoWszyg//IiC4AfkNteEFyPmyZXaUxLVUM/QrxP4h6vlWdWh9NQQp9fYKk5WhueKwn6+8JnJsJEuK8QYGK7TO47c4D0o8m1LUcGbHmVpZ5Q4lAzE+MdaggYieWWSpkcbKIISqokgJ0eirf4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574764139; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=L8/5aZaE5i5lcakkRBtwP3FriVl4GQ+xN5YrOjIUlCM=; b=iSG54gnkDc5EeXut9ICBWSCulmvJpiO+agjQSmbv5WoBHT0HYx3HimfcwEZ4O7Yj56M5zcrZWzSGZEXwePmzCVEn6t+mIsqhzrjMkh+OrPxj3R2iY/63SsWYVANoYFO3MpZbKRU4p26jllhnkxobnz1VlkDIaYCIREAYs5EvL2k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15747641393991023.9777067649508; Tue, 26 Nov 2019 02:28:59 -0800 (PST) Received: from localhost ([::1]:52354 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY5Z-0005uB-G4 for importer@patchew.org; Tue, 26 Nov 2019 05:28:57 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57434) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsI-0005f2-Vh for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmr-0003QA-CV for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:38 -0500 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:44699) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmr-0003Pe-6W for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:37 -0500 Received: by mail-pf1-x444.google.com with SMTP id d199so4299196pfd.11 for ; Tue, 26 Nov 2019 02:09:37 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:35 -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=L8/5aZaE5i5lcakkRBtwP3FriVl4GQ+xN5YrOjIUlCM=; b=fRo5+9ZKWTD3s5uJLU9TNtKkQVCRPVzYcxVxl6Lb9D5Sflcesxx6GY10RfAqq10k3L 2dKkTp08HPOBLdXS0wZZPqLpVXU51DY9oXE2b9DC9UxnCDjdvcM1IukuHoVC1n4l7jyy ic145rX5r2EoWdTs4R+LaZL+vi+pwlT7G0BG07erZKekmBETQ63fioUFdc3gK1FBFBVl 0TnAFzy1s0cYyK+PPgWGbwH9g275XIrgsW06CMWNnSW9E8TnlJnbcCnYK2GVgBWiFkNI 7otab7zMtDrWC6ZLW4+mk7e6VL4XojLzPtRhSIbukm9LRqIKdMUAAATJq1dn7YseW9QI I8lQ== 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=L8/5aZaE5i5lcakkRBtwP3FriVl4GQ+xN5YrOjIUlCM=; b=Zxjq3l0WbmSNCbsQ6agcYnLgULQ926FzUl4t3D6ShFRUtVyU/+j2xShei2TYqahIL8 +bM/obc9QpSzPYBjai33AOz37Xdu+2bF0g2Xi0PcEY/hNWaGPCuJBtKC0mkxWwVdly9S qntGFQToGgbjnDsSlaA0JLeUJ905V7742iEL4cr1icKxZ+05bQ/hxbMV4vzhqJKbA4cN C8zHygmXUN5RzN379vhB2Zt4tSHFcfbpU25y+Qopgdc2CgGfLFwITiTiTCKxjPKx405b RwlnEDoVcDPLfq9xO9Iw6gkP5u3FVi5++mcgfrDD4GeZrMWd5G3yaGv9+Y6NGGThdX2S tP+w== X-Gm-Message-State: APjAAAU5QxmkuQzAD/F7Ict8oJUvLlG1sY8fcZygbTvlwbFXHe1YkIIS lucZ8kGHqwuEi2wjxlalmjZAWOyy X-Google-Smtp-Source: APXvYqwM6Ee33ApLWb/jq6ETiPN5BAkCEQ3rIFbqFuJ25Hzp+y84mxjBl6KWK1nKTl45ek26gmxnEQ== X-Received: by 2002:aa7:90d0:: with SMTP id k16mr40811463pfk.131.1574762976474; Tue, 26 Nov 2019 02:09:36 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 14/18] virtio_net: add XDP prog offload infrastructure Date: Tue, 26 Nov 2019 19:07:40 +0900 Message-Id: <20191126100744.5083-15-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::444 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang This patch prepares virtio_net of XDP offloading. It adds data structures, blank callback implementations for bpf_prog_offload_ops. It also implements ndo_init, ndo_uninit operations for setting up offload related data structures. Signed-off-by: Jason Wang Co-developed-by: Prashant Bhole Signed-off-by: Prashant Bhole --- drivers/net/virtio_net.c | 103 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index cee5c2b15c62..a1088d0114f2 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -229,8 +229,14 @@ struct virtnet_info { struct failover *failover; =20 struct bpf_prog __rcu *xdp_prog; + struct bpf_prog __rcu *offload_xdp_prog; =20 struct xdp_attachment_info xdp; + struct xdp_attachment_info xdp_hw; + + struct bpf_offload_dev *bpf_dev; + + struct list_head bpf_bound_progs; }; =20 struct padded_vnet_hdr { @@ -258,6 +264,14 @@ static struct xdp_frame *ptr_to_xdp(void *ptr) return (struct xdp_frame *)((unsigned long)ptr & ~VIRTIO_XDP_FLAG); } =20 +struct virtnet_bpf_bound_prog { + struct virtnet_info *vi; + struct bpf_prog *prog; + struct list_head list; + u32 len; + struct bpf_insn insnsi[0]; +}; + /* Converting between virtqueue no. and kernel tx/rx queue no. * 0:rx0 1:tx0 2:rx1 3:tx1 ... 2N:rxN 2N+1:txN 2N+2:cvq */ @@ -2506,13 +2520,63 @@ static int virtnet_xdp_set(struct net_device *dev, = struct netdev_bpf *bpf) return err; } =20 +static int virtnet_bpf_verify_insn(struct bpf_verifier_env *env, int insn_= idx, + int prev_insn) +{ + return 0; +} + +static void virtnet_bpf_destroy_prog(struct bpf_prog *prog) +{ +} + +static int virtnet_xdp_set_offload(struct virtnet_info *vi, + struct netdev_bpf *bpf) +{ + return -EBUSY; +} + +static int virtnet_bpf_verifier_setup(struct bpf_prog *prog) +{ + return -ENOMEM; +} + +static int virtnet_bpf_verifier_prep(struct bpf_prog *prog) +{ + return 0; +} + +static int virtnet_bpf_translate(struct bpf_prog *prog) +{ + return 0; +} + +static int virtnet_bpf_finalize(struct bpf_verifier_env *env) +{ + return 0; +} + +static const struct bpf_prog_offload_ops virtnet_bpf_dev_ops =3D { + .setup =3D virtnet_bpf_verifier_setup, + .prepare =3D virtnet_bpf_verifier_prep, + .insn_hook =3D virtnet_bpf_verify_insn, + .finalize =3D virtnet_bpf_finalize, + .translate =3D virtnet_bpf_translate, + .destroy =3D virtnet_bpf_destroy_prog, +}; + static int virtnet_xdp(struct net_device *dev, struct netdev_bpf *xdp) { + struct virtnet_info *vi =3D netdev_priv(dev); switch (xdp->command) { case XDP_SETUP_PROG: return virtnet_xdp_set(dev, xdp); case XDP_QUERY_PROG: return xdp_attachment_query(&vi->xdp, xdp); + case XDP_SETUP_PROG_HW: + return virtnet_xdp_set_offload(vi, xdp); + case XDP_QUERY_PROG_HW: + return xdp_attachment_query(&vi->xdp_hw, xdp); default: return -EINVAL; } @@ -2559,7 +2623,46 @@ static int virtnet_set_features(struct net_device *d= ev, return 0; } =20 +static int virtnet_bpf_init(struct virtnet_info *vi) +{ + int err; + + vi->bpf_dev =3D bpf_offload_dev_create(&virtnet_bpf_dev_ops, NULL); + err =3D PTR_ERR_OR_ZERO(vi->bpf_dev); + if (err) + return err; + + err =3D bpf_offload_dev_netdev_register(vi->bpf_dev, vi->dev); + if (err) + goto err_netdev_register; + + INIT_LIST_HEAD(&vi->bpf_bound_progs); + + return 0; + +err_netdev_register: + bpf_offload_dev_destroy(vi->bpf_dev); + return err; +} + +static int virtnet_init(struct net_device *dev) +{ + struct virtnet_info *vi =3D netdev_priv(dev); + + return virtnet_bpf_init(vi); +} + +static void virtnet_uninit(struct net_device *dev) +{ + struct virtnet_info *vi =3D netdev_priv(dev); + + bpf_offload_dev_netdev_unregister(vi->bpf_dev, vi->dev); + bpf_offload_dev_destroy(vi->bpf_dev); +} + static const struct net_device_ops virtnet_netdev =3D { + .ndo_init =3D virtnet_init, + .ndo_uninit =3D virtnet_uninit, .ndo_open =3D virtnet_open, .ndo_stop =3D virtnet_close, .ndo_start_xmit =3D start_xmit, --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574764000; cv=none; d=zohomail.com; s=zohoarc; b=DmP6tKu3lkV+oTENgiWwUGqg48zXOR8ST0opSXJZsOl+zwPLWstJjYkWMykHUy5DVZome28oQLPJBb8nwBrXnrhYlqhbRrgRgV4ni/fIGYSaQSAWq5muAoyoTsezrnFK0wiyH283TDjHhsLF8aa5uQisX8h9jrObWJwTAvAE7vM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574764000; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=iF2Qj2HQU3QXOgxa/8KPlCCJG4r2E8XApomblPiSB8E=; b=FpUSdho1TjbyefIx7b1e81OylxNVXwgy3TRkOMf34bfK7G3dx3RQNp+ImN+Y7jA7bDJCAPGLwOoAlB4LxS1Ugy+agbCFuH5tVyEAnE8j0WAxzTtq3k4BQc7/n7FT3pgnQTPNqSP3LuEuB+Xb8nYKyCuTT6mgu0aX7G7m9BZS8LI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 157476400037141.155306119874695; Tue, 26 Nov 2019 02:26:40 -0800 (PST) Received: from localhost ([::1]:52312 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY3L-0003Ak-2i for importer@patchew.org; Tue, 26 Nov 2019 05:26:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57458) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsI-0005g9-VP for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmv-0003S4-BW for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:42 -0500 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:40468) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmv-0003Rm-5Q for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:41 -0500 Received: by mail-pg1-x542.google.com with SMTP id e17so8744888pgd.7 for ; Tue, 26 Nov 2019 02:09:41 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:39 -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=iF2Qj2HQU3QXOgxa/8KPlCCJG4r2E8XApomblPiSB8E=; b=D0UYZK0RE+Et5nv6Qca/F1vgfk1JQVgqSzdMnDmmjurIApyqdCxw6DeQsL8FYTA6u/ KwVzke5RnI0wtXSENtsBmA8wDFxTd6hG+npLFS8bRPb9ugm3/hVV5z8O1I9WDK95KvSE kH3jNxWjPH+jsjkKFHaRrfhsgjCVFwLsD7LNo1xglTVJoWhF1DhwV1ZhDxH5TPdVm/1r XDIiXt1wqIwi3UvE8SfYxp70qrphSnVs70SuuC1ugFHwVuJoBJppJ8Kw/nBjLSqSmkeJ uR01Y6/l83pYdXi8KDjWnm48kQRtavKWqtKuyKEs9AlkD1GFUuFo21izmbRfYwC46KKt Emag== 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=iF2Qj2HQU3QXOgxa/8KPlCCJG4r2E8XApomblPiSB8E=; b=uSPidipDoLmNyCCGlxPKbSS1R+WX3275/BtqGOr4ROp7LFtKoM5XaToEZdtoqMM6g3 10Qr0vl1KiNCyrxh0OZXImuIov67Q57K+uRdgoco61XcBbpfMXeyrs464UcqUeZ/M4bu cfR2ev7I9j1qc0TuR0Qxl9vrKU/ixwfLhVQ+OeRhq5GdlItF6h6JU3Zu/DECtl03EVow jkISchKaCWCE30F0loLFmBHGO4aHoGoL1MN9hXP/DROnRyOJAP9P9dOABKpOO66PulzB 6aOuXyzeK5uU9VKowaPmcCirIfmhDJ4O54O+uAE+eBnCynRKZa+6cs4flHe9iky0roBi CbPA== X-Gm-Message-State: APjAAAWEKeLdyNxtmJIS+AE7XHjzU4F3LfqTIGlie2CCteeOauy4/Iz7 yKSXeUl0pcLYanNuQPTjZNrvhGPs X-Google-Smtp-Source: APXvYqz+uMctIG2ZIs56c5eSzst4/2rCLxB7JzbDXh2IKeUxkAbdP3247ZE0k9PRARnctTS5VQGjqQ== X-Received: by 2002:a63:e647:: with SMTP id p7mr38714558pgj.47.1574762980220; Tue, 26 Nov 2019 02:09:40 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 15/18] virtio_net: implement XDP prog offload functionality Date: Tue, 26 Nov 2019 19:07:41 +0900 Message-Id: <20191126100744.5083-16-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang This patch implements bpf_prog_offload_ops callbacks and adds handling for XDP_SETUP_PROG_HW. Handling of XDP_SETUP_PROG_HW involves setting up struct virtio_net_ctrl_ebpf_prog and appending program instructions to it. This control buffer is sent to Qemu with class VIRTIO_NET_CTRL_EBPF and command VIRTIO_NET_BPF_CMD_SET_OFFLOAD. The expected behavior from Qemu is that it should try to load the program in host os and report the status. It also adds restriction to have either driver or offloaded program at a time. This restriction can be removed later after proper testing. Signed-off-by: Jason Wang Co-developed-by: Prashant Bhole Signed-off-by: Prashant Bhole --- drivers/net/virtio_net.c | 114 +++++++++++++++++++++++++++++++- include/uapi/linux/virtio_net.h | 27 ++++++++ 2 files changed, 139 insertions(+), 2 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index a1088d0114f2..dddfbb2a2075 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -169,6 +169,7 @@ struct control_buf { u8 allmulti; __virtio16 vid; __virtio64 offloads; + struct virtio_net_ctrl_ebpf_prog prog_ctrl; }; =20 struct virtnet_info { @@ -272,6 +273,8 @@ struct virtnet_bpf_bound_prog { struct bpf_insn insnsi[0]; }; =20 +#define VIRTNET_EA(extack, msg) NL_SET_ERR_MSG_MOD((extack), msg) + /* Converting between virtqueue no. and kernel tx/rx queue no. * 0:rx0 1:tx0 2:rx1 3:tx1 ... 2N:rxN 2N+1:txN 2N+2:cvq */ @@ -2427,6 +2430,11 @@ static int virtnet_xdp_set(struct net_device *dev, s= truct netdev_bpf *bpf) if (!xdp_attachment_flags_ok(&vi->xdp, bpf)) return -EBUSY; =20 + if (rtnl_dereference(vi->offload_xdp_prog)) { + VIRTNET_EA(bpf->extack, "program already attached in offload mode"); + return -EINVAL; + } + if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS) && (virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO4) || virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO6) || @@ -2528,17 +2536,114 @@ static int virtnet_bpf_verify_insn(struct bpf_veri= fier_env *env, int insn_idx, =20 static void virtnet_bpf_destroy_prog(struct bpf_prog *prog) { + struct virtnet_bpf_bound_prog *state; + + state =3D prog->aux->offload->dev_priv; + list_del(&state->list); + kfree(state); +} + +static int virtnet_xdp_offload_check(struct virtnet_info *vi, + struct netdev_bpf *bpf) +{ + if (!bpf->prog) + return 0; + + if (!bpf->prog->aux->offload) { + VIRTNET_EA(bpf->extack, "xdpoffload of non-bound program"); + return -EINVAL; + } + if (bpf->prog->aux->offload->netdev !=3D vi->dev) { + VIRTNET_EA(bpf->extack, "program bound to different dev"); + return -EINVAL; + } + + if (rtnl_dereference(vi->xdp_prog)) { + VIRTNET_EA(bpf->extack, "program already attached in driver mode"); + return -EINVAL; + } + + return 0; } =20 static int virtnet_xdp_set_offload(struct virtnet_info *vi, struct netdev_bpf *bpf) { - return -EBUSY; + struct virtio_net_ctrl_ebpf_prog *ctrl; + struct virtnet_bpf_bound_prog *bound_prog =3D NULL; + struct virtio_device *vdev =3D vi->vdev; + struct bpf_prog *prog =3D bpf->prog; + void *ctrl_buf =3D NULL; + struct scatterlist sg; + int prog_len; + int err =3D 0; + + if (!xdp_attachment_flags_ok(&vi->xdp_hw, bpf)) + return -EBUSY; + + if (prog) { + if (prog->type !=3D BPF_PROG_TYPE_XDP) + return -EOPNOTSUPP; + bound_prog =3D prog->aux->offload->dev_priv; + prog_len =3D prog->len * sizeof(bound_prog->insnsi[0]); + + ctrl_buf =3D kmalloc(GFP_KERNEL, sizeof(*ctrl) + prog_len); + if (!ctrl_buf) + return -ENOMEM; + ctrl =3D ctrl_buf; + ctrl->cmd =3D cpu_to_virtio32(vi->vdev, + VIRTIO_NET_BPF_CMD_SET_OFFLOAD); + ctrl->len =3D cpu_to_virtio32(vi->vdev, prog_len); + ctrl->gpl_compatible =3D cpu_to_virtio16(vi->vdev, + prog->gpl_compatible); + memcpy(ctrl->insns, bound_prog->insnsi, + prog->len * sizeof(bound_prog->insnsi[0])); + sg_init_one(&sg, ctrl_buf, sizeof(*ctrl) + prog_len); + } else { + ctrl =3D &vi->ctrl->prog_ctrl; + ctrl->cmd =3D cpu_to_virtio32(vi->vdev, + VIRTIO_NET_BPF_CMD_UNSET_OFFLOAD); + sg_init_one(&sg, ctrl, sizeof(*ctrl)); + } + + if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_EBPF, + VIRTIO_NET_CTRL_EBPF_PROG, + &sg)) { + dev_warn(&vdev->dev, "Failed to set bpf offload prog\n"); + err =3D -EFAULT; + goto out; + } + + rcu_assign_pointer(vi->offload_xdp_prog, prog); + + xdp_attachment_setup(&vi->xdp_hw, bpf); + +out: + kfree(ctrl_buf); + return err; } =20 static int virtnet_bpf_verifier_setup(struct bpf_prog *prog) { - return -ENOMEM; + struct virtnet_info *vi =3D netdev_priv(prog->aux->offload->netdev); + size_t insn_len =3D prog->len * sizeof(struct bpf_insn); + struct virtnet_bpf_bound_prog *state; + + state =3D kzalloc(sizeof(*state) + insn_len, GFP_KERNEL); + if (!state) + return -ENOMEM; + + memcpy(&state->insnsi[0], prog->insnsi, insn_len); + + state->vi =3D vi; + state->prog =3D prog; + state->len =3D prog->len; + + list_add_tail(&state->list, &vi->bpf_bound_progs); + + prog->aux->offload->dev_priv =3D state; + + return 0; } =20 static int virtnet_bpf_verifier_prep(struct bpf_prog *prog) @@ -2568,12 +2673,17 @@ static const struct bpf_prog_offload_ops virtnet_bp= f_dev_ops =3D { static int virtnet_xdp(struct net_device *dev, struct netdev_bpf *xdp) { struct virtnet_info *vi =3D netdev_priv(dev); + int err; + switch (xdp->command) { case XDP_SETUP_PROG: return virtnet_xdp_set(dev, xdp); case XDP_QUERY_PROG: return xdp_attachment_query(&vi->xdp, xdp); case XDP_SETUP_PROG_HW: + err =3D virtnet_xdp_offload_check(vi, xdp); + if (err) + return err; return virtnet_xdp_set_offload(vi, xdp); case XDP_QUERY_PROG_HW: return xdp_attachment_query(&vi->xdp_hw, xdp); diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_ne= t.h index a3715a3224c1..0ea2f7910a5a 100644 --- a/include/uapi/linux/virtio_net.h +++ b/include/uapi/linux/virtio_net.h @@ -261,4 +261,31 @@ struct virtio_net_ctrl_mq { #define VIRTIO_NET_CTRL_GUEST_OFFLOADS 5 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET 0 =20 +/* + * Control XDP offloads offloads + * + * When guest wants to offload XDP program to the device, it calls + * VIRTIO_NET_CTRL_EBPF_PROG along with VIRTIO_NET_BPF_CMD_SET_OFFLOAD + * subcommands. When offloading is successful, the device runs offloaded + * XDP program for each packet before sending it to the guest. + * + * VIRTIO_NET_BPF_CMD_UNSET_OFFLOAD removes the the offloaded program from + * the device, if exists. + */ + +struct virtio_net_ctrl_ebpf_prog { + /* program length in bytes */ + __virtio32 len; + __virtio16 cmd; + __virtio16 gpl_compatible; + __u8 insns[0]; +}; + +#define VIRTIO_NET_CTRL_EBPF 6 + #define VIRTIO_NET_CTRL_EBPF_PROG 1 + +/* Commands for VIRTIO_NET_CTRL_EBPF_PROG */ +#define VIRTIO_NET_BPF_CMD_SET_OFFLOAD 1 +#define VIRTIO_NET_BPF_CMD_UNSET_OFFLOAD 2 + #endif /* _UAPI_LINUX_VIRTIO_NET_H */ --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763799; cv=none; d=zohomail.com; s=zohoarc; b=npJRYKbjHGswlyLAErRiD6C+nN4//tYgmA90/LM0AGV5p3wbogU6/H1yAzrRvtuHhQdT+ZISZ0weYlYv0lH8BM9XVQhWDvVBaPKA4UzAHWVjTdE8o+dapIWHbih+7adOYhmOFbOPyMAfv2LIeBTYHraEUtBzy/PGKRGGcItXa5I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763799; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=pUc8XgU3PRUIYnmGD1sk4dmdkx2zuWhcKZo2RCjAbj4=; b=XxPHggWslWhnG9wRb1uQyDjT6p+U+gRGMoNqkOirSNC0g4jcYNaQbp159BhcOKbZSmehrusel7uZZF7lfD6Ye5RRYqL9BqNMI72lVtuH1PEIt6i9mcfZ3bnOOopxzT6KTiQ4iepBmLYwe+AnOpVmQNgVN5KBI9KBKzjHx+S0PYg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763799702284.4577516300071; Tue, 26 Nov 2019 02:23:19 -0800 (PST) Received: from localhost ([::1]:52272 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY05-0006V0-Uo for importer@patchew.org; Tue, 26 Nov 2019 05:23:17 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57422) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsH-0005e4-03 for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXmy-0003TG-W6 for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:45 -0500 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:38917) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXmy-0003Sy-Qd for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:44 -0500 Received: by mail-pg1-x542.google.com with SMTP id b137so6441943pga.6 for ; Tue, 26 Nov 2019 02:09:44 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:43 -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=pUc8XgU3PRUIYnmGD1sk4dmdkx2zuWhcKZo2RCjAbj4=; b=V/YUucEhcvTyJgZSWsi5RwLlFSOkklklct0nM4joSGWaIR7na/no+LPxPiWVwQxxt3 MZTId0BfvRrcBB5cS/xNn6YkR/nR/a/oFs+qoKWNnr42ZGOZSgTJb1F9wGQ/O7rl4ool fqDK2tc6OlvGgzuoLOzoJUJQHilZeQPmXpSCsMF/iAGRQPq1estAj8ZW+DJ3zXLxs0I/ Q9QpB8OHiq3d1Lt0nQ7YBRWLpuxJLuJe9KhDCvCcZTqb9EKaythXaA5hLTcRTjhHTcg0 Zmy8SaIL9vFHoxTDHybOLMp6I58SLo01Hd5rnDgBZPghb4JF9K2no8TAUZxDYsM3NvAV RVqw== 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=pUc8XgU3PRUIYnmGD1sk4dmdkx2zuWhcKZo2RCjAbj4=; b=jMNcuoOQnCmYdov24pN7V2oJ46oqbX41e4TM1RCFcYmeR/tqYtcV5fKjCN4TMVAEbB aOcg4GJWdvp5AvOYaeunmzSfKJJk2VXu+0rfrmoVHKj36ktNUNFvoe8voyWNMtlG2z9q PFGdEyMhOAC1V5ph0smtj4blFdgpjG1KR4mLdb0ntyI/TuLBezQRPf+VydJL6hgzdZZ4 yPKXFrIZCeGts8TIU2O0rnCD7E8wAugg1tVeuxAeYTFt1HfIsKfdrnXYYcfUThVq4X/+ IhHw7hVsfH7+QQ1C5Gr66BfrHV25lF2qbJk+f/VeJDaIyjz6VYPPMM5GanTCxtJUE00n ysyA== X-Gm-Message-State: APjAAAW7DUpe16K0jZIlpeTGOOzjwKOS+B+GMof4j4az0QnJBM03e9ru gtRnkfvyEWPyoDNzZJ+EBOs= X-Google-Smtp-Source: APXvYqyXGcO2rx/7HpN4RNXvapDE7gQDbHTJMsH1+iqGmKXZYJEaN21RZ6AzcvVf5dFk+Y1nNp9XGQ== X-Received: by 2002:a63:6b87:: with SMTP id g129mr29081453pgc.438.1574762984061; Tue, 26 Nov 2019 02:09:44 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 16/18] bpf: export function __bpf_map_get Date: Tue, 26 Nov 2019 19:07:42 +0900 Message-Id: <20191126100744.5083-17-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang __bpf_map_get is necessary to get verify whether an fd corresponds to a bpf map, without adding a refcount on that map. After exporting it can be used by a kernel module. Signed-off-by: Jason Wang Signed-off-by: Prashant Bhole --- kernel/bpf/syscall.c | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index e3461ec59570..e524ab1e7c64 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -737,6 +737,7 @@ struct bpf_map *__bpf_map_get(struct fd f) =20 return f.file->private_data; } +EXPORT_SYMBOL(__bpf_map_get); =20 void bpf_map_inc(struct bpf_map *map) { --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763700; cv=none; d=zohomail.com; s=zohoarc; b=kyKFP5Y8RqBW0Af1555RbFspjCAJm7dktdKPUpBQhwDEsM2tjL1/R1e/Z+l/MmBA2HUJXgVk/ptwPasA1Gcayv3LNrPfX9TXcDNRJjhDb/0pCk+vFcGW9uL9XchqH3zy2APgnjMQRWUx9bYxpeo9mKmDpX56APZHM9YbiicDC/k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763700; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Zk3sW22S1vh0AAHBme1qJ6RZt3yGG+m+CCZCVNC9O+U=; b=YkULtuqJLQnnQWZiYFkqOpn0dDQ7XFgA7Jj+ePWwW9x9N6QD9/oxL2s0WkHvnccmVYmJQkcSjJ2GnpwBtePRv/l4oMJK+vGr3k+9+hduEQvsFxxRvrtpuWz52atKkrVZ9pZXIuluqCpaOShHJvXCvbUeOaYZDSdKfi5rujkGCFI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763700265868.0926930394397; Tue, 26 Nov 2019 02:21:40 -0800 (PST) Received: from localhost ([::1]:52242 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXyU-0004DH-ID for importer@patchew.org; Tue, 26 Nov 2019 05:21:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57426) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsH-0005eM-0B for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXn3-0003Uy-5J for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:50 -0500 Received: from mail-pj1-x1041.google.com ([2607:f8b0:4864:20::1041]:44382) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXn2-0003UW-Tr for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:49 -0500 Received: by mail-pj1-x1041.google.com with SMTP id w8so8053421pjh.11 for ; Tue, 26 Nov 2019 02:09:48 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:47 -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=Zk3sW22S1vh0AAHBme1qJ6RZt3yGG+m+CCZCVNC9O+U=; b=i+EvPSxfehY7pdZKrtOH/92CceCXUXqxQNHLS8Dgi76SvXlg05ezIAKQ4FdC4oJRA+ vkIRYqqni/0dSQQeSIisOK9PmMqJEgS8HBbC5oAS1K4Uogo9Std2Szp8RPbhFubRLtWa GAXaGUhUjWJzY99ZSABBweLRJ3wy66M7ruI46vL6dB8E6ZUse7Ub9ld8rb+k1+hnefYS Lt/XYCNpBDHO399apLSYB4kp81Zz1DYQ9MVL5fQ+E6xSj57jgVaqCw1zZFeGxt2KCgKi KQ+8dAkH6CzVS39i6plLht441sTUmKWtdf7AhRHO7SrQC/HcuCz7Iur7n3eP/5PfybuL Oj3w== 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=Zk3sW22S1vh0AAHBme1qJ6RZt3yGG+m+CCZCVNC9O+U=; b=mm1DTp3xd01IYYYyElNtodWt7y/mYt20Nm/dGOhLuiXM+T35dDXnq30QYLP6pPTSN9 YBworB7VgS6/ktkSxq47URADCSZjXInjlacC35JAHD/G6sg1uMdPIYGfyNTnQoV4Ysad F1m1Br/lsx8qghwOr8txUCdCwa6mg3O1VYI+Tnl9x3RHjvzHM5inA4h1egPqaEaeSdwI oxDVy4AxCzg3d+dli0oIrV+QaMSrJAUuKlV0p2owSb+oLibXpHMp1m9HSgfXY4R09VKO qJu0k6uamoQe+P6/LU5PIrD5+79NyGGdel8WaTccVM+q1aQDmw90Q9NynM1wNNckbc5o pGMA== X-Gm-Message-State: APjAAAUUqk3pLuaT9UzlLDlxwX0mzUeT5RT9T+nB6Dmaq/2r6TpU39HC 54Kl6zEYPicepgngMW9L+mk= X-Google-Smtp-Source: APXvYqzFyFh+pbLegLoH9n9d2gmpHvn7dEVY5afqLnbUM7fE1SOq8IDt/3EeOo1AM4jKJu5rmRGdoA== X-Received: by 2002:a17:902:8f81:: with SMTP id z1mr32304035plo.228.1574762987931; Tue, 26 Nov 2019 02:09:47 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 17/18] virtio_net: implment XDP map offload functionality Date: Tue, 26 Nov 2019 19:07:43 +0900 Message-Id: <20191126100744.5083-18-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::1041 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Jason Wang This patch implements: * Handling of BPF_OFFLOAD_MAP_ALLOC, BPF_OFFLOAD_MAP_FREE: Allocate driver specific map data structure. Set up struct virtio_net_ctrl_ebpf_map and send the control buffer to Qemu with class VIRTIO_NET_CTRL_EBPF, cmd VIRTIO_NET_CTRL_EBPF_MAP. The cmd in the control buffer is set to VIRTIO_NET_BPF_CMD_CREATE_MAP. The expected behavior from Qemu is that it should perform the action as per command and return the status (and map data). In case of create map command, Qemu should set the map_fd in the control buffer * bpf_map_dev_ops operations: Common map operations are implemented with use of above mentioned struct virtio_net_ctrl_ebpf_map. This control buffer has space for storing: key + key or key + value. * map_fd replacement in a copy of the program: Since map are created before the verification of program begins, we have map fds from the host side for each offloaded map when program verification begins. map fds in the copy of the program are replaced with map fds from host side. This copy of program is used for offloading. Signed-off-by: Jason Wang Co-developed-by: Prashant Bhole Signed-off-by: Prashant Bhole --- drivers/net/virtio_net.c | 241 ++++++++++++++++++++++++++++++++ include/uapi/linux/virtio_net.h | 23 +++ 2 files changed, 264 insertions(+) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index dddfbb2a2075..91a94b787c64 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -238,6 +238,7 @@ struct virtnet_info { struct bpf_offload_dev *bpf_dev; =20 struct list_head bpf_bound_progs; + struct list_head map_list; }; =20 struct padded_vnet_hdr { @@ -275,6 +276,13 @@ struct virtnet_bpf_bound_prog { =20 #define VIRTNET_EA(extack, msg) NL_SET_ERR_MSG_MOD((extack), msg) =20 +struct virtnet_bpf_map { + struct bpf_offloaded_map *offmap; + struct virtnet_info *vi; + struct virtio_net_ctrl_ebpf_map *ctrl; + struct list_head list; +}; + /* Converting between virtqueue no. and kernel tx/rx queue no. * 0:rx0 1:tx0 2:rx1 3:tx1 ... 2N:rxN 2N+1:txN 2N+2:cvq */ @@ -2528,6 +2536,19 @@ static int virtnet_xdp_set(struct net_device *dev, s= truct netdev_bpf *bpf) return err; } =20 +static struct virtnet_bpf_map *virtnet_get_bpf_map(struct virtnet_info *vi, + struct bpf_map *map) +{ + struct virtnet_bpf_map *virtnet_map; + + list_for_each_entry(virtnet_map, &vi->map_list, list) { + if (&virtnet_map->offmap->map =3D=3D map) + return virtnet_map; + } + + return NULL; +} + static int virtnet_bpf_verify_insn(struct bpf_verifier_env *env, int insn_= idx, int prev_insn) { @@ -2623,11 +2644,194 @@ static int virtnet_xdp_set_offload(struct virtnet_= info *vi, return err; } =20 +static int virtnet_bpf_ctrl_map(struct bpf_offloaded_map *offmap, + int cmd, u8 *key, u8 *value, u64 flags, + u8 *out_key, u8 *out_value) +{ + struct virtio_net_ctrl_ebpf_map *ctrl; + struct virtnet_bpf_map *virtnet_map; + struct bpf_map *map =3D &offmap->map; + unsigned char *keyptr, *valptr; + struct virtnet_info *vi; + struct scatterlist sg; + + virtnet_map =3D offmap->dev_priv; + vi =3D virtnet_map->vi; + ctrl =3D virtnet_map->ctrl; + + keyptr =3D ctrl->buf; + valptr =3D ctrl->buf + ctrl->key_size; + + if (key) + memcpy(keyptr, key, map->key_size); + if (value) + memcpy(valptr, value, map->value_size); + + ctrl->cmd =3D cpu_to_virtio32(vi->vdev, cmd); + ctrl->flags =3D cpu_to_virtio64(vi->vdev, flags); + + sg_init_one(&sg, ctrl, sizeof(*ctrl) + ctrl->buf_len); + if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_EBPF, + VIRTIO_NET_CTRL_EBPF_MAP, + &sg)) + return -EFAULT; + + if (out_key) + memcpy(out_key, valptr, map->key_size); + if (out_value) + memcpy(out_value, valptr, map->value_size); + return 0; +} + +static int virtnet_bpf_map_update_entry(struct bpf_offloaded_map *offmap, + void *key, void *value, u64 flags) +{ + return virtnet_bpf_ctrl_map(offmap, + VIRTIO_NET_BPF_CMD_UPDATE_ELEM, + key, value, flags, NULL, NULL); +} + +static int virtnet_bpf_map_delete_elem(struct bpf_offloaded_map *offmap, + void *key) +{ + return virtnet_bpf_ctrl_map(offmap, + VIRTIO_NET_BPF_CMD_DELETE_ELEM, + key, NULL, 0, NULL, NULL); +} + +static int virtnet_bpf_map_lookup_entry(struct bpf_offloaded_map *offmap, + void *key, void *value) +{ + return virtnet_bpf_ctrl_map(offmap, + VIRTIO_NET_BPF_CMD_LOOKUP_ELEM, + key, NULL, 0, NULL, value); +} + +static int virtnet_bpf_map_get_first_key(struct bpf_offloaded_map *offmap, + void *next_key) +{ + return virtnet_bpf_ctrl_map(offmap, + VIRTIO_NET_BPF_CMD_GET_FIRST, + NULL, NULL, 0, next_key, NULL); +} + +static int virtnet_bpf_map_get_next_key(struct bpf_offloaded_map *offmap, + void *key, void *next_key) +{ + if (!key) + return virtnet_bpf_map_get_first_key(offmap, next_key); + + return virtnet_bpf_ctrl_map(offmap, + VIRTIO_NET_BPF_CMD_GET_NEXT, + key, NULL, 0, next_key, NULL); +} + +static const struct bpf_map_dev_ops virtnet_bpf_map_ops =3D { + .map_get_next_key =3D virtnet_bpf_map_get_next_key, + .map_lookup_elem =3D virtnet_bpf_map_lookup_entry, + .map_update_elem =3D virtnet_bpf_map_update_entry, + .map_delete_elem =3D virtnet_bpf_map_delete_elem, +}; + +static int virtnet_bpf_map_alloc(struct virtnet_info *vi, + struct bpf_offloaded_map *offmap) +{ + struct virtnet_bpf_map *virtnet_map =3D NULL; + struct virtio_net_ctrl_ebpf_map *ctrl =3D NULL; + struct bpf_map *map =3D &offmap->map; + struct scatterlist sg; + int buf_len; + + if (map->map_type !=3D BPF_MAP_TYPE_ARRAY && + map->map_type !=3D BPF_MAP_TYPE_HASH) + goto err; + + virtnet_map =3D kzalloc(sizeof(*virtnet_map), GFP_KERNEL); + if (!virtnet_map) + goto err; + + /* allocate buffer size to fit + * - sizeof (struct virio_net_ctrl_map_buf) + * - key_size + * - max(key_size + value_size, key_size + key_size) + */ + buf_len =3D map->key_size; + buf_len +=3D (map->key_size > map->value_size) ? + map->key_size : map->value_size; + ctrl =3D kzalloc(sizeof(*ctrl) + buf_len, GFP_KERNEL); + if (!ctrl) + goto err; + + ctrl->buf_len =3D cpu_to_virtio32(vi->vdev, buf_len); + ctrl->key_size =3D cpu_to_virtio32(vi->vdev, map->key_size); + ctrl->value_size =3D cpu_to_virtio32(vi->vdev, map->value_size); + ctrl->max_entries =3D cpu_to_virtio32(vi->vdev, map->max_entries); + ctrl->map_type =3D cpu_to_virtio32(vi->vdev, map->map_type); + ctrl->map_flags =3D 0; + ctrl->cmd =3D cpu_to_virtio32(vi->vdev, VIRTIO_NET_BPF_CMD_CREATE_MAP); + + sg_init_one(&sg, ctrl, sizeof(*ctrl) + ctrl->buf_len); + + if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_EBPF, + VIRTIO_NET_CTRL_EBPF_MAP, + &sg)) { + dev_warn(&vi->vdev->dev, "Failed to create ebpf map\n"); + goto err; + } + + offmap->dev_ops =3D &virtnet_bpf_map_ops; + offmap->dev_priv =3D virtnet_map; + + virtnet_map->offmap =3D offmap; + virtnet_map->vi =3D vi; + virtnet_map->ctrl =3D ctrl; + + list_add_tail(&virtnet_map->list, &vi->map_list); + + return 0; +err: + kfree(virtnet_map); + kfree(ctrl); + return -EFAULT; +} + +static int virtnet_bpf_map_free(struct virtnet_info *vi, + struct bpf_offloaded_map *offmap) +{ + struct bpf_map *map =3D &offmap->map; + struct virtnet_bpf_map *virtnet_map =3D virtnet_get_bpf_map(vi, map); + struct virtio_net_ctrl_ebpf_map *ctrl =3D virtnet_map->ctrl; + struct scatterlist sg; + + if (!virtnet_map) + return -EINVAL; + + ctrl->cmd =3D cpu_to_virtio32(vi->vdev, VIRTIO_NET_BPF_CMD_FREE_MAP); + + sg_init_one(&sg, ctrl, sizeof(*ctrl) + ctrl->buf_len); + + if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_EBPF, + VIRTIO_NET_CTRL_EBPF_MAP, + &sg)) { + dev_warn(&vi->vdev->dev, "Failed to free ebpf map\n"); + return -EFAULT; + } + + list_del(&virtnet_map->list); + kfree(virtnet_map->ctrl); + kfree(virtnet_map); + return 0; +} + static int virtnet_bpf_verifier_setup(struct bpf_prog *prog) { struct virtnet_info *vi =3D netdev_priv(prog->aux->offload->netdev); size_t insn_len =3D prog->len * sizeof(struct bpf_insn); struct virtnet_bpf_bound_prog *state; + struct virtnet_bpf_map *virtnet_map; + struct bpf_map *map; + struct fd mapfd; + int i, err =3D 0; =20 state =3D kzalloc(sizeof(*state) + insn_len, GFP_KERNEL); if (!state) @@ -2639,11 +2843,43 @@ static int virtnet_bpf_verifier_setup(struct bpf_pr= og *prog) state->prog =3D prog; state->len =3D prog->len; =20 + for (i =3D 0; i < state->len; i++) { + struct bpf_insn *insn =3D &state->insnsi[i]; + + if (insn->code !=3D (BPF_LD | BPF_IMM | BPF_DW)) + continue; + + mapfd =3D fdget(insn->imm); + map =3D __bpf_map_get(mapfd); + if (IS_ERR(map)) { + pr_warn("fd %d is not pointing to valid bpf_map\n", + insn->imm); + err =3D -EINVAL; + goto err_replace; + } + + virtnet_map =3D virtnet_get_bpf_map(vi, map); + if (!virtnet_map) { + pr_warn("could not get a offloaded map fd %d\n", + insn->imm); + err =3D -EINVAL; + goto err_replace; + } + + /* Note: no need of virtio32_to_cpu */ + insn->imm =3D virtnet_map->ctrl->map_fd; + fdput(mapfd); + } + list_add_tail(&state->list, &vi->bpf_bound_progs); =20 prog->aux->offload->dev_priv =3D state; =20 return 0; + +err_replace: + kfree(state); + return err; } =20 static int virtnet_bpf_verifier_prep(struct bpf_prog *prog) @@ -2676,6 +2912,10 @@ static int virtnet_xdp(struct net_device *dev, struc= t netdev_bpf *xdp) int err; =20 switch (xdp->command) { + case BPF_OFFLOAD_MAP_ALLOC: + return virtnet_bpf_map_alloc(vi, xdp->offmap); + case BPF_OFFLOAD_MAP_FREE: + return virtnet_bpf_map_free(vi, xdp->offmap); case XDP_SETUP_PROG: return virtnet_xdp_set(dev, xdp); case XDP_QUERY_PROG: @@ -2747,6 +2987,7 @@ static int virtnet_bpf_init(struct virtnet_info *vi) goto err_netdev_register; =20 INIT_LIST_HEAD(&vi->bpf_bound_progs); + INIT_LIST_HEAD(&vi->map_list); =20 return 0; =20 diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_ne= t.h index 0ea2f7910a5a..1d330a0883ac 100644 --- a/include/uapi/linux/virtio_net.h +++ b/include/uapi/linux/virtio_net.h @@ -281,11 +281,34 @@ struct virtio_net_ctrl_ebpf_prog { __u8 insns[0]; }; =20 +struct virtio_net_ctrl_ebpf_map { + __virtio32 buf_len; + __virtio32 cmd; + __virtio32 map_type; + __virtio32 key_size; + __virtio32 value_size; + __virtio32 max_entries; + __virtio32 map_flags; + __virtio32 map_fd; + __virtio64 flags; + __u8 buf[0]; +}; + #define VIRTIO_NET_CTRL_EBPF 6 #define VIRTIO_NET_CTRL_EBPF_PROG 1 + #define VIRTIO_NET_CTRL_EBPF_MAP 2 =20 /* Commands for VIRTIO_NET_CTRL_EBPF_PROG */ #define VIRTIO_NET_BPF_CMD_SET_OFFLOAD 1 #define VIRTIO_NET_BPF_CMD_UNSET_OFFLOAD 2 =20 +/* Commands for VIRTIO_NET_CTRL_EBPF_MAP */ +#define VIRTIO_NET_BPF_CMD_CREATE_MAP 1 +#define VIRTIO_NET_BPF_CMD_FREE_MAP 2 +#define VIRTIO_NET_BPF_CMD_UPDATE_ELEM 3 +#define VIRTIO_NET_BPF_CMD_LOOKUP_ELEM 4 +#define VIRTIO_NET_BPF_CMD_DELETE_ELEM 5 +#define VIRTIO_NET_BPF_CMD_GET_FIRST 6 +#define VIRTIO_NET_BPF_CMD_GET_NEXT 7 + #endif /* _UAPI_LINUX_VIRTIO_NET_H */ --=20 2.20.1 From nobody Tue May 14 03:29:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1574763828; cv=none; d=zohomail.com; s=zohoarc; b=R4Roo4dUgyG+z6tACBeTlghUUsyeliZ8MiqJrxnQBp59NsyF0q1EuLpy+CegTyqL49rUEsB/So6R6QRtyuI+T6hlTugJD83sqg924DJEfIA47fn3qIEsLspkwHgCJVt/mbkJZHN8uoOEFWUglw2tEVSKsNyJRivUaaKIvBMtRCg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574763828; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=vjhBcNZlvW0lMvmwhzAhIEHJGNVVbcL/eLdp//zF+fg=; b=mves4Vq0fpMao4K92+SctsLUwROIc6C4zmk6Q2BOwyHfEjZPxWZ9k2tYHdeebIGeE1sz5RNykLEXSsulZTnB0rge1P2OE7gVtOpo4dpfXrBuhVRaU8QRBwsQPPMRh79WBp16WPo+LHLHaF5Yzwglg7sM/vS22MHPKG9LYzUqWaE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1574763828490311.59215959288883; Tue, 26 Nov 2019 02:23:48 -0800 (PST) Received: from localhost ([::1]:52276 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZY0Y-0007L8-Sv for importer@patchew.org; Tue, 26 Nov 2019 05:23:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57458) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iZXsH-0005g9-0R for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:15:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iZXn6-0003Vy-Lm for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:53 -0500 Received: from mail-pj1-x1043.google.com ([2607:f8b0:4864:20::1043]:44384) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iZXn6-0003Vo-GQ for qemu-devel@nongnu.org; Tue, 26 Nov 2019 05:09:52 -0500 Received: by mail-pj1-x1043.google.com with SMTP id w8so8053496pjh.11 for ; Tue, 26 Nov 2019 02:09:52 -0800 (PST) Received: from localhost.localdomain ([222.151.198.97]) by smtp.gmail.com with ESMTPSA id s24sm11848485pfh.108.2019.11.26.02.09.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 02:09:51 -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=vjhBcNZlvW0lMvmwhzAhIEHJGNVVbcL/eLdp//zF+fg=; b=hfC8Y0GlPj/uXQPu3A2bgAU/XKe+wQFyKu/9eLipQh61lukaue4hfFzl2ix7VClJjZ eqSqR/bDgLg7pVcqACj11DMCuCv0gwXL7+xHhsNh5NwgCfARRwd9PlFnobWiTzP9n90N Cad2Cf8SKecEWov8eZLUH408k+NDKtsw7byKo/MzSxyDe560t1bn8KA8Nw44LvCzF9vm USGyVrg3TbYALODisuOSe3Ve8xKDQg/MXtM9pDiIBi8Zs54oRtnKLNOLXzCEtbzwdMLf iPJ/eSOXkY0IEK3bI3VUv0V9mmMlT1OQKz3zMG/tabHlx5zqAMJowhWzs1hYAg70KyV9 hpug== 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=vjhBcNZlvW0lMvmwhzAhIEHJGNVVbcL/eLdp//zF+fg=; b=CVQlQFewAhhiN7RLm8YnklniqS+uPZmHF3V8bGkG2wLJE+I+ASYdydJoNaFbG0yCX+ hHMpEo22eEswVK+42piVUxYTdvIyGyKGs7nEbe5mMj2yEUGpRdsICAR9iJhuZY2f22f3 Y3pGLZT8ZI/qNShq068zMU/uTQP9IiOFVx9KDj0BlAivLgt4LYA8tw3E8jaW8DqUO9RE qTf9mqMb0q0n209XGORQuD8Hqef0lRXPfrgXnahfQieJhbXJXjnWFqejkObHrMI+FSFD QuDxVU162x4zptgMjKrgNbFvTH4A+xIHtvLDjrCcKsYtWOdeZ+YKXtL2ytWN4SYpc1gC nsdw== X-Gm-Message-State: APjAAAXtnd+t5hnperiL9htMB4nhdu/cxonVSdT8vCFSshQ2tUBesXhD b/jZLzMwWgoL857+aQzPhyo= X-Google-Smtp-Source: APXvYqzqJGhF3OWpPSeJBTojUttgXbH4VXymhLmS8Ad3+dmUNyuhjPT2iweDPV8n33fEjuC8F6+rjQ== X-Received: by 2002:a17:90a:a612:: with SMTP id c18mr5725937pjq.49.1574762991777; Tue, 26 Nov 2019 02:09:51 -0800 (PST) From: Prashant Bhole To: "David S . Miller" , "Michael S . Tsirkin" Subject: [RFC net-next 18/18] virtio_net: restrict bpf helper calls from offloaded program Date: Tue, 26 Nov 2019 19:07:44 +0900 Message-Id: <20191126100744.5083-19-prashantbhole.linux@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191126100744.5083-1-prashantbhole.linux@gmail.com> References: <20191126100744.5083-1-prashantbhole.linux@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::1043 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Jakub Kicinski , Jesper Dangaard Brouer , Daniel Borkmann , netdev@vger.kernel.org, Jason Wang , John Fastabend , Alexei Starovoitov , qemu-devel@nongnu.org, Prashant Bhole , kvm@vger.kernel.org, Yonghong Song , Andrii Nakryiko , Martin KaFai Lau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Since we are offloading this program to the host, some of the helper calls will not make sense. For example get_numa_node_id. Some helpers can not be used because we don't handle them yet. So let's allow a small set of helper calls for now. Signed-off-by: Prashant Bhole --- drivers/net/virtio_net.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 91a94b787c64..ab5be6b95bbd 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -2549,6 +2549,25 @@ static struct virtnet_bpf_map *virtnet_get_bpf_map(s= truct virtnet_info *vi, return NULL; } =20 +static int virtnet_bpf_check_helper_call(struct bpf_insn *insn) +{ + switch (insn->imm) { + case BPF_FUNC_map_lookup_elem: + case BPF_FUNC_map_update_elem: + case BPF_FUNC_map_delete_elem: + case BPF_FUNC_ktime_get_ns: + case BPF_FUNC_get_prandom_u32: + case BPF_FUNC_csum_update: + case BPF_FUNC_xdp_adjust_head: + case BPF_FUNC_xdp_adjust_meta: + case BPF_FUNC_xdp_adjust_tail: + case BPF_FUNC_strtol: + case BPF_FUNC_strtoul: + return 0; + } + return -EOPNOTSUPP; +} + static int virtnet_bpf_verify_insn(struct bpf_verifier_env *env, int insn_= idx, int prev_insn) { @@ -2830,6 +2849,7 @@ static int virtnet_bpf_verifier_setup(struct bpf_prog= *prog) struct virtnet_bpf_bound_prog *state; struct virtnet_bpf_map *virtnet_map; struct bpf_map *map; + u8 opcode, class; struct fd mapfd; int i, err =3D 0; =20 @@ -2846,6 +2866,16 @@ static int virtnet_bpf_verifier_setup(struct bpf_pro= g *prog) for (i =3D 0; i < state->len; i++) { struct bpf_insn *insn =3D &state->insnsi[i]; =20 + opcode =3D BPF_OP(insn->code); + class =3D BPF_CLASS(insn->code); + + if ((class =3D=3D BPF_JMP || class =3D=3D BPF_JMP32) && + opcode =3D=3D BPF_CALL && insn->src_reg !=3D BPF_PSEUDO_CALL) { + if (virtnet_bpf_check_helper_call(insn)) + return -EOPNOTSUPP; + continue; + } + if (insn->code !=3D (BPF_LD | BPF_IMM | BPF_DW)) continue; =20 --=20 2.20.1