lkml.org 
[lkml]   [2003]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: atomic copy_from_user?
On Mon, Dec 22, 2003 at 05:19:48PM -0500, Rob Love wrote:
> On Mon, 2003-12-22 at 17:14, Andrew Morton wrote:
>
> > But preempt_enable_no_resched() calls dec_preempt_count().
>
> Yah, Joe just pointed that out.
>
> I do not really want to change the base interfaces, anyway ;)
>
> I do think we should add an explicit preempt_check_resched() after calls
> to dec_preempt_count() where we might be delaying a reschedule, though.

Thanks, Robert and Andrew, for you explanations. This patch should
do the trick.

Joe


diff -ura base/arch/i386/mm/highmem.c new/arch/i386/mm/highmem.c
--- base/arch/i386/mm/highmem.c 2003-12-17 21:58:56.000000000 -0500
+++ new/arch/i386/mm/highmem.c 2003-12-22 17:32:46.000000000 -0500
@@ -30,6 +30,7 @@
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 @@

if (vaddr < FIXADDR_START) { // FIXME
dec_preempt_count();
+ preempt_check_resched();
return;
}

@@ -69,6 +71,7 @@
#endif

dec_preempt_count();
+ preempt_check_resched();
}

struct page *kmap_atomic_to_page(void *ptr)
diff -ura base/arch/mips/mm/highmem.c new/arch/mips/mm/highmem.c
--- base/arch/mips/mm/highmem.c 2003-12-17 21:58:28.000000000 -0500
+++ new/arch/mips/mm/highmem.c 2003-12-22 17:32:59.000000000 -0500
@@ -40,6 +40,7 @@
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 @@

if (vaddr < FIXADDR_START) { // FIXME
dec_preempt_count();
+ preempt_check_resched();
return;
}

@@ -79,6 +81,7 @@
#endif

dec_preempt_count();
+ preempt_check_resched();
}

struct page *kmap_atomic_to_page(void *ptr)
diff -ura base/arch/sparc/mm/highmem.c new/arch/sparc/mm/highmem.c
--- base/arch/sparc/mm/highmem.c 2003-12-17 21:58:28.000000000 -0500
+++ new/arch/sparc/mm/highmem.c 2003-12-22 17:33:05.000000000 -0500
@@ -33,6 +33,7 @@
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 @@

if (vaddr < fix_kmap_begin) { // FIXME
dec_preempt_count();
+ preempt_check_resched();
return;
}

@@ -96,4 +98,5 @@
#endif
#endif
dec_preempt_count();
+ preempt_check_resched();
}
diff -ura base/include/asm-ppc/highmem.h new/include/asm-ppc/highmem.h
--- base/include/asm-ppc/highmem.h 2003-12-17 21:59:45.000000000 -0500
+++ new/include/asm-ppc/highmem.h 2003-12-22 17:33:13.000000000 -0500
@@ -81,6 +81,7 @@
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 @@

if (vaddr < KMAP_FIX_BEGIN) { // FIXME
dec_preempt_count();
+ preempt_check_resched();
return;
}

@@ -119,6 +121,7 @@
flush_tlb_page(0, vaddr);
#endif
dec_preempt_count();
+ preempt_check_resched();
}

static inline struct page *kmap_atomic_to_page(void *ptr)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 13:59    [W:0.165 / U:0.172 seconds]
©2003-2014 Jasper Spaans. Advertise on this site