1 /* { dg-do compile } */
2 /* { dg-options "-O2 -w -fdump-tree-optimized" } */
3
4 extern void XYZZY (void);
5 typedef unsigned long __kernel_size_t;
6 typedef __kernel_size_t size_t;
7 typedef unsigned gfp_t;
8 struct per_cpu_pageset { } __attribute__ ((__aligned__ ((1 << (6)))));
9 struct zone { struct per_cpu_pageset *pageset[64]; }
10 zone_flags_t; typedef struct pglist_data { struct zone node_zones[4]; } pg_data_t;
11 extern struct pglist_data *first_online_pgdat (void);
12 extern struct zone *next_zone (struct zone *zone);
13 extern volatile int per_cpu__x86_cpu_to_node_map[];
14 struct kmem_cache { int size; };
15 extern struct kmem_cache kmalloc_caches[(12 + 2)];
16 struct tracepoint { void **funcs; } __attribute__ ((aligned (32)));
17 extern struct tracepoint __tracepoint_kmalloc_node;
18 void *__kmalloc_node (size_t size, gfp_t flags, int node);
19
20 static inline int
cpu_to_node(int cpu)21 cpu_to_node (int cpu)
22 {
23 return per_cpu__x86_cpu_to_node_map[cpu];
24 }
25
26 static inline void
trace_kmalloc_node(unsigned long call_site,const void * ptr,size_t bytes_req,size_t bytes_alloc,gfp_t gfp_flags,int node)27 trace_kmalloc_node (unsigned long call_site, const void *ptr,
28 size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags,
29 int node)
30 {
31 asm goto ("" : : : : trace_label);
32 if (0)
33 {
34 void **it_func;
35 trace_label:
36 asm ("" : "=r"(it_func) : "0"(&__tracepoint_kmalloc_node.funcs));
37 }
38 };
39
40 static inline __attribute__ ((always_inline)) int
kmalloc_index(size_t size)41 kmalloc_index (size_t size)
42 {
43 if (size <= 64)
44 return 6;
45 return -1;
46 }
47
48 static inline __attribute__ ((always_inline)) struct kmem_cache *
kmalloc_slab(size_t size)49 kmalloc_slab (size_t size)
50 {
51 int index = kmalloc_index (size);
52 if (index == 0)
53 return ((void *) 0);
54 return &kmalloc_caches[index];
55 }
56
57 static inline __attribute__ ((always_inline)) void *
kmalloc_node(size_t size,gfp_t flags,int node)58 kmalloc_node (size_t size, gfp_t flags, int node)
59 {
60 void *ret;
61 if (__builtin_constant_p (size) && size <= (2 * ((1UL) << 12))
62 && !(flags & ((gfp_t) 0x01u)))
63 {
64 struct kmem_cache *s = kmalloc_slab (size);
65 if (!s)
66 return ((void *) 16);
67 trace_kmalloc_node (({ __here:(unsigned long) &&__here;}),
68 ret, size, s->size, flags, node);
69 }
70 return __kmalloc_node (size, flags, node);
71 }
72
73 int
process_zones(int cpu)74 process_zones (int cpu)
75 {
76 struct zone *zone, *dzone;
77 int node = cpu_to_node (cpu);
78 for (zone = (first_online_pgdat ())->node_zones;
79 zone; zone = next_zone (zone))
80 {
81 ((zone)->pageset[(cpu)]) =
82 kmalloc_node (sizeof (struct per_cpu_pageset),
83 (((gfp_t) 0x10u) | ((gfp_t) 0x40u) | ((gfp_t) 0x80u)),
84 node);
85 if (!((zone)->pageset[(cpu)]))
86 goto bad;
87 }
88 return 0;
89 bad:
90 XYZZY ();
91 return -12;
92 }
93
94 /* { dg-final { scan-tree-dump-times "XYZZY" 1 "optimized" } } */
95