7552 lines · 188.4 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0-or-later/* *	Routines having to do with the 'struct sk_buff' memory handlers. * *	Authors:	Alan Cox <alan@lxorguk.ukuu.org.uk> *			Florian La Roche <rzsfl@rz.uni-sb.de> * *	Fixes: *		Alan Cox	:	Fixed the worst of the load *					balancer bugs. *		Dave Platt	:	Interrupt stacking fix. *	Richard Kooijman	:	Timestamp fixes. *		Alan Cox	:	Changed buffer format. *		Alan Cox	:	destructor hook for AF_UNIX etc. *		Linus Torvalds	:	Better skb_clone. *		Alan Cox	:	Added skb_copy. *		Alan Cox	:	Added all the changed routines Linus *					only put in the headers *		Ray VanTassle	:	Fixed --skb->lock in free *		Alan Cox	:	skb_copy copy arp field *		Andi Kleen	:	slabified it. *		Robert Olsson	:	Removed skb_head_pool * *	NOTE: *		The __skb_ routines should be called with interrupts *	disabled, or you better be *real* sure that the operation is atomic *	with respect to whatever list is being frobbed (e.g. via lock_sock() *	or via disabling bottom half handlers, etc). */ /* *	The functions in this file will not compile correctly with gcc 2.4.x */ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/module.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/mm.h>#include <linux/interrupt.h>#include <linux/in.h>#include <linux/inet.h>#include <linux/slab.h>#include <linux/tcp.h>#include <linux/udp.h>#include <linux/sctp.h>#include <linux/netdevice.h>#ifdef CONFIG_NET_CLS_ACT#include <net/pkt_sched.h>#endif#include <linux/string.h>#include <linux/skbuff.h>#include <linux/skbuff_ref.h>#include <linux/splice.h>#include <linux/cache.h>#include <linux/rtnetlink.h>#include <linux/init.h>#include <linux/scatterlist.h>#include <linux/errqueue.h>#include <linux/prefetch.h>#include <linux/bitfield.h>#include <linux/if_vlan.h>#include <linux/mpls.h>#include <linux/kcov.h>#include <linux/iov_iter.h>#include <linux/crc32.h> #include <net/protocol.h>#include <net/dst.h>#include <net/sock.h>#include <net/checksum.h>#include <net/gro.h>#include <net/gso.h>#include <net/hotdata.h>#include <net/ip6_checksum.h>#include <net/xfrm.h>#include <net/mpls.h>#include <net/mptcp.h>#include <net/mctp.h>#include <net/tcp.h>#include <net/can.h>#include <net/page_pool/helpers.h>#include <net/psp/types.h>#include <net/dropreason.h>#include <net/xdp_sock.h> #include <linux/uaccess.h>#include <trace/events/skb.h>#include <linux/highmem.h>#include <linux/capability.h>#include <linux/user_namespace.h>#include <linux/indirect_call_wrapper.h>#include <linux/textsearch.h> #include "dev.h"#include "devmem.h"#include "net-sysfs.h"#include "netmem_priv.h" #ifdef CONFIG_SKB_EXTENSIONSstatic struct kmem_cache *skbuff_ext_cache __ro_after_init;#endif #define GRO_MAX_HEAD_PAD (GRO_MAX_HEAD + NET_SKB_PAD + NET_IP_ALIGN)#define SKB_SMALL_HEAD_SIZE SKB_HEAD_ALIGN(max(MAX_TCP_HEADER, \					       GRO_MAX_HEAD_PAD)) /* SKB_SMALL_HEAD_CACHE_SIZE is the size used for the skbuff_small_head * kmem_cache. The non-power-of-2 padding is kept for historical reasons and * to avoid potential collisions with generic kmalloc bucket sizes. */#define SKB_SMALL_HEAD_CACHE_SIZE					\	(is_power_of_2(SKB_SMALL_HEAD_SIZE) ?			\		(SKB_SMALL_HEAD_SIZE + L1_CACHE_BYTES) :	\		SKB_SMALL_HEAD_SIZE) #define SKB_SMALL_HEAD_HEADROOM						\	SKB_WITH_OVERHEAD(SKB_SMALL_HEAD_CACHE_SIZE) /* kcm_write_msgs() relies on casting paged frags to bio_vec to use * iov_iter_bvec(). These static asserts ensure the cast is valid is long as the * netmem is a page. */static_assert(offsetof(struct bio_vec, bv_page) ==	      offsetof(skb_frag_t, netmem));static_assert(sizeof_field(struct bio_vec, bv_page) ==	      sizeof_field(skb_frag_t, netmem)); static_assert(offsetof(struct bio_vec, bv_len) == offsetof(skb_frag_t, len));static_assert(sizeof_field(struct bio_vec, bv_len) ==	      sizeof_field(skb_frag_t, len)); static_assert(offsetof(struct bio_vec, bv_offset) ==	      offsetof(skb_frag_t, offset));static_assert(sizeof_field(struct bio_vec, bv_offset) ==	      sizeof_field(skb_frag_t, offset)); #undef FN#define FN(reason) [SKB_DROP_REASON_##reason] = #reason,static const char * const drop_reasons[] = {	[SKB_CONSUMED] = "CONSUMED",	DEFINE_DROP_REASON(FN, FN)}; static const struct drop_reason_list drop_reasons_core = {	.reasons = drop_reasons,	.n_reasons = ARRAY_SIZE(drop_reasons),}; const struct drop_reason_list __rcu *drop_reasons_by_subsys[SKB_DROP_REASON_SUBSYS_NUM] = {	[SKB_DROP_REASON_SUBSYS_CORE] = RCU_INITIALIZER(&drop_reasons_core),};EXPORT_SYMBOL(drop_reasons_by_subsys); /** * drop_reasons_register_subsys - register another drop reason subsystem * @subsys: the subsystem to register, must not be the core * @list: the list of drop reasons within the subsystem, must point to *	a statically initialized list */void drop_reasons_register_subsys(enum skb_drop_reason_subsys subsys,				  const struct drop_reason_list *list){	if (WARN(subsys <= SKB_DROP_REASON_SUBSYS_CORE ||		 subsys >= ARRAY_SIZE(drop_reasons_by_subsys),		 "invalid subsystem %d\n", subsys))		return; 	/* must point to statically allocated memory, so INIT is OK */	RCU_INIT_POINTER(drop_reasons_by_subsys[subsys], list);}EXPORT_SYMBOL_GPL(drop_reasons_register_subsys); /** * drop_reasons_unregister_subsys - unregister a drop reason subsystem * @subsys: the subsystem to remove, must not be the core * * Note: This will synchronize_rcu() to ensure no users when it returns. */void drop_reasons_unregister_subsys(enum skb_drop_reason_subsys subsys){	if (WARN(subsys <= SKB_DROP_REASON_SUBSYS_CORE ||		 subsys >= ARRAY_SIZE(drop_reasons_by_subsys),		 "invalid subsystem %d\n", subsys))		return; 	RCU_INIT_POINTER(drop_reasons_by_subsys[subsys], NULL); 	synchronize_rcu();}EXPORT_SYMBOL_GPL(drop_reasons_unregister_subsys); /** *	skb_panic - private function for out-of-line support *	@skb:	buffer *	@sz:	size *	@addr:	address *	@msg:	skb_over_panic or skb_under_panic * *	Out-of-line support for skb_put() and skb_push(). *	Called via the wrapper skb_over_panic() or skb_under_panic(). *	Keep out of line to prevent kernel bloat. *	__builtin_return_address is not used because it is not always reliable. */static void skb_panic(struct sk_buff *skb, unsigned int sz, void *addr,		      const char msg[]){	pr_emerg("%s: text:%px len:%d put:%d head:%px data:%px tail:%#lx end:%#lx dev:%s\n",		 msg, addr, skb->len, sz, skb->head, skb->data,		 (unsigned long)skb->tail, (unsigned long)skb->end,		 skb->dev ? skb->dev->name : "<NULL>");	BUG();} static void skb_over_panic(struct sk_buff *skb, unsigned int sz, void *addr){	skb_panic(skb, sz, addr, __func__);} static void skb_under_panic(struct sk_buff *skb, unsigned int sz, void *addr){	skb_panic(skb, sz, addr, __func__);} #define NAPI_SKB_CACHE_SIZE	128#define NAPI_SKB_CACHE_BULK	32#define NAPI_SKB_CACHE_FREE	32 struct napi_alloc_cache {	local_lock_t bh_lock;	struct page_frag_cache page;	unsigned int skb_count;	void *skb_cache[NAPI_SKB_CACHE_SIZE];}; static DEFINE_PER_CPU(struct page_frag_cache, netdev_alloc_cache);static DEFINE_PER_CPU(struct napi_alloc_cache, napi_alloc_cache) = {	.bh_lock = INIT_LOCAL_LOCK(bh_lock),}; void *__napi_alloc_frag_align(unsigned int fragsz, unsigned int align_mask){	struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);	void *data; 	fragsz = SKB_DATA_ALIGN(fragsz); 	local_lock_nested_bh(&napi_alloc_cache.bh_lock);	data = __page_frag_alloc_align(&nc->page, fragsz,				       GFP_ATOMIC | __GFP_NOWARN, align_mask);	local_unlock_nested_bh(&napi_alloc_cache.bh_lock);	return data; }EXPORT_SYMBOL(__napi_alloc_frag_align); void *__netdev_alloc_frag_align(unsigned int fragsz, unsigned int align_mask){	void *data; 	if (in_hardirq() || irqs_disabled()) {		struct page_frag_cache *nc = this_cpu_ptr(&netdev_alloc_cache); 		fragsz = SKB_DATA_ALIGN(fragsz);		data = __page_frag_alloc_align(nc, fragsz,					       GFP_ATOMIC | __GFP_NOWARN,					       align_mask);	} else {		local_bh_disable();		data = __napi_alloc_frag_align(fragsz, align_mask);		local_bh_enable();	}	return data;}EXPORT_SYMBOL(__netdev_alloc_frag_align); /* Cache kmem_cache_size(net_hotdata.skbuff_cache) to help the compiler * remove dead code (and skbuff_cache_size) when CONFIG_KASAN is unset. */static u32 skbuff_cache_size __read_mostly; static inline struct sk_buff *napi_skb_cache_get(bool alloc){	struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);	struct sk_buff *skb; 	local_lock_nested_bh(&napi_alloc_cache.bh_lock);	if (unlikely(!nc->skb_count)) {		if (alloc && kmem_cache_alloc_bulk(net_hotdata.skbuff_cache,						   GFP_ATOMIC | __GFP_NOWARN,						   NAPI_SKB_CACHE_BULK,						   nc->skb_cache))			nc->skb_count = NAPI_SKB_CACHE_BULK;		if (unlikely(!nc->skb_count)) {			local_unlock_nested_bh(&napi_alloc_cache.bh_lock);			return NULL;		}	} 	skb = nc->skb_cache[--nc->skb_count];	if (nc->skb_count)		prefetch(nc->skb_cache[nc->skb_count - 1]);	local_unlock_nested_bh(&napi_alloc_cache.bh_lock);	kasan_mempool_unpoison_object(skb, skbuff_cache_size); 	return skb;} /* * Only clear those fields we need to clear, not those that we will * actually initialise later. Hence, don't put any more fields after * the tail pointer in struct sk_buff! */static inline void skbuff_clear(struct sk_buff *skb){	/* Replace memset(skb, 0, offsetof(struct sk_buff, tail))	 * with two smaller memset(), with a barrier() between them.	 * This forces the compiler to inline both calls.	 */	BUILD_BUG_ON(offsetof(struct sk_buff, tail) <= 128);	memset(skb, 0, 128);	barrier();	memset((void *)skb + 128, 0, offsetof(struct sk_buff, tail) - 128);} /** * napi_skb_cache_get_bulk - obtain a number of zeroed skb heads from the cache * @skbs: pointer to an at least @n-sized array to fill with skb pointers * @n: number of entries to provide * * Tries to obtain @n &sk_buff entries from the NAPI percpu cache and writes * the pointers into the provided array @skbs. If there are less entries * available, tries to replenish the cache and bulk-allocates the diff from * the MM layer if needed. * The heads are being zeroed with either memset() or %__GFP_ZERO, so they are * ready for {,__}build_skb_around() and don't have any data buffers attached. * Must be called *only* from the BH context. * * Return: number of successfully allocated skbs (@n if no actual allocation *	   needed or kmem_cache_alloc_bulk() didn't fail). */u32 napi_skb_cache_get_bulk(void **skbs, u32 n){	struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);	u32 bulk, total = n; 	local_lock_nested_bh(&napi_alloc_cache.bh_lock); 	if (nc->skb_count >= n)		goto get; 	/* No enough cached skbs. Try refilling the cache first */	bulk = min(NAPI_SKB_CACHE_SIZE - nc->skb_count, NAPI_SKB_CACHE_BULK);	if (kmem_cache_alloc_bulk(net_hotdata.skbuff_cache,				  GFP_ATOMIC | __GFP_NOWARN, bulk,				  &nc->skb_cache[nc->skb_count]))		nc->skb_count += bulk;	if (likely(nc->skb_count >= n))		goto get; 	/* Still not enough. Bulk-allocate the missing part directly, zeroed */	if (kmem_cache_alloc_bulk(net_hotdata.skbuff_cache,				  GFP_ATOMIC | __GFP_ZERO | __GFP_NOWARN,				  n - nc->skb_count, &skbs[nc->skb_count]))		n = nc->skb_count;	if (likely(nc->skb_count >= n))		goto get; 	/* kmem_cache didn't allocate the number we need, limit the output */	total -= n - nc->skb_count;	n = nc->skb_count; get:	for (u32 base = nc->skb_count - n, i = 0; i < n; i++) {		skbs[i] = nc->skb_cache[base + i]; 		kasan_mempool_unpoison_object(skbs[i], skbuff_cache_size);		skbuff_clear(skbs[i]);	} 	nc->skb_count -= n;	local_unlock_nested_bh(&napi_alloc_cache.bh_lock); 	return total;}EXPORT_SYMBOL_GPL(napi_skb_cache_get_bulk); static inline void __finalize_skb_around(struct sk_buff *skb, void *data,					 unsigned int size){	struct skb_shared_info *shinfo; 	size -= SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); 	/* Assumes caller memset cleared SKB */	skb->truesize = SKB_TRUESIZE(size);	refcount_set(&skb->users, 1);	skb->head = data;	skb->data = data;	skb_reset_tail_pointer(skb);	skb_set_end_offset(skb, size);	skb->mac_header = (typeof(skb->mac_header))~0U;	skb->transport_header = (typeof(skb->transport_header))~0U;	skb->alloc_cpu = raw_smp_processor_id();	/* make sure we initialize shinfo sequentially */	shinfo = skb_shinfo(skb);	memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));	atomic_set(&shinfo->dataref, 1); 	skb_set_kcov_handle(skb, kcov_common_handle());} static inline void *__slab_build_skb(void *data, unsigned int *size){	void *resized; 	/* Must find the allocation size (and grow it to match). */	*size = ksize(data);	/* krealloc() will immediately return "data" when	 * "ksize(data)" is requested: it is the existing upper	 * bounds. As a result, GFP_ATOMIC will be ignored. Note	 * that this "new" pointer needs to be passed back to the	 * caller for use so the __alloc_size hinting will be	 * tracked correctly.	 */	resized = krealloc(data, *size, GFP_ATOMIC);	WARN_ON_ONCE(resized != data);	return resized;} /* build_skb() variant which can operate on slab buffers. * Note that this should be used sparingly as slab buffers * cannot be combined efficiently by GRO! */struct sk_buff *slab_build_skb(void *data){	struct sk_buff *skb;	unsigned int size; 	skb = kmem_cache_alloc(net_hotdata.skbuff_cache,			       GFP_ATOMIC | __GFP_NOWARN);	if (unlikely(!skb))		return NULL; 	skbuff_clear(skb);	data = __slab_build_skb(data, &size);	__finalize_skb_around(skb, data, size); 	return skb;}EXPORT_SYMBOL(slab_build_skb); /* Caller must provide SKB that is memset cleared */static void __build_skb_around(struct sk_buff *skb, void *data,			       unsigned int frag_size){	unsigned int size = frag_size; 	/* frag_size == 0 is considered deprecated now. Callers	 * using slab buffer should use slab_build_skb() instead.	 */	if (WARN_ONCE(size == 0, "Use slab_build_skb() instead"))		data = __slab_build_skb(data, &size); 	__finalize_skb_around(skb, data, size);} /** * __build_skb - build a network buffer * @data: data buffer provided by caller * @frag_size: size of data (must not be 0) * * Allocate a new &sk_buff. Caller provides space holding head and * skb_shared_info. @data must have been allocated from the page * allocator or vmalloc(). (A @frag_size of 0 to indicate a kmalloc() * allocation is deprecated, and callers should use slab_build_skb() * instead.) * The return is the new skb buffer. * On a failure the return is %NULL, and @data is not freed. * Notes : *  Before IO, driver allocates only data buffer where NIC put incoming frame *  Driver should add room at head (NET_SKB_PAD) and *  MUST add room at tail (SKB_DATA_ALIGN(skb_shared_info)) *  After IO, driver calls build_skb(), to allocate sk_buff and populate it *  before giving packet to stack. *  RX rings only contains data buffers, not full skbs. */struct sk_buff *__build_skb(void *data, unsigned int frag_size){	struct sk_buff *skb; 	skb = kmem_cache_alloc(net_hotdata.skbuff_cache,			       GFP_ATOMIC | __GFP_NOWARN);	if (unlikely(!skb))		return NULL; 	skbuff_clear(skb);	__build_skb_around(skb, data, frag_size);

Lines 1–500 of 7552.