The patch titled uml: make copy_*_user atomic has been added to the -mm tree. Its filename is uml-make-copy__user-atomic.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this From: Paolo 'Blaisorblade' Giarrusso <blaisorblade@xxxxxxxx> Make __copy_*_user_inatomic really atomic to avoid "Sleeping function called in atomic context" warnings, especially from futex code. This is made by adding another kmap_atomic slot and making copy_*_user_skas use kmap_atomic; also copy_*_user() becomes atomic, but that's true and is not a problem for i386 (and we can always add might_sleep there as done elsewhere). For TT mode kmap is not used, so there's no need for this. I've had to use another slot since both KM_USER0 and KM_USER1 are used elsewhere and could cause conflicts. Till now we reused the kmap_atomic slot list from the subarch, but that's not needed as that list must contain the common ones (used by generic code) + the ones used in architecture specific code (and Uml till now used none); so I've taken the i386 one after comparing it with ones from other archs, and added KM_UML_USERCOPY. Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@xxxxxxxx> Cc: Jeff Dike <jdike@xxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- arch/um/kernel/skas/uaccess.c | 15 +++++++++------ include/asm-um/kmap_types.h | 20 +++++++++++++++++++- 2 files changed, 28 insertions(+), 7 deletions(-) diff -puN arch/um/kernel/skas/uaccess.c~uml-make-copy__user-atomic arch/um/kernel/skas/uaccess.c --- devel/arch/um/kernel/skas/uaccess.c~uml-make-copy__user-atomic 2006-04-30 13:23:26.000000000 -0700 +++ devel-akpm/arch/um/kernel/skas/uaccess.c 2006-04-30 13:23:26.000000000 -0700 @@ -8,6 +8,7 @@ #include "linux/kernel.h" #include "linux/string.h" #include "linux/fs.h" +#include "linux/hardirq.h" #include "linux/highmem.h" #include "asm/page.h" #include "asm/pgtable.h" @@ -38,7 +39,7 @@ static unsigned long maybe_map(unsigned return((unsigned long) phys); } -static int do_op(unsigned long addr, int len, int is_write, +static int do_op_one_page(unsigned long addr, int len, int is_write, int (*op)(unsigned long addr, int len, void *arg), void *arg) { struct page *page; @@ -49,9 +50,11 @@ static int do_op(unsigned long addr, int return(-1); page = phys_to_page(addr); - addr = (unsigned long) kmap(page) + (addr & ~PAGE_MASK); + addr = (unsigned long) kmap_atomic(page, KM_UML_USERCOPY) + (addr & ~PAGE_MASK); + n = (*op)(addr, len, arg); - kunmap(page); + + kunmap_atomic(page, KM_UML_USERCOPY); return(n); } @@ -77,7 +80,7 @@ static void do_buffer_op(void *jmpbuf, v remain = len; current->thread.fault_catcher = jmpbuf; - n = do_op(addr, size, is_write, op, arg); + n = do_op_one_page(addr, size, is_write, op, arg); if(n != 0){ *res = (n < 0 ? remain : 0); goto out; @@ -91,7 +94,7 @@ static void do_buffer_op(void *jmpbuf, v } while(addr < ((addr + remain) & PAGE_MASK)){ - n = do_op(addr, PAGE_SIZE, is_write, op, arg); + n = do_op_one_page(addr, PAGE_SIZE, is_write, op, arg); if(n != 0){ *res = (n < 0 ? remain : 0); goto out; @@ -105,7 +108,7 @@ static void do_buffer_op(void *jmpbuf, v goto out; } - n = do_op(addr, remain, is_write, op, arg); + n = do_op_one_page(addr, remain, is_write, op, arg); if(n != 0) *res = (n < 0 ? remain : 0); else *res = 0; diff -puN include/asm-um/kmap_types.h~uml-make-copy__user-atomic include/asm-um/kmap_types.h --- devel/include/asm-um/kmap_types.h~uml-make-copy__user-atomic 2006-04-30 13:23:26.000000000 -0700 +++ devel-akpm/include/asm-um/kmap_types.h 2006-04-30 13:23:26.000000000 -0700 @@ -6,6 +6,24 @@ #ifndef __UM_KMAP_TYPES_H #define __UM_KMAP_TYPES_H -#include "asm/arch/kmap_types.h" +/* No more #include "asm/arch/kmap_types.h" ! */ + +enum km_type { + KM_BOUNCE_READ, + KM_SKB_SUNRPC_DATA, + KM_SKB_DATA_SOFTIRQ, + KM_USER0, + KM_USER1, + KM_UML_USERCOPY, /* UML specific, for copy_*_user - used in do_op_one_page */ + KM_BIO_SRC_IRQ, + KM_BIO_DST_IRQ, + KM_PTE0, + KM_PTE1, + KM_IRQ0, + KM_IRQ1, + KM_SOFTIRQ0, + KM_SOFTIRQ1, + KM_TYPE_NR +}; #endif _ Patches currently in -mm which might be from blaisorblade@xxxxxxxx are uml-fix-iomem-list-traversal.patch uml-skas0-support-for-2g-2g-hosts.patch uml-remove-null-checks-and-add-some-codingstyle.patch uml-clean-up-after-madvise_remove.patch uml-update-defconfig.patch uml-error-handling-fixes.patch uml-fix-patch-mismerge.patch uml-search-from-uml_net-in-a-more-reasonable-path.patch uml-use-kbuild-tracking-for-all-files-and-fix-compilation-output.patch uml-fix-compilation-and-execution-with-hardened-gcc.patch uml-cleanup-unprofile-expression-and-build-infrastructure.patch uml-export-symbols-added-by-gcc-hardened.patch uml-make-copy__user-atomic.patch uml-fix-not_dead_yet-when-directory-is-in-bad-state.patch uml-rename-and-improve-actually_do_remove.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html