Commit 3771b822 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files
Daniel Borkmann says:

====================
pull-request: bpf 2020-11-28

1) Do not reference the skb for xsk's generic TX side since when looped
   back into RX it might crash in generic XDP, from Björn Töpel.

2) Fix umem cleanup on a partially set up xsk socket when being destroyed,
   from Magnus Karlsson.

3) Fix an incorrect netdev reference count when failing xsk_bind() operation,
   from Marek Majtyka.

4) Fix bpftool to set an error code on failed calloc() in build_btf_type_table(),
   from Zhen Lei.

* https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf:
  bpf: Add MAINTAINERS entry for BPF LSM
  bpftool: Fix error return value in build_btf_type_table
  net, xsk: Avoid taking multiple skbuff references
  xsk: Fix incorrect netdev reference count
  xsk: Fix umem cleanup bug at socket destruct
  MAINTAINERS: Update XDP and AF_XDP entries
====================

Link: https://lore.kernel.org/r/20201128005104.1205-1-daniel@iogearbox.net


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 28d35ad0 9a44bc94
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -3355,6 +3355,17 @@ S: Supported
F:	arch/x86/net/
X:	arch/x86/net/bpf_jit_comp32.c
BPF LSM (Security Audit and Enforcement using BPF)
M:	KP Singh <kpsingh@chromium.org>
R:	Florent Revest <revest@chromium.org>
R:	Brendan Jackman <jackmanb@chromium.org>
L:	bpf@vger.kernel.org
S:	Maintained
F:	Documentation/bpf/bpf_lsm.rst
F:	include/linux/bpf_lsm.h
F:	kernel/bpf/bpf_lsm.c
F:	security/bpf/
BROADCOM B44 10/100 ETHERNET DRIVER
M:	Michael Chan <michael.chan@broadcom.com>
L:	netdev@vger.kernel.org
@@ -19112,12 +19123,17 @@ L: netdev@vger.kernel.org
L:	bpf@vger.kernel.org
S:	Supported
F:	include/net/xdp.h
F:	include/net/xdp_priv.h
F:	include/trace/events/xdp.h
F:	kernel/bpf/cpumap.c
F:	kernel/bpf/devmap.c
F:	net/core/xdp.c
N:	xdp
K:	xdp
F:	samples/bpf/xdp*
F:	tools/testing/selftests/bpf/*xdp*
F:	tools/testing/selftests/bpf/*/*xdp*
F:	drivers/net/ethernet/*/*/*/*/*xdp*
F:	drivers/net/ethernet/*/*/*xdp*
K:	(?:\b|_)xdp(?:\b|_)
XDP SOCKETS (AF_XDP)
M:	Björn Töpel <bjorn.topel@intel.com>
@@ -19126,9 +19142,12 @@ R: Jonathan Lemon <jonathan.lemon@gmail.com>
L:	netdev@vger.kernel.org
L:	bpf@vger.kernel.org
S:	Maintained
F:	Documentation/networking/af_xdp.rst
F:	include/net/xdp_sock*
F:	include/net/xsk_buff_pool.h
F:	include/uapi/linux/if_xdp.h
F:	include/uapi/linux/xdp_diag.h
F:	include/net/netns/xdp.h
F:	net/xdp/
F:	samples/bpf/xdpsock*
F:	tools/lib/bpf/xsk*
+13 −1
Original line number Diff line number Diff line
@@ -2813,9 +2813,21 @@ u16 dev_pick_tx_zero(struct net_device *dev, struct sk_buff *skb,
		     struct net_device *sb_dev);
u16 dev_pick_tx_cpu_id(struct net_device *dev, struct sk_buff *skb,
		       struct net_device *sb_dev);

int dev_queue_xmit(struct sk_buff *skb);
int dev_queue_xmit_accel(struct sk_buff *skb, struct net_device *sb_dev);
int dev_direct_xmit(struct sk_buff *skb, u16 queue_id);
int __dev_direct_xmit(struct sk_buff *skb, u16 queue_id);

static inline int dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
{
	int ret;

	ret = __dev_direct_xmit(skb, queue_id);
	if (!dev_xmit_complete(ret))
		kfree_skb(skb);
	return ret;
}

int register_netdevice(struct net_device *dev);
void unregister_netdevice_queue(struct net_device *dev, struct list_head *head);
void unregister_netdevice_many(struct list_head *head);
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ struct xdp_umem {
	struct page **pgs;
	int id;
	struct list_head xsk_dma_list;
	struct work_struct work;
};

struct xsk_map {
+2 −6
Original line number Diff line number Diff line
@@ -4180,7 +4180,7 @@ int dev_queue_xmit_accel(struct sk_buff *skb, struct net_device *sb_dev)
}
EXPORT_SYMBOL(dev_queue_xmit_accel);

int dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
int __dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
{
	struct net_device *dev = skb->dev;
	struct sk_buff *orig_skb = skb;
@@ -4210,17 +4210,13 @@ int dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
	dev_xmit_recursion_dec();

	local_bh_enable();

	if (!dev_xmit_complete(ret))
		kfree_skb(skb);

	return ret;
drop:
	atomic_long_inc(&dev->tx_dropped);
	kfree_skb_list(skb);
	return NET_XMIT_DROP;
}
EXPORT_SYMBOL(dev_direct_xmit);
EXPORT_SYMBOL(__dev_direct_xmit);

/*************************************************************************
 *			Receiver routines
+16 −3
Original line number Diff line number Diff line
@@ -66,19 +66,32 @@ static void xdp_umem_release(struct xdp_umem *umem)
	kfree(umem);
}

static void xdp_umem_release_deferred(struct work_struct *work)
{
	struct xdp_umem *umem = container_of(work, struct xdp_umem, work);

	xdp_umem_release(umem);
}

void xdp_get_umem(struct xdp_umem *umem)
{
	refcount_inc(&umem->users);
}

void xdp_put_umem(struct xdp_umem *umem)
void xdp_put_umem(struct xdp_umem *umem, bool defer_cleanup)
{
	if (!umem)
		return;

	if (refcount_dec_and_test(&umem->users))
	if (refcount_dec_and_test(&umem->users)) {
		if (defer_cleanup) {
			INIT_WORK(&umem->work, xdp_umem_release_deferred);
			schedule_work(&umem->work);
		} else {
			xdp_umem_release(umem);
		}
	}
}

static int xdp_umem_pin_pages(struct xdp_umem *umem, unsigned long address)
{
Loading