From: Andrew Morton Cc: Eric Dumazet Cc: Rusty Russell Signed-off-by: Andrew Morton --- drivers/lguest/io.c | 21 ++++++++++++--------- 1 files changed, 12 insertions(+), 9 deletions(-) diff -puN drivers/lguest/io.c~lguest-the-host-code-vs-futex-new-private-futexes drivers/lguest/io.c --- a/drivers/lguest/io.c~lguest-the-host-code-vs-futex-new-private-futexes +++ a/drivers/lguest/io.c @@ -102,13 +102,14 @@ int bind_dma(struct lguest *lg, unsigned int i; int ret = 0; union futex_key key; + struct rw_semaphore *fshared = ¤t->mm->mmap_sem; if (interrupt >= LGUEST_IRQS) return 0; mutex_lock(&lguest_lock); - down_read(¤t->mm->mmap_sem); - if (get_futex_key((u32 __user *)ukey, sizeof(u32), &key) != 0) { + down_read(fshared); + if (get_futex_key((u32 __user *)ukey, sizeof(u32), fshared, &key)) { kill_guest(lg, "bad dma key %#lx", ukey); goto unlock; } @@ -134,7 +135,7 @@ int bind_dma(struct lguest *lg, } drop_futex_key_refs(&key); unlock: - up_read(¤t->mm->mmap_sem); + up_read(fshared); mutex_unlock(&lguest_lock); return ret; } @@ -307,11 +308,12 @@ void send_dma(struct lguest *lg, unsigne { union futex_key key; int empty = 0; + struct rw_semaphore *fshared = ¤t->mm->mmap_sem; again: mutex_lock(&lguest_lock); - down_read(¤t->mm->mmap_sem); - if (get_futex_key((u32 __user *)ukey, sizeof(u32), &key) != 0) { + down_read(fshared); + if (get_futex_key((u32 __user *)ukey, sizeof(u32), fshared, &key)) { kill_guest(lg, "bad sending DMA key"); goto unlock; } @@ -342,7 +344,7 @@ again: lg->pending_key = ukey; } unlock: - up_read(¤t->mm->mmap_sem); + up_read(fshared); mutex_unlock(&lguest_lock); } @@ -382,10 +384,11 @@ unsigned long get_dma_buffer(struct lgue unsigned long ret = 0; union futex_key key; struct lguest_dma_info *i; + struct rw_semaphore *fshared = ¤t->mm->mmap_sem; mutex_lock(&lguest_lock); - down_read(¤t->mm->mmap_sem); - if (get_futex_key((u32 __user *)ukey, sizeof(u32), &key) != 0) { + down_read(fshared); + if (get_futex_key((u32 __user *)ukey, sizeof(u32), fshared, &key)) { kill_guest(lg, "bad registered DMA buffer"); goto unlock; } @@ -405,7 +408,7 @@ unsigned long get_dma_buffer(struct lgue } } unlock: - up_read(¤t->mm->mmap_sem); + up_read(fshared); mutex_unlock(&lguest_lock); return ret; } _