Skip to content

Commit 54c9e00

Browse files
committed
nodemask: Switch from inline to __always_inline
'inline' keyword is only a recommendation for compiler. If it decides to not inline nodemask functions, the whole small_const_nbits() machinery doesn't work. This is how a standard GCC 11.3.0 does for my x86_64 build now. This patch replaces 'inline' directive with unconditional '__always_inline' to make sure that there's always a chance for compile-time optimization. It doesn't change size of kernel image, according to bloat-o-meter. [[ Brian: split out from: Subject: [PATCH 1/3] bitmap: switch from inline to __always_inline https://lore.kernel.org/all/[email protected]/ But rewritten, as there were too many conflicts. ]] Co-developed-by: Brian Norris <[email protected]> Signed-off-by: Brian Norris <[email protected]> Reviewed-by: Kees Cook <[email protected]> Reviewed-by: Nathan Chancellor <[email protected]> Signed-off-by: Yury Norov <[email protected]>
1 parent ab6b101 commit 54c9e00

File tree

1 file changed

+43
-43
lines changed

1 file changed

+43
-43
lines changed

include/linux/nodemask.h

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ extern nodemask_t _unused_nodemask_arg_;
107107
*/
108108
#define nodemask_pr_args(maskp) __nodemask_pr_numnodes(maskp), \
109109
__nodemask_pr_bits(maskp)
110-
static inline unsigned int __nodemask_pr_numnodes(const nodemask_t *m)
110+
static __always_inline unsigned int __nodemask_pr_numnodes(const nodemask_t *m)
111111
{
112112
return m ? MAX_NUMNODES : 0;
113113
}
114-
static inline const unsigned long *__nodemask_pr_bits(const nodemask_t *m)
114+
static __always_inline const unsigned long *__nodemask_pr_bits(const nodemask_t *m)
115115
{
116116
return m ? m->bits : NULL;
117117
}
@@ -132,19 +132,19 @@ static __always_inline void __node_set(int node, volatile nodemask_t *dstp)
132132
}
133133

134134
#define node_clear(node, dst) __node_clear((node), &(dst))
135-
static inline void __node_clear(int node, volatile nodemask_t *dstp)
135+
static __always_inline void __node_clear(int node, volatile nodemask_t *dstp)
136136
{
137137
clear_bit(node, dstp->bits);
138138
}
139139

140140
#define nodes_setall(dst) __nodes_setall(&(dst), MAX_NUMNODES)
141-
static inline void __nodes_setall(nodemask_t *dstp, unsigned int nbits)
141+
static __always_inline void __nodes_setall(nodemask_t *dstp, unsigned int nbits)
142142
{
143143
bitmap_fill(dstp->bits, nbits);
144144
}
145145

146146
#define nodes_clear(dst) __nodes_clear(&(dst), MAX_NUMNODES)
147-
static inline void __nodes_clear(nodemask_t *dstp, unsigned int nbits)
147+
static __always_inline void __nodes_clear(nodemask_t *dstp, unsigned int nbits)
148148
{
149149
bitmap_zero(dstp->bits, nbits);
150150
}
@@ -154,104 +154,104 @@ static inline void __nodes_clear(nodemask_t *dstp, unsigned int nbits)
154154

155155
#define node_test_and_set(node, nodemask) \
156156
__node_test_and_set((node), &(nodemask))
157-
static inline bool __node_test_and_set(int node, nodemask_t *addr)
157+
static __always_inline bool __node_test_and_set(int node, nodemask_t *addr)
158158
{
159159
return test_and_set_bit(node, addr->bits);
160160
}
161161

