From 17095c0720d64ca64d090bb4ac553c79dc9c4778 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Mon, 29 Dec 2003 23:47:28 -0800 Subject: [PATCH] [PATCH] Check for preemption in kunmap_atomic() From: Joe Korty We need to check whether preemption is needed after reenabling preemption in kunmap_atomic(). --- arch/i386/mm/highmem.c | 3 +++ arch/mips/mm/highmem.c | 3 +++ arch/sparc/mm/highmem.c | 3 +++ include/asm-ppc/highmem.h | 3 +++ 4 files changed, 12 insertions(+) diff --git a/arch/i386/mm/highmem.c b/arch/i386/mm/highmem.c index c303b222131c2..58175328507a5 100644 --- a/arch/i386/mm/highmem.c +++ b/arch/i386/mm/highmem.c @@ -30,6 +30,7 @@ void *kmap_atomic(struct page *page, enum km_type type) enum fixed_addresses idx; unsigned long vaddr; + /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ inc_preempt_count(); if (page < highmem_start_page) return page_address(page); @@ -54,6 +55,7 @@ void kunmap_atomic(void *kvaddr, enum km_type type) if (vaddr < FIXADDR_START) { // FIXME dec_preempt_count(); + preempt_check_resched(); return; } @@ -69,6 +71,7 @@ void kunmap_atomic(void *kvaddr, enum km_type type) #endif dec_preempt_count(); + preempt_check_resched(); } struct page *kmap_atomic_to_page(void *ptr) diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index 0ae1245c70103..2602af4527f08 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -40,6 +40,7 @@ void *kmap_atomic(struct page *page, enum km_type type) enum fixed_addresses idx; unsigned long vaddr; + /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ inc_preempt_count(); if (page < highmem_start_page) return page_address(page); @@ -64,6 +65,7 @@ void kunmap_atomic(void *kvaddr, enum km_type type) if (vaddr < FIXADDR_START) { // FIXME dec_preempt_count(); + preempt_check_resched(); return; } @@ -79,6 +81,7 @@ void kunmap_atomic(void *kvaddr, enum km_type type) #endif dec_preempt_count(); + preempt_check_resched(); } struct page *kmap_atomic_to_page(void *ptr) diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index 0bfbc068bc4b6..e17d0075e7094 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -33,6 +33,7 @@ void *kmap_atomic(struct page *page, enum km_type type) unsigned long idx; unsigned long vaddr; + /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ inc_preempt_count(); if (page < highmem_start_page) return page_address(page); @@ -69,6 +70,7 @@ void kunmap_atomic(void *kvaddr, enum km_type type) if (vaddr < fix_kmap_begin) { // FIXME dec_preempt_count(); + preempt_check_resched(); return; } @@ -96,4 +98,5 @@ void kunmap_atomic(void *kvaddr, enum km_type type) #endif #endif dec_preempt_count(); + preempt_check_resched(); } diff --git a/include/asm-ppc/highmem.h b/include/asm-ppc/highmem.h index a4aac1adf9f38..c13b4e495519a 100644 --- a/include/asm-ppc/highmem.h +++ b/include/asm-ppc/highmem.h @@ -81,6 +81,7 @@ static inline void *kmap_atomic(struct page *page, enum km_type type) unsigned int idx; unsigned long vaddr; + /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ inc_preempt_count(); if (page < highmem_start_page) return page_address(page); @@ -105,6 +106,7 @@ static inline void kunmap_atomic(void *kvaddr, enum km_type type) if (vaddr < KMAP_FIX_BEGIN) { // FIXME dec_preempt_count(); + preempt_check_resched(); return; } @@ -119,6 +121,7 @@ static inline void kunmap_atomic(void *kvaddr, enum km_type type) flush_tlb_page(0, vaddr); #endif dec_preempt_count(); + preempt_check_resched(); } static inline struct page *kmap_atomic_to_page(void *ptr) -- 2.53.0