percpu.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. #ifndef _ASM_X86_PERCPU_H
  2. #define _ASM_X86_PERCPU_H
  3. #ifdef CONFIG_X86_64
  4. #define __percpu_seg gs
  5. #define __percpu_mov_op movq
  6. #else
  7. #define __percpu_seg fs
  8. #define __percpu_mov_op movl
  9. #endif
  10. #ifdef __ASSEMBLY__
  11. /*
  12. * PER_CPU finds an address of a per-cpu variable.
  13. *
  14. * Args:
  15. * var - variable name
  16. * reg - 32bit register
  17. *
  18. * The resulting address is stored in the "reg" argument.
  19. *
  20. * Example:
  21. * PER_CPU(cpu_gdt_descr, %ebx)
  22. */
  23. #ifdef CONFIG_SMP
  24. #define PER_CPU(var, reg) \
  25. __percpu_mov_op %__percpu_seg:this_cpu_off, reg; \
  26. lea var(reg), reg
  27. #define PER_CPU_VAR(var) %__percpu_seg:var
  28. #else /* ! SMP */
  29. #define PER_CPU(var, reg) __percpu_mov_op $var, reg
  30. #define PER_CPU_VAR(var) var
  31. #endif /* SMP */
  32. #ifdef CONFIG_X86_64_SMP
  33. #define INIT_PER_CPU_VAR(var) init_per_cpu__##var
  34. #else
  35. #define INIT_PER_CPU_VAR(var) var
  36. #endif
  37. #else /* ...!ASSEMBLY */
  38. #include <linux/kernel.h>
  39. #include <linux/stringify.h>
  40. #ifdef CONFIG_SMP
  41. #define __percpu_prefix "%%"__stringify(__percpu_seg)":"
  42. #define __my_cpu_offset this_cpu_read(this_cpu_off)
  43. /*
  44. * Compared to the generic __my_cpu_offset version, the following
  45. * saves one instruction and avoids clobbering a temp register.
  46. */
  47. #define __this_cpu_ptr(ptr) \
  48. ({ \
  49. unsigned long tcp_ptr__; \
  50. __verify_pcpu_ptr(ptr); \
  51. asm volatile("add " __percpu_arg(1) ", %0" \
  52. : "=r" (tcp_ptr__) \
  53. : "m" (this_cpu_off), "0" (ptr)); \
  54. (typeof(*(ptr)) __kernel __force *)tcp_ptr__; \
  55. })
  56. #else
  57. #define __percpu_prefix ""
  58. #endif
  59. #define __percpu_arg(x) __percpu_prefix "%P" #x
  60. /*
  61. * Initialized pointers to per-cpu variables needed for the boot
  62. * processor need to use these macros to get the proper address
  63. * offset from __per_cpu_load on SMP.
  64. *
  65. * There also must be an entry in vmlinux_64.lds.S
  66. */
  67. #define DECLARE_INIT_PER_CPU(var) \
  68. extern typeof(var) init_per_cpu_var(var)
  69. #ifdef CONFIG_X86_64_SMP
  70. #define init_per_cpu_var(var) init_per_cpu__##var
  71. #else
  72. #define init_per_cpu_var(var) var
  73. #endif
  74. /* For arch-specific code, we can use direct single-insn ops (they
  75. * don't give an lvalue though). */
  76. extern void __bad_percpu_size(void);
  77. #define percpu_to_op(op, var, val) \
  78. do { \
  79. typedef typeof(var) pto_T__; \
  80. if (0) { \
  81. pto_T__ pto_tmp__; \
  82. pto_tmp__ = (val); \
  83. (void)pto_tmp__; \
  84. } \
  85. switch (sizeof(var)) { \
  86. case 1: \
  87. asm(op "b %1,"__percpu_arg(0) \
  88. : "+m" (var) \
  89. : "qi" ((pto_T__)(val))); \
  90. break; \
  91. case 2: \
  92. asm(op "w %1,"__percpu_arg(0) \
  93. : "+m" (var) \
  94. : "ri" ((pto_T__)(val))); \
  95. break; \
  96. case 4: \
  97. asm(op "l %1,"__percpu_arg(0) \
  98. : "+m" (var) \
  99. : "ri" ((pto_T__)(val))); \
  100. break; \
  101. case 8: \
  102. asm(op "q %1,"__percpu_arg(0) \
  103. : "+m" (var) \
  104. : "re" ((pto_T__)(val))); \
  105. break; \
  106. default: __bad_percpu_size(); \
  107. } \
  108. } while (0)
  109. /*
  110. * Generate a percpu add to memory instruction and optimize code
  111. * if one is added or subtracted.
  112. */
  113. #define percpu_add_op(var, val) \
  114. do { \
  115. typedef typeof(var) pao_T__; \
  116. const int pao_ID__ = (__builtin_constant_p(val) && \
  117. ((val) == 1 || (val) == -1)) ? \
  118. (int)(val) : 0; \
  119. if (0) { \
  120. pao_T__ pao_tmp__; \
  121. pao_tmp__ = (val); \
  122. (void)pao_tmp__; \
  123. } \
  124. switch (sizeof(var)) { \
  125. case 1: \
  126. if (pao_ID__ == 1) \
  127. asm("incb "__percpu_arg(0) : "+m" (var)); \
  128. else if (pao_ID__ == -1) \
  129. asm("decb "__percpu_arg(0) : "+m" (var)); \
  130. else \
  131. asm("addb %1, "__percpu_arg(0) \
  132. : "+m" (var) \
  133. : "qi" ((pao_T__)(val))); \
  134. break; \
  135. case 2: \
  136. if (pao_ID__ == 1) \
  137. asm("incw "__percpu_arg(0) : "+m" (var)); \
  138. else if (pao_ID__ == -1) \
  139. asm("decw "__percpu_arg(0) : "+m" (var)); \
  140. else \
  141. asm("addw %1, "__percpu_arg(0) \
  142. : "+m" (var) \
  143. : "ri" ((pao_T__)(val))); \
  144. break; \
  145. case 4: \
  146. if (pao_ID__ == 1) \
  147. asm("incl "__percpu_arg(0) : "+m" (var)); \
  148. else if (pao_ID__ == -1) \
  149. asm("decl "__percpu_arg(0) : "+m" (var)); \
  150. else \
  151. asm("addl %1, "__percpu_arg(0) \
  152. : "+m" (var) \
  153. : "ri" ((pao_T__)(val))); \
  154. break; \
  155. case 8: \
  156. if (pao_ID__ == 1) \
  157. asm("incq "__percpu_arg(0) : "+m" (var)); \
  158. else if (pao_ID__ == -1) \
  159. asm("decq "__percpu_arg(0) : "+m" (var)); \
  160. else \
  161. asm("addq %1, "__percpu_arg(0) \
  162. : "+m" (var) \
  163. : "re" ((pao_T__)(val))); \
  164. break; \
  165. default: __bad_percpu_size(); \
  166. } \
  167. } while (0)
  168. #define percpu_from_op(op, var, constraint) \
  169. ({ \
  170. typeof(var) pfo_ret__; \
  171. switch (sizeof(var)) { \
  172. case 1: \
  173. asm(op "b "__percpu_arg(1)",%0" \
  174. : "=q" (pfo_ret__) \
  175. : constraint); \
  176. break; \
  177. case 2: \
  178. asm(op "w "__percpu_arg(1)",%0" \
  179. : "=r" (pfo_ret__) \
  180. : constraint); \
  181. break; \
  182. case 4: \
  183. asm(op "l "__percpu_arg(1)",%0" \
  184. : "=r" (pfo_ret__) \
  185. : constraint); \
  186. break; \
  187. case 8: \
  188. asm(op "q "__percpu_arg(1)",%0" \
  189. : "=r" (pfo_ret__) \
  190. : constraint); \
  191. break; \
  192. default: __bad_percpu_size(); \
  193. } \
  194. pfo_ret__; \
  195. })
  196. #define percpu_unary_op(op, var) \
  197. ({ \
  198. switch (sizeof(var)) { \
  199. case 1: \
  200. asm(op "b "__percpu_arg(0) \
  201. : "+m" (var)); \
  202. break; \
  203. case 2: \
  204. asm(op "w "__percpu_arg(0) \
  205. : "+m" (var)); \
  206. break; \
  207. case 4: \
  208. asm(op "l "__percpu_arg(0) \
  209. : "+m" (var)); \
  210. break; \
  211. case 8: \
  212. asm(op "q "__percpu_arg(0) \
  213. : "+m" (var)); \
  214. break; \
  215. default: __bad_percpu_size(); \
  216. } \
  217. })
  218. /*
  219. * Add return operation
  220. */
  221. #define percpu_add_return_op(var, val) \
  222. ({ \
  223. typeof(var) paro_ret__ = val; \
  224. switch (sizeof(var)) { \
  225. case 1: \
  226. asm("xaddb %0, "__percpu_arg(1) \
  227. : "+q" (paro_ret__), "+m" (var) \
  228. : : "memory"); \
  229. break; \
  230. case 2: \
  231. asm("xaddw %0, "__percpu_arg(1) \
  232. : "+r" (paro_ret__), "+m" (var) \
  233. : : "memory"); \
  234. break; \
  235. case 4: \
  236. asm("xaddl %0, "__percpu_arg(1) \
  237. : "+r" (paro_ret__), "+m" (var) \
  238. : : "memory"); \
  239. break; \
  240. case 8: \
  241. asm("xaddq %0, "__percpu_arg(1) \
  242. : "+re" (paro_ret__), "+m" (var) \
  243. : : "memory"); \
  244. break; \
  245. default: __bad_percpu_size(); \
  246. } \
  247. paro_ret__ += val; \
  248. paro_ret__; \
  249. })
  250. /*
  251. * xchg is implemented using cmpxchg without a lock prefix. xchg is
  252. * expensive due to the implied lock prefix. The processor cannot prefetch
  253. * cachelines if xchg is used.
  254. */
  255. #define percpu_xchg_op(var, nval) \
  256. ({ \
  257. typeof(var) pxo_ret__; \
  258. typeof(var) pxo_new__ = (nval); \
  259. switch (sizeof(var)) { \
  260. case 1: \
  261. asm("\n\tmov "__percpu_arg(1)",%%al" \
  262. "\n1:\tcmpxchgb %2, "__percpu_arg(1) \
  263. "\n\tjnz 1b" \
  264. : "=&a" (pxo_ret__), "+m" (var) \
  265. : "q" (pxo_new__) \
  266. : "memory"); \
  267. break; \
  268. case 2: \
  269. asm("\n\tmov "__percpu_arg(1)",%%ax" \
  270. "\n1:\tcmpxchgw %2, "__percpu_arg(1) \
  271. "\n\tjnz 1b" \
  272. : "=&a" (pxo_ret__), "+m" (var) \
  273. : "r" (pxo_new__) \
  274. : "memory"); \
  275. break; \
  276. case 4: \
  277. asm("\n\tmov "__percpu_arg(1)",%%eax" \
  278. "\n1:\tcmpxchgl %2, "__percpu_arg(1) \
  279. "\n\tjnz 1b" \
  280. : "=&a" (pxo_ret__), "+m" (var) \
  281. : "r" (pxo_new__) \
  282. : "memory"); \
  283. break; \
  284. case 8: \
  285. asm("\n\tmov "__percpu_arg(1)",%%rax" \
  286. "\n1:\tcmpxchgq %2, "__percpu_arg(1) \
  287. "\n\tjnz 1b" \
  288. : "=&a" (pxo_ret__), "+m" (var) \
  289. : "r" (pxo_new__) \
  290. : "memory"); \
  291. break; \
  292. default: __bad_percpu_size(); \
  293. } \
  294. pxo_ret__; \
  295. })
  296. /*
  297. * cmpxchg has no such implied lock semantics as a result it is much
  298. * more efficient for cpu local operations.
  299. */
  300. #define percpu_cmpxchg_op(var, oval, nval) \
  301. ({ \
  302. typeof(var) pco_ret__; \
  303. typeof(var) pco_old__ = (oval); \
  304. typeof(var) pco_new__ = (nval); \
  305. switch (sizeof(var)) { \
  306. case 1: \
  307. asm("cmpxchgb %2, "__percpu_arg(1) \
  308. : "=a" (pco_ret__), "+m" (var) \
  309. : "q" (pco_new__), "0" (pco_old__) \
  310. : "memory"); \
  311. break; \
  312. case 2: \
  313. asm("cmpxchgw %2, "__percpu_arg(1) \
  314. : "=a" (pco_ret__), "+m" (var) \
  315. : "r" (pco_new__), "0" (pco_old__) \
  316. : "memory"); \
  317. break; \
  318. case 4: \
  319. asm("cmpxchgl %2, "__percpu_arg(1) \
  320. : "=a" (pco_ret__), "+m" (var) \
  321. : "r" (pco_new__), "0" (pco_old__) \
  322. : "memory"); \
  323. break; \
  324. case 8: \
  325. asm("cmpxchgq %2, "__percpu_arg(1) \
  326. : "=a" (pco_ret__), "+m" (var) \
  327. : "r" (pco_new__), "0" (pco_old__) \
  328. : "memory"); \
  329. break; \
  330. default: __bad_percpu_size(); \
  331. } \
  332. pco_ret__; \
  333. })
  334. /*
  335. * this_cpu_read() makes gcc load the percpu variable every time it is
  336. * accessed while this_cpu_read_stable() allows the value to be cached.
  337. * this_cpu_read_stable() is more efficient and can be used if its value
  338. * is guaranteed to be valid across cpus. The current users include
  339. * get_current() and get_thread_info() both of which are actually
  340. * per-thread variables implemented as per-cpu variables and thus
  341. * stable for the duration of the respective task.
  342. */
  343. #define this_cpu_read_stable(var) percpu_from_op("mov", var, "p" (&(var)))
  344. #define __this_cpu_read_1(pcp) percpu_from_op("mov", (pcp), "m"(pcp))
  345. #define __this_cpu_read_2(pcp) percpu_from_op("mov", (pcp), "m"(pcp))
  346. #define __this_cpu_read_4(pcp) percpu_from_op("mov", (pcp), "m"(pcp))
  347. #define __this_cpu_write_1(pcp, val) percpu_to_op("mov", (pcp), val)
  348. #define __this_cpu_write_2(pcp, val) percpu_to_op("mov", (pcp), val)
  349. #define __this_cpu_write_4(pcp, val) percpu_to_op("mov", (pcp), val)
  350. #define __this_cpu_add_1(pcp, val) percpu_add_op((pcp), val)
  351. #define __this_cpu_add_2(pcp, val) percpu_add_op((pcp), val)
  352. #define __this_cpu_add_4(pcp, val) percpu_add_op((pcp), val)
  353. #define __this_cpu_and_1(pcp, val) percpu_to_op("and", (pcp), val)
  354. #define __this_cpu_and_2(pcp, val) percpu_to_op("and", (pcp), val)
  355. #define __this_cpu_and_4(pcp, val) percpu_to_op("and", (pcp), val)
  356. #define __this_cpu_or_1(pcp, val) percpu_to_op("or", (pcp), val)
  357. #define __this_cpu_or_2(pcp, val) percpu_to_op("or", (pcp), val)
  358. #define __this_cpu_or_4(pcp, val) percpu_to_op("or", (pcp), val)
  359. #define __this_cpu_xchg_1(pcp, val) percpu_xchg_op(pcp, val)
  360. #define __this_cpu_xchg_2(pcp, val) percpu_xchg_op(pcp, val)
  361. #define __this_cpu_xchg_4(pcp, val) percpu_xchg_op(pcp, val)
  362. #define this_cpu_read_1(pcp) percpu_from_op("mov", (pcp), "m"(pcp))
  363. #define this_cpu_read_2(pcp) percpu_from_op("mov", (pcp), "m"(pcp))
  364. #define this_cpu_read_4(pcp) percpu_from_op("mov", (pcp), "m"(pcp))
  365. #define this_cpu_write_1(pcp, val) percpu_to_op("mov", (pcp), val)
  366. #define this_cpu_write_2(pcp, val) percpu_to_op("mov", (pcp), val)
  367. #define this_cpu_write_4(pcp, val) percpu_to_op("mov", (pcp), val)
  368. #define this_cpu_add_1(pcp, val) percpu_add_op((pcp), val)
  369. #define this_cpu_add_2(pcp, val) percpu_add_op((pcp), val)
  370. #define this_cpu_add_4(pcp, val) percpu_add_op((pcp), val)
  371. #define this_cpu_and_1(pcp, val) percpu_to_op("and", (pcp), val)
  372. #define this_cpu_and_2(pcp, val) percpu_to_op("and", (pcp), val)
  373. #define this_cpu_and_4(pcp, val) percpu_to_op("and", (pcp), val)
  374. #define this_cpu_or_1(pcp, val) percpu_to_op("or", (pcp), val)
  375. #define this_cpu_or_2(pcp, val) percpu_to_op("or", (pcp), val)
  376. #define this_cpu_or_4(pcp, val) percpu_to_op("or", (pcp), val)
  377. #define this_cpu_xchg_1(pcp, nval) percpu_xchg_op(pcp, nval)
  378. #define this_cpu_xchg_2(pcp, nval) percpu_xchg_op(pcp, nval)
  379. #define this_cpu_xchg_4(pcp, nval) percpu_xchg_op(pcp, nval)
  380. #define __this_cpu_add_return_1(pcp, val) percpu_add_return_op(pcp, val)
  381. #define __this_cpu_add_return_2(pcp, val) percpu_add_return_op(pcp, val)
  382. #define __this_cpu_add_return_4(pcp, val) percpu_add_return_op(pcp, val)
  383. #define __this_cpu_cmpxchg_1(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval)
  384. #define __this_cpu_cmpxchg_2(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval)
  385. #define __this_cpu_cmpxchg_4(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval)
  386. #define this_cpu_add_return_1(pcp, val) percpu_add_return_op(pcp, val)
  387. #define this_cpu_add_return_2(pcp, val) percpu_add_return_op(pcp, val)
  388. #define this_cpu_add_return_4(pcp, val) percpu_add_return_op(pcp, val)
  389. #define this_cpu_cmpxchg_1(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval)
  390. #define this_cpu_cmpxchg_2(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval)
  391. #define this_cpu_cmpxchg_4(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval)
  392. #ifdef CONFIG_X86_CMPXCHG64
  393. #define percpu_cmpxchg8b_double(pcp1, pcp2, o1, o2, n1, n2) \
  394. ({ \
  395. bool __ret; \
  396. typeof(pcp1) __o1 = (o1), __n1 = (n1); \
  397. typeof(pcp2) __o2 = (o2), __n2 = (n2); \
  398. asm volatile("cmpxchg8b "__percpu_arg(1)"\n\tsetz %0\n\t" \
  399. : "=a" (__ret), "+m" (pcp1), "+m" (pcp2), "+d" (__o2) \
  400. : "b" (__n1), "c" (__n2), "a" (__o1)); \
  401. __ret; \
  402. })
  403. #define __this_cpu_cmpxchg_double_4 percpu_cmpxchg8b_double
  404. #define this_cpu_cmpxchg_double_4 percpu_cmpxchg8b_double
  405. #endif /* CONFIG_X86_CMPXCHG64 */
  406. /*
  407. * Per cpu atomic 64 bit operations are only available under 64 bit.
  408. * 32 bit must fall back to generic operations.
  409. */
  410. #ifdef CONFIG_X86_64
  411. #define __this_cpu_read_8(pcp) percpu_from_op("mov", (pcp), "m"(pcp))
  412. #define __this_cpu_write_8(pcp, val) percpu_to_op("mov", (pcp), val)
  413. #define __this_cpu_add_8(pcp, val) percpu_add_op((pcp), val)
  414. #define __this_cpu_and_8(pcp, val) percpu_to_op("and", (pcp), val)
  415. #define __this_cpu_or_8(pcp, val) percpu_to_op("or", (pcp), val)
  416. #define __this_cpu_add_return_8(pcp, val) percpu_add_return_op(pcp, val)
  417. #define __this_cpu_xchg_8(pcp, nval) percpu_xchg_op(pcp, nval)
  418. #define __this_cpu_cmpxchg_8(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval)
  419. #define this_cpu_read_8(pcp) percpu_from_op("mov", (pcp), "m"(pcp))
  420. #define this_cpu_write_8(pcp, val) percpu_to_op("mov", (pcp), val)
  421. #define this_cpu_add_8(pcp, val) percpu_add_op((pcp), val)
  422. #define this_cpu_and_8(pcp, val) percpu_to_op("and", (pcp), val)
  423. #define this_cpu_or_8(pcp, val) percpu_to_op("or", (pcp), val)
  424. #define this_cpu_add_return_8(pcp, val) percpu_add_return_op(pcp, val)
  425. #define this_cpu_xchg_8(pcp, nval) percpu_xchg_op(pcp, nval)
  426. #define this_cpu_cmpxchg_8(pcp, oval, nval) percpu_cmpxchg_op(pcp, oval, nval)
  427. /*
  428. * Pretty complex macro to generate cmpxchg16 instruction. The instruction
  429. * is not supported on early AMD64 processors so we must be able to emulate
  430. * it in software. The address used in the cmpxchg16 instruction must be
  431. * aligned to a 16 byte boundary.
  432. */
  433. #define percpu_cmpxchg16b_double(pcp1, pcp2, o1, o2, n1, n2) \
  434. ({ \
  435. bool __ret; \
  436. typeof(pcp1) __o1 = (o1), __n1 = (n1); \
  437. typeof(pcp2) __o2 = (o2), __n2 = (n2); \
  438. alternative_io("leaq %P1,%%rsi\n\tcall this_cpu_cmpxchg16b_emu\n\t", \
  439. "cmpxchg16b " __percpu_arg(1) "\n\tsetz %0\n\t", \
  440. X86_FEATURE_CX16, \
  441. ASM_OUTPUT2("=a" (__ret), "+m" (pcp1), \
  442. "+m" (pcp2), "+d" (__o2)), \
  443. "b" (__n1), "c" (__n2), "a" (__o1) : "rsi"); \
  444. __ret; \
  445. })
  446. #define __this_cpu_cmpxchg_double_8 percpu_cmpxchg16b_double
  447. #define this_cpu_cmpxchg_double_8 percpu_cmpxchg16b_double
  448. #endif
  449. /* This is not atomic against other CPUs -- CPU preemption needs to be off */
  450. #define x86_test_and_clear_bit_percpu(bit, var) \
  451. ({ \
  452. int old__; \
  453. asm volatile("btr %2,"__percpu_arg(1)"\n\tsbbl %0,%0" \
  454. : "=r" (old__), "+m" (var) \
  455. : "dIr" (bit)); \
  456. old__; \
  457. })
  458. static __always_inline int x86_this_cpu_constant_test_bit(unsigned int nr,
  459. const unsigned long __percpu *addr)
  460. {
  461. unsigned long __percpu *a = (unsigned long *)addr + nr / BITS_PER_LONG;
  462. #ifdef CONFIG_X86_64
  463. return ((1UL << (nr % BITS_PER_LONG)) & __this_cpu_read_8(*a)) != 0;
  464. #else
  465. return ((1UL << (nr % BITS_PER_LONG)) & __this_cpu_read_4(*a)) != 0;
  466. #endif
  467. }
  468. static inline int x86_this_cpu_variable_test_bit(int nr,
  469. const unsigned long __percpu *addr)
  470. {
  471. int oldbit;
  472. asm volatile("bt "__percpu_arg(2)",%1\n\t"
  473. "sbb %0,%0"
  474. : "=r" (oldbit)
  475. : "m" (*(unsigned long *)addr), "Ir" (nr));
  476. return oldbit;
  477. }
  478. #define x86_this_cpu_test_bit(nr, addr) \
  479. (__builtin_constant_p((nr)) \
  480. ? x86_this_cpu_constant_test_bit((nr), (addr)) \
  481. : x86_this_cpu_variable_test_bit((nr), (addr)))
  482. #include <asm-generic/percpu.h>
  483. /* We can use this directly for local CPU (faster). */
  484. DECLARE_PER_CPU(unsigned long, this_cpu_off);
  485. #endif /* !__ASSEMBLY__ */
  486. #ifdef CONFIG_SMP
  487. /*
  488. * Define the "EARLY_PER_CPU" macros. These are used for some per_cpu
  489. * variables that are initialized and accessed before there are per_cpu
  490. * areas allocated.
  491. */
  492. #define DEFINE_EARLY_PER_CPU(_type, _name, _initvalue) \
  493. DEFINE_PER_CPU(_type, _name) = _initvalue; \
  494. __typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \
  495. { [0 ... NR_CPUS-1] = _initvalue }; \
  496. __typeof__(_type) *_name##_early_ptr __refdata = _name##_early_map
  497. #define DEFINE_EARLY_PER_CPU_READ_MOSTLY(_type, _name, _initvalue) \
  498. DEFINE_PER_CPU_READ_MOSTLY(_type, _name) = _initvalue; \
  499. __typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \
  500. { [0 ... NR_CPUS-1] = _initvalue }; \
  501. __typeof__(_type) *_name##_early_ptr __refdata = _name##_early_map
  502. #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \
  503. EXPORT_PER_CPU_SYMBOL(_name)
  504. #define DECLARE_EARLY_PER_CPU(_type, _name) \
  505. DECLARE_PER_CPU(_type, _name); \
  506. extern __typeof__(_type) *_name##_early_ptr; \
  507. extern __typeof__(_type) _name##_early_map[]
  508. #define DECLARE_EARLY_PER_CPU_READ_MOSTLY(_type, _name) \
  509. DECLARE_PER_CPU_READ_MOSTLY(_type, _name); \
  510. extern __typeof__(_type) *_name##_early_ptr; \
  511. extern __typeof__(_type) _name##_early_map[]
  512. #define early_per_cpu_ptr(_name) (_name##_early_ptr)
  513. #define early_per_cpu_map(_name, _idx) (_name##_early_map[_idx])
  514. #define early_per_cpu(_name, _cpu) \
  515. *(early_per_cpu_ptr(_name) ? \
  516. &early_per_cpu_ptr(_name)[_cpu] : \
  517. &per_cpu(_name, _cpu))
  518. #else /* !CONFIG_SMP */
  519. #define DEFINE_EARLY_PER_CPU(_type, _name, _initvalue) \
  520. DEFINE_PER_CPU(_type, _name) = _initvalue
  521. #define DEFINE_EARLY_PER_CPU_READ_MOSTLY(_type, _name, _initvalue) \
  522. DEFINE_PER_CPU_READ_MOSTLY(_type, _name) = _initvalue
  523. #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \
  524. EXPORT_PER_CPU_SYMBOL(_name)
  525. #define DECLARE_EARLY_PER_CPU(_type, _name) \
  526. DECLARE_PER_CPU(_type, _name)
  527. #define DECLARE_EARLY_PER_CPU_READ_MOSTLY(_type, _name) \
  528. DECLARE_PER_CPU_READ_MOSTLY(_type, _name)
  529. #define early_per_cpu(_name, _cpu) per_cpu(_name, _cpu)
  530. #define early_per_cpu_ptr(_name) NULL
  531. /* no early_per_cpu_map() */
  532. #endif /* !CONFIG_SMP */
  533. #endif /* _ASM_X86_PERCPU_H */