diff options
Diffstat (limited to 'mm/highmem.c')
| -rw-r--r-- | mm/highmem.c | 62 |
1 files changed, 4 insertions, 58 deletions
diff --git a/mm/highmem.c b/mm/highmem.c index 7a0aa1be4993..781e754a75ac 100644 --- a/mm/highmem.c +++ b/mm/highmem.c | |||
| @@ -42,6 +42,10 @@ | |||
| 42 | unsigned long totalhigh_pages __read_mostly; | 42 | unsigned long totalhigh_pages __read_mostly; |
| 43 | EXPORT_SYMBOL(totalhigh_pages); | 43 | EXPORT_SYMBOL(totalhigh_pages); |
| 44 | 44 | ||
| 45 | |||
| 46 | DEFINE_PER_CPU(int, __kmap_atomic_idx); | ||
| 47 | EXPORT_PER_CPU_SYMBOL(__kmap_atomic_idx); | ||
| 48 | |||
| 45 | unsigned int nr_free_highpages (void) | 49 | unsigned int nr_free_highpages (void) |
| 46 | { | 50 | { |
| 47 | pg_data_t *pgdat; | 51 | pg_data_t *pgdat; |
| @@ -422,61 +426,3 @@ void __init page_address_init(void) | |||
| 422 | } | 426 | } |
| 423 | 427 | ||
| 424 | #endif /* defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) */ | 428 | #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 | ||
