diff options
Diffstat (limited to 'mm/highmem.c')
| -rw-r--r-- | mm/highmem.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/mm/highmem.c b/mm/highmem.c index 910198037bf5..68eb1d9b63fa 100644 --- a/mm/highmem.c +++ b/mm/highmem.c | |||
| @@ -422,3 +422,48 @@ void __init page_address_init(void) | |||
| 422 | } | 422 | } |
| 423 | 423 | ||
| 424 | #endif /* defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) */ | 424 | #endif /* defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) */ |
| 425 | |||
| 426 | #if defined(CONFIG_DEBUG_HIGHMEM) && defined(CONFIG_TRACE_IRQFLAGS_SUPPORT) | ||
| 427 | |||
| 428 | void debug_kmap_atomic(enum km_type type) | ||
| 429 | { | ||
| 430 | static unsigned warn_count = 10; | ||
| 431 | |||
| 432 | if (unlikely(warn_count == 0)) | ||
| 433 | return; | ||
| 434 | |||
| 435 | if (unlikely(in_interrupt())) { | ||
| 436 | if (in_irq()) { | ||
| 437 | if (type != KM_IRQ0 && type != KM_IRQ1 && | ||
| 438 | type != KM_BIO_SRC_IRQ && type != KM_BIO_DST_IRQ && | ||
| 439 | type != KM_BOUNCE_READ) { | ||
| 440 | WARN_ON(1); | ||
| 441 | warn_count--; | ||
| 442 | } | ||
| 443 | } else if (!irqs_disabled()) { /* softirq */ | ||
| 444 | if (type != KM_IRQ0 && type != KM_IRQ1 && | ||
| 445 | type != KM_SOFTIRQ0 && type != KM_SOFTIRQ1 && | ||
| 446 | type != KM_SKB_SUNRPC_DATA && | ||
| 447 | type != KM_SKB_DATA_SOFTIRQ && | ||
| 448 | type != KM_BOUNCE_READ) { | ||
| 449 | WARN_ON(1); | ||
| 450 | warn_count--; | ||
| 451 | } | ||
| 452 | } | ||
| 453 | } | ||
| 454 | |||
| 455 | if (type == KM_IRQ0 || type == KM_IRQ1 || type == KM_BOUNCE_READ || | ||
| 456 | type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ) { | ||
| 457 | if (!irqs_disabled()) { | ||
| 458 | WARN_ON(1); | ||
| 459 | warn_count--; | ||
| 460 | } | ||
| 461 | } else if (type == KM_SOFTIRQ0 || type == KM_SOFTIRQ1) { | ||
| 462 | if (irq_count() == 0 && !irqs_disabled()) { | ||
| 463 | WARN_ON(1); | ||
| 464 | warn_count--; | ||
| 465 | } | ||
| 466 | } | ||
| 467 | } | ||
| 468 | |||
| 469 | #endif | ||