162162
#define nodes_and(dst, src1, src2) \
163163
__nodes_and(&(dst), &(src1), &(src2), MAX_NUMNODES)
164-
static inline void __nodes_and(nodemask_t *dstp, const nodemask_t *src1p,
164+
static __always_inline void __nodes_and(nodemask_t *dstp, const nodemask_t *src1p,
165165
const nodemask_t *src2p, unsigned int nbits)
166166
{
167167
bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
168168
}
169169

170170
#define nodes_or(dst, src1, src2) \
171171
__nodes_or(&(dst), &(src1), &(src2), MAX_NUMNODES)
172-
static inline void __nodes_or(nodemask_t *dstp, const nodemask_t *src1p,
172+
static __always_inline void __nodes_or(nodemask_t *dstp, const nodemask_t *src1p,
173173
const nodemask_t *src2p, unsigned int nbits)
174174
{
175175
bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits);
176176
}
177177

178178
#define nodes_xor(dst, src1, src2) \
179179
__nodes_xor(&(dst), &(src1), &(src2), MAX_NUMNODES)
180-
static inline void __nodes_xor(nodemask_t *dstp, const nodemask_t *src1p,
180+
static __always_inline void __nodes_xor(nodemask_t *dstp, const nodemask_t *src1p,
181181
const nodemask_t *src2p, unsigned int nbits)
182182
{
183183
bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits);
184184
}
185185

186186
#define nodes_andnot(dst, src1, src2) \
187187
__nodes_andnot(&(dst), &(src1), &(src2), MAX_NUMNODES)
188-
static inline void __nodes_andnot(nodemask_t *dstp, const nodemask_t *src1p,
188+
static __always_inline void __nodes_andnot(nodemask_t *dstp, const nodemask_t *src1p,
189189
const nodemask_t *src2p, unsigned int nbits)
190190
{
191191
bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
192192
}
193193

194194
#define nodes_complement(dst, src) \
195195
__nodes_complement(&(dst), &(src), MAX_NUMNODES)
196-
static inline void __nodes_complement(nodemask_t *dstp,
196+
static __always_inline void __nodes_complement(nodemask_t *dstp,
197197
const nodemask_t *srcp, unsigned int nbits)
198198
{
199199
bitmap_complement(dstp->bits, srcp->bits, nbits);
200200
}
201201

202202
#define nodes_equal(src1, src2) \
203203
__nodes_equal(&(src1), &(src2), MAX_NUMNODES)
204-
static inline bool __nodes_equal(const nodemask_t *src1p,
204+
static __always_inline bool __nodes_equal(const nodemask_t *src1p,
205205
const nodemask_t *src2p, unsigned int nbits)
206206
{
207207
return bitmap_equal(src1p->bits, src2p->bits, nbits);
208208
}
209209

210210
#define nodes_intersects(src1, src2) \
211211
__nodes_intersects(&(src1), &(src2), MAX_NUMNODES)
212-
static inline bool __nodes_intersects(const nodemask_t *src1p,
212+
static __always_inline bool __nodes_intersects(const nodemask_t *src1p,
213213
const nodemask_t *src2p, unsigned int nbits)
214214
{
215215
return bitmap_intersects(src1p->bits, src2p->bits, nbits);
216216
}
217217

218218
#define nodes_subset(src1, src2) \
219219
__nodes_subset(&(src1), &(src2), MAX_NUMNODES)
220-
static inline bool __nodes_subset(const nodemask_t *src1p,
220+
static __always_inline bool __nodes_subset(const nodemask_t *src1p,
221221
const nodemask_t *src2p, unsigned int nbits)
222222
{
223223
return bitmap_subset(src1p->bits, src2p->bits, nbits);
224224
}
225225

226226
#define nodes_empty(src) __nodes_empty(&(src), MAX_NUMNODES)
227-
static inline bool __nodes_empty(const nodemask_t *srcp, unsigned int nbits)
227+
static __always_inline bool __nodes_empty(const nodemask_t *srcp, unsigned int nbits)
228228
{
229229
return bitmap_empty(srcp->bits, nbits);
230230
}
231231

232232
#define nodes_full(nodemask) __nodes_full(&(nodemask), MAX_NUMNODES)
233-
static inline bool __nodes_full(const nodemask_t *srcp, unsigned int nbits)
233+
static __always_inline bool __nodes_full(const nodemask_t *srcp, unsigned int nbits)
234234
{
235235
return bitmap_full(srcp->bits, nbits);
236236
}
237237

238238
#define nodes_weight(nodemask) __nodes_weight(&(nodemask), MAX_NUMNODES)
239-
static inline int __nodes_weight(const nodemask_t *srcp, unsigned int nbits)
239+
static __always_inline int __nodes_weight(const nodemask_t *srcp, unsigned int nbits)
240240
{
241241
return bitmap_weight(srcp->bits, nbits);
242242
}
243243

244244
#define nodes_shift_right(dst, src, n) \
245245
__nodes_shift_right(&(dst), &(src), (n), MAX_NUMNODES)
246-
static inline void __nodes_shift_right(nodemask_t *dstp,
246+
static __always_inline void __nodes_shift_right(nodemask_t *dstp,
247247
const nodemask_t *srcp, int n, int nbits)
248248
{
249249
bitmap_shift_right(dstp->bits, srcp->bits, n, nbits);
250250
}
251251

252252
#define nodes_shift_left(dst, src, n) \
253253
__nodes_shift_left(&(dst), &(src), (n), MAX_NUMNODES)
254-
static inline void __nodes_shift_left(nodemask_t *dstp,
254+
static __always_inline void __nodes_shift_left(nodemask_t *dstp,
255255
const nodemask_t *srcp, int n, int nbits)
256256
{
257257
bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);
@@ -261,13 +261,13 @@ static inline void __nodes_shift_left(nodemask_t *dstp,
261261
> MAX_NUMNODES, then the silly min_ts could be dropped. */
262262

263263
#define first_node(src) __first_node(&(src))
264-
static inline unsigned int __first_node(const nodemask_t *srcp)
264+
static __always_inline unsigned int __first_node(const nodemask_t *srcp)
265265
{
266266
return min_t(unsigned int, MAX_NUMNODES, find_first_bit(srcp->bits, MAX_NUMNODES));
267267
}
268268

269269
#define next_node(n, src) __next_node((n), &(src))
270-
static inline unsigned int __next_node(int n, const nodemask_t *srcp)
270+
static __always_inline unsigned int __next_node(int n, const nodemask_t *srcp)
271271
{
272272
return min_t(unsigned int, MAX_NUMNODES, find_next_bit(srcp->bits, MAX_NUMNODES, n+1));
273273
}
@@ -277,7 +277,7 @@ static inline unsigned int __next_node(int n, const nodemask_t *srcp)
277277
* the first node in src if needed. Returns MAX_NUMNODES if src is empty.
278278
*/
279279
#define next_node_in(n, src) __next_node_in((n), &(src))
280-
static inline unsigned int __next_node_in(int node, const nodemask_t *srcp)
280+
static __always_inline unsigned int __next_node_in(int node, const nodemask_t *srcp)
281281
{
282282
unsigned int ret = __next_node(node, srcp);
283283

@@ -286,7 +286,7 @@ static inline unsigned int __next_node_in(int node, const nodemask_t *srcp)
286286
return ret;
287287
}
288288

289-
static inline void init_nodemask_of_node(nodemask_t *mask, int node)
289+
static __always_inline void init_nodemask_of_node(nodemask_t *mask, int node)
290290
{
291291
nodes_clear(*mask);
292292
node_set(node, *mask);
@@ -304,7 +304,7 @@ static inline void init_nodemask_of_node(nodemask_t *mask, int node)
304304
})
305305

306306
#define first_unset_node(mask) __first_unset_node(&(mask))
307-
static inline unsigned int __first_unset_node(const nodemask_t *maskp)
307+
static __always_inline unsigned int __first_unset_node(const nodemask_t *maskp)
308308
{
309309
return min_t(unsigned int, MAX_NUMNODES,
310310
find_first_zero_bit(maskp->bits, MAX_NUMNODES));
@@ -338,45 +338,45 @@ static inline unsigned int __first_unset_node(const nodemask_t *maskp)
338338

339339
#define nodemask_parse_user(ubuf, ulen, dst) \
340340
__nodemask_parse_user((ubuf), (ulen), &(dst), MAX_NUMNODES)
341-
static inline int __nodemask_parse_user(const char __user *buf, int len,
341+
static __always_inline int __nodemask_parse_user(const char __user *buf, int len,
342342
nodemask_t *dstp, int nbits)
343343
{
344344
return bitmap_parse_user(buf, len, dstp->bits, nbits);
345345
}
346346

347347
#define nodelist_parse(buf, dst) __nodelist_parse((buf), &(dst), MAX_NUMNODES)
348-
static inline int __nodelist_parse(const char *buf, nodemask_t *dstp, int nbits)
348+
static __always_inline int __nodelist_parse(const char *buf, nodemask_t *dstp, int nbits)
349349
{
350350
return bitmap_parselist(buf, dstp->bits, nbits);
351351
}
352352

353353
#define node_remap(oldbit, old, new) \
354354
__node_remap((oldbit), &(old), &(new), MAX_NUMNODES)
355-
static inline int __node_remap(int oldbit,
355+
static __always_inline int __node_remap(int oldbit,
356356
const nodemask_t *oldp, const nodemask_t *newp, int nbits)
357357
{
358358
return bitmap_bitremap(oldbit, oldp->bits, newp->bits, nbits);
359359
}
360360

361361
#define nodes_remap(dst, src, old, new) \
362362
__nodes_remap(&(dst), &(src), &(old), &(new), MAX_NUMNODES)
363-
static inline void __nodes_remap(nodemask_t *dstp, const nodemask_t *srcp,
363+
static __always_inline void __nodes_remap(nodemask_t *dstp, const nodemask_t *srcp,
364364
const nodemask_t *oldp, const nodemask_t *newp, int nbits)
365365
{
366366
bitmap_remap(dstp->bits, srcp->bits, oldp->bits, newp->bits, nbits);
367367
}
368368

369369
#define nodes_onto(dst, orig, relmap) \
370370
__nodes_onto(&(dst), &(orig), &(relmap), MAX_NUMNODES)
371-
static inline void __nodes_onto(nodemask_t *dstp, const nodemask_t *origp,
371+
static __always_inline void __nodes_onto(nodemask_t *dstp, const nodemask_t *origp,
372372
const nodemask_t *relmapp, int nbits)
373373
{
374374
bitmap_onto(dstp->bits, origp->bits, relmapp->bits, nbits);
375375
}
376376

377377
#define nodes_fold(dst, orig, sz) \
378378
__nodes_fold(&(dst), &(orig), sz, MAX_NUMNODES)
379-
static inline void __nodes_fold(nodemask_t *dstp, const nodemask_t *origp,
379+
static __always_inline void __nodes_fold(nodemask_t *dstp, const nodemask_t *origp,
380380
int sz, int nbits)
381381
{
382382
bitmap_fold(dstp->bits, origp->bits, sz, nbits);
@@ -418,22 +418,22 @@ enum node_states {
418418
extern nodemask_t node_states[NR_NODE_STATES];
419419

420420
#if MAX_NUMNODES > 1
421-
static inline int node_state(int node, enum node_states state)
421+
static __always_inline int node_state(int node, enum node_states state)
422422
{
423423
return node_isset(node, node_states[state]);
424424
}
425425

426-
static inline void node_set_state(int node, enum node_states state)
426+
static __always_inline void node_set_state(int node, enum node_states state)
427427
{
428428
__node_set(node, &node_states[state]);
429429
}
430430

431-
static inline void node_clear_state(int node, enum node_states state)
431+
static __always_inline void node_clear_state(int node, enum node_states state)
432432
{
433433
__node_clear(node, &node_states[state]);
434434
}
435435

436-
static inline int num_node_state(enum node_states state)
436+
static __always_inline int num_node_state(enum node_states state)
437437
{
438438
return nodes_weight(node_states[state]);
439439
}
@@ -443,46 +443,46 @@ static inline int num_node_state(enum node_states state)
443443

444444
#define first_online_node first_node(node_states[N_ONLINE])
445445
#define first_memory_node first_node(node_states[N_MEMORY])
446-
static inline unsigned int next_online_node(int nid)
446+
static __always_inline unsigned int next_online_node(int nid)
447447
{
448448
return next_node(nid, node_states[N_ONLINE]);
449449
}
450-
static inline unsigned int next_memory_node(int nid)
450+
static __always_inline unsigned int next_memory_node(int nid)
451451
{
452452
return next_node(nid, node_states[N_MEMORY]);
453453
}
454454

455455
extern unsigned int nr_node_ids;
456456
extern unsigned int nr_online_nodes;
457457

458-
static inline void node_set_online(int nid)
458+
static __always_inline void node_set_online(int nid)
459459
{
460460
node_set_state(nid, N_ONLINE);
461461
nr_online_nodes = num_node_state(N_ONLINE);
462462
}
463463

464-
static inline void node_set_offline(int nid)
464+
static __always_inline void node_set_offline(int nid)
465465
{
466466
node_clear_state(nid, N_ONLINE);
467467
nr_online_nodes = num_node_state(N_ONLINE);
468468
}
469469

470470
#else
471471

472-
static inline int node_state(int node, enum node_states state)
472+
static __always_inline int node_state(int node, enum node_states state)
473473
{
474474
return node == 0;
475475
}
476476

477-
static inline void node_set_state(int node, enum node_states state)
477+
static __always_inline void node_set_state(int node, enum node_states state)
478478
{
479479
}
480480

481-
static inline void node_clear_state(int node, enum node_states state)
481+
static __always_inline void node_clear_state(int node, enum node_states state)
482482
{
483483
}
484484

485-
static inline int num_node_state(enum node_states state)
485+
static __always_inline int num_node_state(enum node_states state)
486486
{
487487
return 1;
488488
}
@@ -502,7 +502,7 @@ static inline int num_node_state(enum node_states state)
502502

503503
#endif
504504

505-
static inline int node_random(const nodemask_t *maskp)
505+
static __always_inline int node_random(const nodemask_t *maskp)
506506
{
507507
#if defined(CONFIG_NUMA) && (MAX_NUMNODES > 1)
508508
int w, bit;

0 commit comments

Comments
 (0)