11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ARCH_S390_PERCPU__
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __ARCH_S390_PERCPU__
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens#include <linux/preempt.h>
54c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens#include <asm/cmpxchg.h>
64c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * s390 uses its own implementation for per cpu data, the offset of
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the cpu local data area is cached in the cpu's lowcore memory.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
119a0ef2923abd2cc2c6f78d3663ac7af34c0220e8Tejun Heo#define __my_cpu_offset S390_lowcore.percpu_offset
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
130702fbf572ac5e513873628bf534da4a8a2025b4Heiko Carstens#ifdef CONFIG_64BIT
140702fbf572ac5e513873628bf534da4a8a2025b4Heiko Carstens
159a0ef2923abd2cc2c6f78d3663ac7af34c0220e8Tejun Heo/*
169a0ef2923abd2cc2c6f78d3663ac7af34c0220e8Tejun Heo * For 64 bit module code, the module may be more than 4G above the
179a0ef2923abd2cc2c6f78d3663ac7af34c0220e8Tejun Heo * per cpu area, use weak definitions to force the compiler to
189a0ef2923abd2cc2c6f78d3663ac7af34c0220e8Tejun Heo * generate external references.
199a0ef2923abd2cc2c6f78d3663ac7af34c0220e8Tejun Heo */
200702fbf572ac5e513873628bf534da4a8a2025b4Heiko Carstens#if defined(CONFIG_SMP) && defined(MODULE)
219a0ef2923abd2cc2c6f78d3663ac7af34c0220e8Tejun Heo#define ARCH_NEEDS_WEAK_PER_CPU
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
24f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens/*
25f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens * We use a compare-and-swap loop since that uses less cpu cycles than
26f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens * disabling and enabling interrupts like the generic variant would do.
27f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens */
28f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define arch_this_cpu_to_op_simple(pcp, val, op)			\
29ba6f5c2a8da8f7d6e14702d8c9b99b5767f6db49Heiko Carstens({									\
304c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	typedef typeof(pcp) pcp_op_T__;					\
314c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	pcp_op_T__ old__, new__, prev__;				\
324c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	pcp_op_T__ *ptr__;						\
334c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	preempt_disable();						\
34eb7e7d766326f70859046bfdb6277068c2461fe2Christoph Lameter	ptr__ = raw_cpu_ptr(&(pcp));					\
354c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	prev__ = *ptr__;						\
364c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	do {								\
374c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens		old__ = prev__;						\
384c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens		new__ = old__ op (val);					\
390702fbf572ac5e513873628bf534da4a8a2025b4Heiko Carstens		prev__ = cmpxchg(ptr__, old__, new__);			\
404c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	} while (prev__ != old__);					\
414c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	preempt_enable();						\
42ba6f5c2a8da8f7d6e14702d8c9b99b5767f6db49Heiko Carstens	new__;								\
43ba6f5c2a8da8f7d6e14702d8c9b99b5767f6db49Heiko Carstens})
444c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens
45f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_1(pcp, val)	arch_this_cpu_to_op_simple(pcp, val, +)
46f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_2(pcp, val)	arch_this_cpu_to_op_simple(pcp, val, +)
47f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_return_1(pcp, val) arch_this_cpu_to_op_simple(pcp, val, +)
48f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_return_2(pcp, val) arch_this_cpu_to_op_simple(pcp, val, +)
49f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_and_1(pcp, val)	arch_this_cpu_to_op_simple(pcp, val, &)
50f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_and_2(pcp, val)	arch_this_cpu_to_op_simple(pcp, val, &)
51f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_or_1(pcp, val)		arch_this_cpu_to_op_simple(pcp, val, |)
52f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_or_2(pcp, val)		arch_this_cpu_to_op_simple(pcp, val, |)
53f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
54f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#ifndef CONFIG_HAVE_MARCH_Z196_FEATURES
55f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
56f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_4(pcp, val)	arch_this_cpu_to_op_simple(pcp, val, +)
57f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_8(pcp, val)	arch_this_cpu_to_op_simple(pcp, val, +)
58f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_return_4(pcp, val) arch_this_cpu_to_op_simple(pcp, val, +)
59f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_return_8(pcp, val) arch_this_cpu_to_op_simple(pcp, val, +)
60f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_and_4(pcp, val)	arch_this_cpu_to_op_simple(pcp, val, &)
61f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_and_8(pcp, val)	arch_this_cpu_to_op_simple(pcp, val, &)
62f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_or_4(pcp, val)		arch_this_cpu_to_op_simple(pcp, val, |)
63f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_or_8(pcp, val)		arch_this_cpu_to_op_simple(pcp, val, |)
64f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
65f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#else /* CONFIG_HAVE_MARCH_Z196_FEATURES */
66f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
67f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define arch_this_cpu_add(pcp, val, op1, op2, szcast)			\
68f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens{									\
69f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	typedef typeof(pcp) pcp_op_T__; 				\
70f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	pcp_op_T__ val__ = (val);					\
71f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	pcp_op_T__ old__, *ptr__;					\
72f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	preempt_disable();						\
73eb7e7d766326f70859046bfdb6277068c2461fe2Christoph Lameter	ptr__ = raw_cpu_ptr(&(pcp)); 				\
74f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	if (__builtin_constant_p(val__) &&				\
75f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	    ((szcast)val__ > -129) && ((szcast)val__ < 128)) {		\
76f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		asm volatile(						\
77f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens			op2 "   %[ptr__],%[val__]\n"			\
78f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens			: [ptr__] "+Q" (*ptr__) 			\
79f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens			: [val__] "i" ((szcast)val__)			\
80f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens			: "cc");					\
81f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	} else {							\
82f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		asm volatile(						\
83f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens			op1 "   %[old__],%[val__],%[ptr__]\n"		\
84f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens			: [old__] "=d" (old__), [ptr__] "+Q" (*ptr__)	\
85f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens			: [val__] "d" (val__)				\
86f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens			: "cc");					\
87f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	}								\
88f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	preempt_enable();						\
89f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens}
90f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
91f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_4(pcp, val) arch_this_cpu_add(pcp, val, "laa", "asi", int)
92f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_8(pcp, val) arch_this_cpu_add(pcp, val, "laag", "agsi", long)
93f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
94f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define arch_this_cpu_add_return(pcp, val, op)				\
95f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens({									\
96f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	typedef typeof(pcp) pcp_op_T__; 				\
97f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	pcp_op_T__ val__ = (val);					\
98f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	pcp_op_T__ old__, *ptr__;					\
99f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	preempt_disable();						\
100eb7e7d766326f70859046bfdb6277068c2461fe2Christoph Lameter	ptr__ = raw_cpu_ptr(&(pcp));	 				\
101f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	asm volatile(							\
102f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		op "    %[old__],%[val__],%[ptr__]\n"			\
103f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		: [old__] "=d" (old__), [ptr__] "+Q" (*ptr__)		\
104f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		: [val__] "d" (val__)					\
105f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		: "cc");						\
106f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	preempt_enable();						\
107f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	old__ + val__;							\
108f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens})
109f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
110f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_return_4(pcp, val) arch_this_cpu_add_return(pcp, val, "laa")
111f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_add_return_8(pcp, val) arch_this_cpu_add_return(pcp, val, "laag")
112f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
113f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define arch_this_cpu_to_op(pcp, val, op)				\
114f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens{									\
115f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	typedef typeof(pcp) pcp_op_T__; 				\
116f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	pcp_op_T__ val__ = (val);					\
117f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	pcp_op_T__ old__, *ptr__;					\
118f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	preempt_disable();						\
119eb7e7d766326f70859046bfdb6277068c2461fe2Christoph Lameter	ptr__ = raw_cpu_ptr(&(pcp));	 				\
120f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	asm volatile(							\
121f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		op "    %[old__],%[val__],%[ptr__]\n"			\
122f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		: [old__] "=d" (old__), [ptr__] "+Q" (*ptr__)		\
123f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		: [val__] "d" (val__)					\
124f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens		: "cc");						\
125f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens	preempt_enable();						\
126f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens}
127f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
128f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_and_4(pcp, val)	arch_this_cpu_to_op(pcp, val, "lan")
129f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_and_8(pcp, val)	arch_this_cpu_to_op(pcp, val, "lang")
130f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_or_4(pcp, val)		arch_this_cpu_to_op(pcp, val, "lao")
131f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#define this_cpu_or_8(pcp, val)		arch_this_cpu_to_op(pcp, val, "laog")
132f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens
133f84cd97e5c61fe3ce66af838dd955dee02076639Heiko Carstens#endif /* CONFIG_HAVE_MARCH_Z196_FEATURES */
1344c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens
135b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens#define arch_this_cpu_cmpxchg(pcp, oval, nval)				\
1364c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens({									\
1374c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	typedef typeof(pcp) pcp_op_T__;					\
1384c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	pcp_op_T__ ret__;						\
1394c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	pcp_op_T__ *ptr__;						\
1404c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	preempt_disable();						\
141eb7e7d766326f70859046bfdb6277068c2461fe2Christoph Lameter	ptr__ = raw_cpu_ptr(&(pcp));					\
1420702fbf572ac5e513873628bf534da4a8a2025b4Heiko Carstens	ret__ = cmpxchg(ptr__, oval, nval);				\
1434c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	preempt_enable();						\
1444c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens	ret__;								\
1454c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens})
1464c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens
147933393f58fef9963eac61db8093689544e29a600Christoph Lameter#define this_cpu_cmpxchg_1(pcp, oval, nval) arch_this_cpu_cmpxchg(pcp, oval, nval)
148933393f58fef9963eac61db8093689544e29a600Christoph Lameter#define this_cpu_cmpxchg_2(pcp, oval, nval) arch_this_cpu_cmpxchg(pcp, oval, nval)
149933393f58fef9963eac61db8093689544e29a600Christoph Lameter#define this_cpu_cmpxchg_4(pcp, oval, nval) arch_this_cpu_cmpxchg(pcp, oval, nval)
150933393f58fef9963eac61db8093689544e29a600Christoph Lameter#define this_cpu_cmpxchg_8(pcp, oval, nval) arch_this_cpu_cmpxchg(pcp, oval, nval)
1514c2241fd42298007d7c3a92318806a4a9490a93cHeiko Carstens
15228634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens#define arch_this_cpu_xchg(pcp, nval)					\
15328634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens({									\
15428634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens	typeof(pcp) *ptr__;						\
15528634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens	typeof(pcp) ret__;						\
15628634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens	preempt_disable();						\
157eb7e7d766326f70859046bfdb6277068c2461fe2Christoph Lameter	ptr__ = raw_cpu_ptr(&(pcp));					\
15828634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens	ret__ = xchg(ptr__, nval);					\
15928634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens	preempt_enable();						\
16028634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens	ret__;								\
16128634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens})
16228634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens
16328634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens#define this_cpu_xchg_1(pcp, nval) arch_this_cpu_xchg(pcp, nval)
16428634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens#define this_cpu_xchg_2(pcp, nval) arch_this_cpu_xchg(pcp, nval)
16528634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens#define this_cpu_xchg_4(pcp, nval) arch_this_cpu_xchg(pcp, nval)
16628634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens#define this_cpu_xchg_8(pcp, nval) arch_this_cpu_xchg(pcp, nval)
16728634a07d3f72f2c186ad465e58f72e728c5cd4eHeiko Carstens
168b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens#define arch_this_cpu_cmpxchg_double(pcp1, pcp2, o1, o2, n1, n2)	\
169b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens({									\
170b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	typeof(pcp1) o1__ = (o1), n1__ = (n1);				\
171b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	typeof(pcp2) o2__ = (o2), n2__ = (n2);				\
172b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	typeof(pcp1) *p1__;						\
173b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	typeof(pcp2) *p2__;						\
174b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	int ret__;							\
175b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	preempt_disable();						\
176eb7e7d766326f70859046bfdb6277068c2461fe2Christoph Lameter	p1__ = raw_cpu_ptr(&(pcp1));					\
177eb7e7d766326f70859046bfdb6277068c2461fe2Christoph Lameter	p2__ = raw_cpu_ptr(&(pcp2));					\
178b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	ret__ = __cmpxchg_double(p1__, p2__, o1__, o2__, n1__, n2__);	\
179b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	preempt_enable();						\
180b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens	ret__;								\
181b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens})
182b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens
183b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens#define this_cpu_cmpxchg_double_4 arch_this_cpu_cmpxchg_double
184b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens#define this_cpu_cmpxchg_double_8 arch_this_cpu_cmpxchg_double
1850702fbf572ac5e513873628bf534da4a8a2025b4Heiko Carstens
1860702fbf572ac5e513873628bf534da4a8a2025b4Heiko Carstens#endif /* CONFIG_64BIT */
187b1d6b40cbd0d6ff475b6a0a7a807a1e3bee7c033Heiko Carstens
188f034347470e486835ccdcd7a5bb2ceb417be11c4travis@sgi.com#include <asm-generic/percpu.h>
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __ARCH_S390_PERCPU__ */
191