| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- // 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
- )
|