diff options
| author | Kees Cook <keescook@chromium.org> | 2018-06-12 17:03:40 -0400 |
|---|---|---|
| committer | Kees Cook <keescook@chromium.org> | 2018-06-12 19:19:22 -0400 |
| commit | 6396bb221514d2876fd6dc0aa2a1f240d99b37bb (patch) | |
| tree | c5c501e859b93de096b1f01160135612ed765059 /kernel | |
| parent | 6da2ec56059c3c7a7e5f729e6349e74ace1e5c57 (diff) | |
treewide: kzalloc() -> kcalloc()
The kzalloc() function has a 2-factor argument form, kcalloc(). This
patch replaces cases of:
kzalloc(a * b, gfp)
with:
kcalloc(a * b, gfp)
as well as handling cases of:
kzalloc(a * b * c, gfp)
with:
kzalloc(array3_size(a, b, c), gfp)
as it's slightly less ugly than:
kzalloc_array(array_size(a, b), c, gfp)
This does, however, attempt to ignore constant size factors like:
kzalloc(4 * 1024, gfp)
though any constants defined via macros get caught up in the conversion.
Any factors with a sizeof() of "unsigned char", "char", and "u8" were
dropped, since they're redundant.
The Coccinelle script used for this was:
// Fix redundant parens around sizeof().
@@
type TYPE;
expression THING, E;
@@
(
kzalloc(
- (sizeof(TYPE)) * E
+ sizeof(TYPE) * E
, ...)
|
kzalloc(
- (sizeof(THING)) * E
+ sizeof(THING) * E
, ...)
)
// Drop single-byte sizes and redundant parens.
@@
expression COUNT;
typedef u8;
typedef __u8;
@@
(
kzalloc(
- sizeof(u8) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(__u8) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(char) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(unsigned char) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(u8) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(__u8) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(char) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(unsigned char) * COUNT
+ COUNT
, ...)
)
// 2-factor product with sizeof(type/expression) and identifier or constant.
@@
type TYPE;
expression THING;
identifier COUNT_ID;
constant COUNT_CONST;
@@
(
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (COUNT_ID)
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * COUNT_ID
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (COUNT_CONST)
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * COUNT_CONST
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (COUNT_ID)
+ COUNT_ID, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * COUNT_ID
+ COUNT_ID, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (COUNT_CONST)
+ COUNT_CONST, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * COUNT_CONST
+ COUNT_CONST, sizeof(THING)
, ...)
)
// 2-factor product, only identifiers.
@@
identifier SIZE, COUNT;
@@
- kzalloc
+ kcalloc
(
- SIZE * COUNT
+ COUNT, SIZE
, ...)
// 3-factor product with 1 sizeof(type) or sizeof(expression), with
// redundant parens removed.
@@
expression THING;
identifier STRIDE, COUNT;
type TYPE;
@@
(
kzalloc(
- sizeof(TYPE) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(THING) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
)
// 3-factor product with 2 sizeof(variable), with redundant parens removed.
@@
expression THING1, THING2;
identifier COUNT;
type TYPE1, TYPE2;
@@
(
kzalloc(
- sizeof(TYPE1) * sizeof(TYPE2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
kzalloc(
- sizeof(THING1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(THING1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
)
// 3-factor product, only identifiers, with redundant parens removed.
@@
identifier STRIDE, SIZE, COUNT;
@@
(
kzalloc(
- (COUNT) * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
)
// Any remaining multi-factor products, first at least 3-factor products,
// when they're not all constants...
@@
expression E1, E2, E3;
constant C1, C2, C3;
@@
(
kzalloc(C1 * C2 * C3, ...)
|
kzalloc(
- (E1) * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- (E1) * (E2) * E3
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- (E1) * (E2) * (E3)
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- E1 * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
)
// And then all remaining 2 factors products when they're not all constants,
// keeping sizeof() as the second factor argument.
@@
expression THING, E1, E2;
type TYPE;
constant C1, C2, C3;
@@
(
kzalloc(sizeof(THING) * C2, ...)
|
kzalloc(sizeof(TYPE) * C2, ...)
|
kzalloc(C1 * C2 * C3, ...)
|
kzalloc(C1 * C2, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (E2)
+ E2, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * E2
+ E2, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (E2)
+ E2, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * E2
+ E2, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- (E1) * E2
+ E1, E2
, ...)
|
- kzalloc
+ kcalloc
(
- (E1) * (E2)
+ E1, E2
, ...)
|
- kzalloc
+ kcalloc
(
- E1 * E2
+ E1, E2
, ...)
)
Signed-off-by: Kees Cook <keescook@chromium.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/bpf/verifier.c | 2 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_main.c | 2 | ||||
| -rw-r--r-- | kernel/events/uprobes.c | 3 | ||||
| -rw-r--r-- | kernel/locking/locktorture.c | 6 | ||||
| -rw-r--r-- | kernel/sched/fair.c | 4 | ||||
| -rw-r--r-- | kernel/sched/rt.c | 4 | ||||
| -rw-r--r-- | kernel/sysctl.c | 3 | ||||
| -rw-r--r-- | kernel/trace/ftrace.c | 2 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 3 | ||||
| -rw-r--r-- | kernel/workqueue.c | 2 |
10 files changed, 18 insertions, 13 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index cced0c1e63e2..1494e087890e 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c | |||
| @@ -5447,7 +5447,7 @@ static int jit_subprogs(struct bpf_verifier_env *env) | |||
| 5447 | insn->imm = 1; | 5447 | insn->imm = 1; |
| 5448 | } | 5448 | } |
| 5449 | 5449 | ||
| 5450 | func = kzalloc(sizeof(prog) * env->subprog_cnt, GFP_KERNEL); | 5450 | func = kcalloc(env->subprog_cnt, sizeof(prog), GFP_KERNEL); |
| 5451 | if (!func) | 5451 | if (!func) |
| 5452 | return -ENOMEM; | 5452 | return -ENOMEM; |
| 5453 | 5453 | ||
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index aaa69531fae2..2ddfce8f1e8f 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c | |||
| @@ -691,7 +691,7 @@ static int kdb_defcmd2(const char *cmdstr, const char *argv0) | |||
| 691 | } | 691 | } |
| 692 | if (!s->usable) | 692 | if (!s->usable) |
| 693 | return KDB_NOTIMP; | 693 | return KDB_NOTIMP; |
| 694 | s->command = kzalloc((s->count + 1) * sizeof(*(s->command)), GFP_KDB); | 694 | s->command = kcalloc(s->count + 1, sizeof(*(s->command)), GFP_KDB); |
| 695 | if (!s->command) { | 695 | if (!s->command) { |
| 696 | kdb_printf("Could not allocate new kdb_defcmd table for %s\n", | 696 | kdb_printf("Could not allocate new kdb_defcmd table for %s\n", |
| 697 | cmdstr); | 697 | cmdstr); |
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 1725b902983f..ccc579a7d32e 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c | |||
| @@ -1184,7 +1184,8 @@ static struct xol_area *__create_xol_area(unsigned long vaddr) | |||
| 1184 | if (unlikely(!area)) | 1184 | if (unlikely(!area)) |
| 1185 | goto out; | 1185 | goto out; |
| 1186 | 1186 | ||
| 1187 | area->bitmap = kzalloc(BITS_TO_LONGS(UINSNS_PER_PAGE) * sizeof(long), GFP_KERNEL); | 1187 | area->bitmap = kcalloc(BITS_TO_LONGS(UINSNS_PER_PAGE), sizeof(long), |
| 1188 | GFP_KERNEL); | ||
| 1188 | if (!area->bitmap) | 1189 | if (!area->bitmap) |
| 1189 | goto free_area; | 1190 | goto free_area; |
| 1190 | 1191 | ||
diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c index 4ceeb13a74ed..8402b3349dca 100644 --- a/kernel/locking/locktorture.c +++ b/kernel/locking/locktorture.c | |||
| @@ -989,7 +989,8 @@ static int __init lock_torture_init(void) | |||
| 989 | } | 989 | } |
| 990 | 990 | ||
| 991 | if (nwriters_stress) { | 991 | if (nwriters_stress) { |
| 992 | writer_tasks = kzalloc(cxt.nrealwriters_stress * sizeof(writer_tasks[0]), | 992 | writer_tasks = kcalloc(cxt.nrealwriters_stress, |
| 993 | sizeof(writer_tasks[0]), | ||
| 993 | GFP_KERNEL); | 994 | GFP_KERNEL); |
| 994 | if (writer_tasks == NULL) { | 995 | if (writer_tasks == NULL) { |
| 995 | VERBOSE_TOROUT_ERRSTRING("writer_tasks: Out of memory"); | 996 | VERBOSE_TOROUT_ERRSTRING("writer_tasks: Out of memory"); |
| @@ -999,7 +1000,8 @@ static int __init lock_torture_init(void) | |||
| 999 | } | 1000 | } |
| 1000 | 1001 | ||
| 1001 | if (cxt.cur_ops->readlock) { | 1002 | if (cxt.cur_ops->readlock) { |
| 1002 | reader_tasks = kzalloc(cxt.nrealreaders_stress * sizeof(reader_tasks[0]), | 1003 | reader_tasks = kcalloc(cxt.nrealreaders_stress, |
| 1004 | sizeof(reader_tasks[0]), | ||
| 1003 | GFP_KERNEL); | 1005 | GFP_KERNEL); |
| 1004 | if (reader_tasks == NULL) { | 1006 | if (reader_tasks == NULL) { |
| 1005 | VERBOSE_TOROUT_ERRSTRING("reader_tasks: Out of memory"); | 1007 | VERBOSE_TOROUT_ERRSTRING("reader_tasks: Out of memory"); |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index e497c05aab7f..1866e64792a7 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -10215,10 +10215,10 @@ int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent) | |||
| 10215 | struct cfs_rq *cfs_rq; | 10215 | struct cfs_rq *cfs_rq; |
| 10216 | int i; | 10216 | int i; |
| 10217 | 10217 | ||
| 10218 | tg->cfs_rq = kzalloc(sizeof(cfs_rq) * nr_cpu_ids, GFP_KERNEL); | 10218 | tg->cfs_rq = kcalloc(nr_cpu_ids, sizeof(cfs_rq), GFP_KERNEL); |
| 10219 | if (!tg->cfs_rq) | 10219 | if (!tg->cfs_rq) |
| 10220 | goto err; | 10220 | goto err; |
| 10221 | tg->se = kzalloc(sizeof(se) * nr_cpu_ids, GFP_KERNEL); | 10221 | tg->se = kcalloc(nr_cpu_ids, sizeof(se), GFP_KERNEL); |
| 10222 | if (!tg->se) | 10222 | if (!tg->se) |
| 10223 | goto err; | 10223 | goto err; |
| 10224 | 10224 | ||
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index ef3c4e6f5345..47556b0c9a95 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
| @@ -183,10 +183,10 @@ int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent) | |||
| 183 | struct sched_rt_entity *rt_se; | 183 | struct sched_rt_entity *rt_se; |
| 184 | int i; | 184 | int i; |
| 185 | 185 | ||
| 186 | tg->rt_rq = kzalloc(sizeof(rt_rq) * nr_cpu_ids, GFP_KERNEL); | 186 | tg->rt_rq = kcalloc(nr_cpu_ids, sizeof(rt_rq), GFP_KERNEL); |
| 187 | if (!tg->rt_rq) | 187 | if (!tg->rt_rq) |
| 188 | goto err; | 188 | goto err; |
| 189 | tg->rt_se = kzalloc(sizeof(rt_se) * nr_cpu_ids, GFP_KERNEL); | 189 | tg->rt_se = kcalloc(nr_cpu_ids, sizeof(rt_se), GFP_KERNEL); |
| 190 | if (!tg->rt_se) | 190 | if (!tg->rt_se) |
| 191 | goto err; | 191 | goto err; |
| 192 | 192 | ||
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 6a78cf70761d..2d9837c0aff4 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -3047,7 +3047,8 @@ int proc_do_large_bitmap(struct ctl_table *table, int write, | |||
| 3047 | if (IS_ERR(kbuf)) | 3047 | if (IS_ERR(kbuf)) |
| 3048 | return PTR_ERR(kbuf); | 3048 | return PTR_ERR(kbuf); |
| 3049 | 3049 | ||
| 3050 | tmp_bitmap = kzalloc(BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long), | 3050 | tmp_bitmap = kcalloc(BITS_TO_LONGS(bitmap_len), |
| 3051 | sizeof(unsigned long), | ||
| 3051 | GFP_KERNEL); | 3052 | GFP_KERNEL); |
| 3052 | if (!tmp_bitmap) { | 3053 | if (!tmp_bitmap) { |
| 3053 | kfree(kbuf); | 3054 | kfree(kbuf); |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index df4b6254f986..efed9c1cfb7e 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -728,7 +728,7 @@ static int ftrace_profile_init_cpu(int cpu) | |||
| 728 | */ | 728 | */ |
| 729 | size = FTRACE_PROFILE_HASH_SIZE; | 729 | size = FTRACE_PROFILE_HASH_SIZE; |
| 730 | 730 | ||
| 731 | stat->hash = kzalloc(sizeof(struct hlist_head) * size, GFP_KERNEL); | 731 | stat->hash = kcalloc(size, sizeof(struct hlist_head), GFP_KERNEL); |
| 732 | 732 | ||
| 733 | if (!stat->hash) | 733 | if (!stat->hash) |
| 734 | return -ENOMEM; | 734 | return -ENOMEM; |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 8ea855015613..c9336e98ac59 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -4361,7 +4361,8 @@ int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled) | |||
| 4361 | 4361 | ||
| 4362 | if (mask == TRACE_ITER_RECORD_TGID) { | 4362 | if (mask == TRACE_ITER_RECORD_TGID) { |
| 4363 | if (!tgid_map) | 4363 | if (!tgid_map) |
| 4364 | tgid_map = kzalloc((PID_MAX_DEFAULT + 1) * sizeof(*tgid_map), | 4364 | tgid_map = kcalloc(PID_MAX_DEFAULT + 1, |
| 4365 | sizeof(*tgid_map), | ||
| 4365 | GFP_KERNEL); | 4366 | GFP_KERNEL); |
| 4366 | if (!tgid_map) { | 4367 | if (!tgid_map) { |
| 4367 | tr->trace_flags &= ~TRACE_ITER_RECORD_TGID; | 4368 | tr->trace_flags &= ~TRACE_ITER_RECORD_TGID; |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 465a28b4cd32..78b192071ef7 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -5638,7 +5638,7 @@ static void __init wq_numa_init(void) | |||
| 5638 | * available. Build one from cpu_to_node() which should have been | 5638 | * available. Build one from cpu_to_node() which should have been |
| 5639 | * fully initialized by now. | 5639 | * fully initialized by now. |
| 5640 | */ | 5640 | */ |
| 5641 | tbl = kzalloc(nr_node_ids * sizeof(tbl[0]), GFP_KERNEL); | 5641 | tbl = kcalloc(nr_node_ids, sizeof(tbl[0]), GFP_KERNEL); |
| 5642 | BUG_ON(!tbl); | 5642 | BUG_ON(!tbl); |
| 5643 | 5643 | ||
| 5644 | for_each_node(node) | 5644 | for_each_node(node) |
