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