135 lines · 3.7 KB · Text
RawDownload
// SPDX-License-Identifier: GPL-2.0-only/// Use kmalloc_obj family of macros for allocations///// Confidence: High// Options: --include-headers-for-types --all-includes --include-headers --keep-comments virtual patch @initialize:python@@@import sys def alloc_array(name):	func = "FAILED_RENAME"	if name == "kmalloc_array":		func = "kmalloc_objs"	elif name == "kvmalloc_array":		func = "kvmalloc_objs"	elif name == "kcalloc":		func = "kzalloc_objs"	elif name == "kvcalloc":		func = "kvzalloc_objs"	else:		print(f"Unknown transform for {name}", file=sys.stderr)	return func // This excludes anything that is assigning to or from integral types or// string literals. Everything else gets the sizeof() extracted for the// kmalloc_obj() type/var argument. sizeof(void *) is also excluded because// it will need case-by-case double-checking to make sure the right type is// being assigned.@direct depends on patch && !(file in "tools") && !(file in "samples")@typedef u8, u16, u32, u64;typedef __u8, __u16, __u32, __u64;typedef uint8_t, uint16_t, uint32_t, uint64_t;typedef uchar, ushort, uint, ulong;typedef __le16, __le32, __le64;typedef __be16, __be32, __be64;typedef wchar_t;type INTEGRAL = {u8,__u8,uint8_t,char,unsigned char,uchar,wchar_t,		 u16,__u16,uint16_t,unsigned short,ushort,		 u32,__u32,uint32_t,unsigned int,uint,		 u64,__u64,uint64_t,unsigned long,ulong,		 __le16,__le32,__le64,__be16,__be32,__be64};char [] STRING;INTEGRAL *BYTES;INTEGRAL **BYTES_PTRS;type TYPE;expression VAR;expression GFP;expression COUNT;expression FLEX;expression E;identifier ALLOC =~ "^kv?[mz]alloc$";fresh identifier ALLOC_OBJ = ALLOC ## "_obj";fresh identifier ALLOC_FLEX = ALLOC ## "_flex";identifier ALLOC_ARRAY = {kmalloc_array,kvmalloc_array,kcalloc,kvcalloc};fresh identifier ALLOC_OBJS = script:python(ALLOC_ARRAY) { alloc_array(ALLOC_ARRAY) };@@ (-	VAR = ALLOC((sizeof(*VAR)), GFP)+	VAR = ALLOC_OBJ(*VAR, GFP)|	ALLOC((\(sizeof(STRING)\|sizeof(INTEGRAL)\|sizeof(INTEGRAL *)\)), GFP)|	BYTES = ALLOC((sizeof(E)), GFP)|	BYTES = ALLOC((sizeof(TYPE)), GFP)|	BYTES_PTRS = ALLOC((sizeof(E)), GFP)|	BYTES_PTRS = ALLOC((sizeof(TYPE)), GFP)|	ALLOC((sizeof(void *)), GFP)|-	ALLOC((sizeof(E)), GFP)+	ALLOC_OBJ(E, GFP)|-	ALLOC((sizeof(TYPE)), GFP)+	ALLOC_OBJ(TYPE, GFP)|	ALLOC_ARRAY(COUNT, (\(sizeof(STRING)\|sizeof(INTEGRAL)\|sizeof(INTEGRAL *)\)), GFP)|	BYTES = ALLOC_ARRAY(COUNT, (sizeof(E)), GFP)|	BYTES = ALLOC_ARRAY(COUNT, (sizeof(TYPE)), GFP)|	BYTES_PTRS = ALLOC_ARRAY(COUNT, (sizeof(E)), GFP)|	BYTES_PTRS = ALLOC_ARRAY(COUNT, (sizeof(TYPE)), GFP)|	ALLOC_ARRAY((\(sizeof(STRING)\|sizeof(INTEGRAL)\|sizeof(INTEGRAL *)\)), COUNT, GFP)|	BYTES = ALLOC_ARRAY((sizeof(E)), COUNT, GFP)|	BYTES = ALLOC_ARRAY((sizeof(TYPE)), COUNT, GFP)|	BYTES_PTRS = ALLOC_ARRAY((sizeof(E)), COUNT, GFP)|	BYTES_PTRS = ALLOC_ARRAY((sizeof(TYPE)), COUNT, GFP)|	ALLOC_ARRAY(COUNT, (sizeof(void *)), GFP)|	ALLOC_ARRAY((sizeof(void *)), COUNT, GFP)|-	ALLOC_ARRAY(COUNT, (sizeof(E)), GFP)+	ALLOC_OBJS(E, COUNT, GFP)|-	ALLOC_ARRAY(COUNT, (sizeof(TYPE)), GFP)+	ALLOC_OBJS(TYPE, COUNT, GFP)|-	ALLOC_ARRAY((sizeof(E)), COUNT, GFP)+	ALLOC_OBJS(E, COUNT, GFP)|-	ALLOC_ARRAY((sizeof(TYPE)), COUNT, GFP)+	ALLOC_OBJS(TYPE, COUNT, GFP)|-	ALLOC(struct_size(VAR, FLEX, COUNT), GFP)+	ALLOC_FLEX(*VAR, FLEX, COUNT, GFP)|-	ALLOC(struct_size_t(TYPE, FLEX, COUNT), GFP)+	ALLOC_FLEX(TYPE, FLEX, COUNT, GFP)) @drop_gfp_kernel depends on patch && !(file in "tools") && !(file in "samples")@identifier ALLOC = {kmalloc_obj,kmalloc_objs,kmalloc_flex,		    kzalloc_obj,kzalloc_objs,kzalloc_flex,		    kvmalloc_obj,kvmalloc_objs,kvmalloc_flex,		    kvzalloc_obj,kvzalloc_objs,kvzalloc_flex};@@ 	ALLOC(...-		 , GFP_KERNEL	     )