diff options
author | Ingo Molnar <mingo@redhat.com> | 2004-08-26 20:33:18 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-08-26 20:33:18 -0700 |
commit | 026a14f002f20339ea70ec66c8b738bc59b9d08b (patch) | |
tree | 32c58da59aa962d137271c7fd17503944597f9f4 /mm | |
parent | c46cde9d384836cfb1ea6a0731434ffa060e7450 (diff) | |
download | history-026a14f002f20339ea70ec66c8b738bc59b9d08b.tar.gz |
[PATCH] Add a few might_sleep() checks
Add a whole bunch more might_sleep() checks. We also enable might_sleep()
checking in copy_*_user(). This was non-trivial because of the "copy_*_user()
in atomic regions" trick would generate false positives. Fix that up by
adding a new __copy_*_user_inatomic(), which avoids the might_sleep() check.
Only i386 is supported in this patch.
With: Arjan van de Ven <arjanv@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/filemap.c | 7 | ||||
-rw-r--r-- | mm/mempool.c | 1 | ||||
-rw-r--r-- | mm/mmap.c | 1 |
3 files changed, 6 insertions, 3 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 4db9ba3d152b93..542e4af90c67a6 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -888,7 +888,8 @@ int file_read_actor(read_descriptor_t *desc, struct page *page, */ if (!fault_in_pages_writeable(desc->arg.buf, size)) { kaddr = kmap_atomic(page, KM_USER0); - left = __copy_to_user(desc->arg.buf, kaddr + offset, size); + left = __copy_to_user_inatomic(desc->arg.buf, + kaddr + offset, size); kunmap_atomic(kaddr, KM_USER0); if (left == 0) goto success; @@ -1685,7 +1686,7 @@ filemap_copy_from_user(struct page *page, unsigned long offset, int left; kaddr = kmap_atomic(page, KM_USER0); - left = __copy_from_user(kaddr + offset, buf, bytes); + left = __copy_from_user_inatomic(kaddr + offset, buf, bytes); kunmap_atomic(kaddr, KM_USER0); if (left != 0) { @@ -1708,7 +1709,7 @@ __filemap_copy_from_user_iovec(char *vaddr, int copy = min(bytes, iov->iov_len - base); base = 0; - left = __copy_from_user(vaddr, buf, copy); + left = __copy_from_user_inatomic(vaddr, buf, copy); copied += copy; bytes -= copy; vaddr += copy; diff --git a/mm/mempool.c b/mm/mempool.c index a6c1537ee49f01..8dec8779e28f0c 100644 --- a/mm/mempool.c +++ b/mm/mempool.c @@ -194,6 +194,7 @@ void * mempool_alloc(mempool_t *pool, int gfp_mask) DEFINE_WAIT(wait); int gfp_nowait = gfp_mask & ~(__GFP_WAIT | __GFP_IO); + might_sleep_if(gfp_mask & __GFP_WAIT); repeat_alloc: element = pool->alloc(gfp_nowait|__GFP_NOWARN, pool->pool_data); if (likely(element != NULL)) diff --git a/mm/mmap.c b/mm/mmap.c index 87536f82831572..e2b929e5b13210 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -90,6 +90,7 @@ static void remove_vm_struct(struct vm_area_struct *vma) { struct file *file = vma->vm_file; + might_sleep(); if (file) { struct address_space *mapping = file->f_mapping; spin_lock(&mapping->i_mmap_lock); |