diff options
Diffstat (limited to 'mm/highmem.c')
-rw-r--r-- | mm/highmem.c | 66 |
1 files changed, 8 insertions, 58 deletions
diff --git a/mm/highmem.c b/mm/highmem.c index 7a0aa1be4993..693394daa2ed 100644 --- a/mm/highmem.c +++ b/mm/highmem.c | |||
@@ -29,6 +29,11 @@ | |||
29 | #include <linux/kgdb.h> | 29 | #include <linux/kgdb.h> |
30 | #include <asm/tlbflush.h> | 30 | #include <asm/tlbflush.h> |
31 | 31 | ||
32 | |||
33 | #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) | ||
34 | DEFINE_PER_CPU(int, __kmap_atomic_idx); | ||
35 | #endif | ||
36 | |||
32 | /* | 37 | /* |
33 | * Virtual_count is not a pure "count". | 38 | * Virtual_count is not a pure "count". |
34 | * 0 means that it is not mapped, and has not been mapped | 39 | * 0 means that it is not mapped, and has not been mapped |
@@ -42,6 +47,9 @@ | |||
42 | unsigned long totalhigh_pages __read_mostly; | 47 | unsigned long totalhigh_pages __read_mostly; |
43 | EXPORT_SYMBOL(totalhigh_pages); | 48 | EXPORT_SYMBOL(totalhigh_pages); |
44 | 49 | ||
50 | |||
51 | EXPORT_PER_CPU_SYMBOL(__kmap_atomic_idx); | ||
52 | |||
45 | unsigned int nr_free_highpages (void) | 53 | unsigned int nr_free_highpages (void) |
46 | { | 54 | { |
47 | pg_data_t *pgdat; | 55 | pg_data_t *pgdat; |
@@ -422,61 +430,3 @@ void __init page_address_init(void) | |||
422 | } | 430 | } |
423 | 431 | ||
424 | #endif /* defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) */ | 432 | #endif /* defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) */ |
425 | |||
426 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
427 | |||
428 | void debug_kmap_atomic(enum km_type type) | ||
429 | { | ||
430 | static int warn_count = 10; | ||
431 | |||
432 | if (unlikely(warn_count < 0)) | ||
433 | return; | ||
434 | |||
435 | if (unlikely(in_interrupt())) { | ||
436 | if (in_nmi()) { | ||
437 | if (type != KM_NMI && type != KM_NMI_PTE) { | ||
438 | WARN_ON(1); | ||
439 | warn_count--; | ||
440 | } | ||
441 | } else if (in_irq()) { | ||
442 | if (type != KM_IRQ0 && type != KM_IRQ1 && | ||
443 | type != KM_BIO_SRC_IRQ && type != KM_BIO_DST_IRQ && | ||
444 | type != KM_BOUNCE_READ && type != KM_IRQ_PTE) { | ||
445 | WARN_ON(1); | ||
446 | warn_count--; | ||
447 | } | ||
448 | } else if (!irqs_disabled()) { /* softirq */ | ||
449 | if (type != KM_IRQ0 && type != KM_IRQ1 && | ||
450 | type != KM_SOFTIRQ0 && type != KM_SOFTIRQ1 && | ||
451 | type != KM_SKB_SUNRPC_DATA && | ||
452 | type != KM_SKB_DATA_SOFTIRQ && | ||
453 | type != KM_BOUNCE_READ) { | ||
454 | WARN_ON(1); | ||
455 | warn_count--; | ||
456 | } | ||
457 | } | ||
458 | } | ||
459 | |||
460 | if (type == KM_IRQ0 || type == KM_IRQ1 || type == KM_BOUNCE_READ || | ||
461 | type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ || | ||
462 | type == KM_IRQ_PTE || type == KM_NMI || | ||
463 | type == KM_NMI_PTE ) { | ||
464 | if (!irqs_disabled()) { | ||
465 | WARN_ON(1); | ||
466 | warn_count--; | ||
467 | } | ||
468 | } else if (type == KM_SOFTIRQ0 || type == KM_SOFTIRQ1) { | ||
469 | if (irq_count() == 0 && !irqs_disabled()) { | ||
470 | WARN_ON(1); | ||
471 | warn_count--; | ||
472 | } | ||
473 | } | ||
474 | #ifdef CONFIG_KGDB_KDB | ||
475 | if (unlikely(type == KM_KDB && atomic_read(&kgdb_active) == -1)) { | ||
476 | WARN_ON(1); | ||
477 | warn_count--; | ||
478 | } | ||
479 | #endif /* CONFIG_KGDB_KDB */ | ||
480 | } | ||
481 | |||
482 | #endif | ||