aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/linux/bio.h10
-rw-r--r--include/linux/blkdev.h2
-rw-r--r--include/linux/module.h25
3 files changed, 23 insertions, 14 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 0942765cf8c0..2aa283ab062b 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -451,12 +451,13 @@ extern struct biovec_slab bvec_slabs[BIOVEC_NR_POOLS] __read_mostly;
451 451
452#ifdef CONFIG_HIGHMEM 452#ifdef CONFIG_HIGHMEM
453/* 453/*
454 * remember to add offset! and never ever reenable interrupts between a 454 * remember never ever reenable interrupts between a bvec_kmap_irq and
455 * bvec_kmap_irq and bvec_kunmap_irq!! 455 * bvec_kunmap_irq!
456 * 456 *
457 * This function MUST be inlined - it plays with the CPU interrupt flags. 457 * This function MUST be inlined - it plays with the CPU interrupt flags.
458 */ 458 */
459static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags) 459static __always_inline char *bvec_kmap_irq(struct bio_vec *bvec,
460 unsigned long *flags)
460{ 461{
461 unsigned long addr; 462 unsigned long addr;
462 463
@@ -472,7 +473,8 @@ static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags)
472 return (char *) addr + bvec->bv_offset; 473 return (char *) addr + bvec->bv_offset;
473} 474}
474 475
475static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags) 476static __always_inline void bvec_kunmap_irq(char *buffer,
477 unsigned long *flags)
476{ 478{
477 unsigned long ptr = (unsigned long) buffer & PAGE_MASK; 479 unsigned long ptr = (unsigned long) buffer & PAGE_MASK;
478 480
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index d08c4b8219a6..dcaa0fd84b02 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -455,7 +455,7 @@ struct request_queue
455 455
456#define QUEUE_FLAG_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \ 456#define QUEUE_FLAG_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \
457 (1 << QUEUE_FLAG_CLUSTER) | \ 457 (1 << QUEUE_FLAG_CLUSTER) | \
458 1 << QUEUE_FLAG_STACKABLE) 458 (1 << QUEUE_FLAG_STACKABLE))
459 459
460static inline int queue_is_locked(struct request_queue *q) 460static inline int queue_is_locked(struct request_queue *q)
461{ 461{
diff --git a/include/linux/module.h b/include/linux/module.h
index 4f7ea12463d3..f3b8329eb5b8 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -219,11 +219,6 @@ void *__symbol_get_gpl(const char *symbol);
219 219
220#endif 220#endif
221 221
222struct module_ref
223{
224 local_t count;
225} ____cacheline_aligned;
226
227enum module_state 222enum module_state
228{ 223{
229 MODULE_STATE_LIVE, 224 MODULE_STATE_LIVE,
@@ -344,8 +339,11 @@ struct module
344 /* Destruction function. */ 339 /* Destruction function. */
345 void (*exit)(void); 340 void (*exit)(void);
346 341
347 /* Reference counts */ 342#ifdef CONFIG_SMP
348 struct module_ref ref[NR_CPUS]; 343 char *refptr;
344#else
345 local_t ref;
346#endif
349#endif 347#endif
350}; 348};
351#ifndef MODULE_ARCH_INIT 349#ifndef MODULE_ARCH_INIT
@@ -395,13 +393,22 @@ void __symbol_put(const char *symbol);
395#define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x) 393#define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x)
396void symbol_put_addr(void *addr); 394void symbol_put_addr(void *addr);
397 395
396static inline local_t *__module_ref_addr(struct module *mod, int cpu)
397{
398#ifdef CONFIG_SMP
399 return (local_t *) (mod->refptr + per_cpu_offset(cpu));
400#else
401 return &mod->ref;
402#endif
403}
404
398/* Sometimes we know we already have a refcount, and it's easier not 405/* Sometimes we know we already have a refcount, and it's easier not
399 to handle the error case (which only happens with rmmod --wait). */ 406 to handle the error case (which only happens with rmmod --wait). */
400static inline void __module_get(struct module *module) 407static inline void __module_get(struct module *module)
401{ 408{
402 if (module) { 409 if (module) {
403 BUG_ON(module_refcount(module) == 0); 410 BUG_ON(module_refcount(module) == 0);
404 local_inc(&module->ref[get_cpu()].count); 411 local_inc(__module_ref_addr(module, get_cpu()));
405 put_cpu(); 412 put_cpu();
406 } 413 }
407} 414}
@@ -413,7 +420,7 @@ static inline int try_module_get(struct module *module)
413 if (module) { 420 if (module) {
414 unsigned int cpu = get_cpu(); 421 unsigned int cpu = get_cpu();
415 if (likely(module_is_live(module))) 422 if (likely(module_is_live(module)))
416 local_inc(&module->ref[cpu].count); 423 local_inc(__module_ref_addr(module, cpu));
417 else 424 else
418 ret = 0; 425 ret = 0;
419 put_cpu(); 426 put_cpu();