Messages in this thread | | | Subject | Re: [PATCH 2/3] uprobes: change build_map_info() to try kmalloc(GFP_NOWAIT) first | From | Peter Zijlstra <> | Date | Mon, 04 Jun 2012 16:59:24 +0200 |
| |
On Mon, 2012-06-04 at 16:53 +0200, Oleg Nesterov wrote: > build_map_info() doesn't allocate the memory under i_mmap_mutex > to avoid the deadlock with page reclaim. But it can try GFP_NOWAIT > first, it should work in the likely case and thus we almost never > need the pre-alloc-and-retry path. > > Signed-off-by: Oleg Nesterov <oleg@redhat.com> > --- > kernel/events/uprobes.c | 9 +++++++-- > 1 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c > index a1bbcab..c9836ae 100644 > --- a/kernel/events/uprobes.c > +++ b/kernel/events/uprobes.c > @@ -772,8 +772,13 @@ build_map_info(struct address_space *mapping, loff_t offset, bool is_register) > continue; > > if (!prev) { > - more++; > - continue;
Should we add something like this:
/* * Needs GFP_NOWAIT to avoid i_mmap_mutex recursion through reclaim. * This is optimistic, no harm done if it fails. */
> + prev = kmalloc(sizeof(struct map_info), > + GFP_NOWAIT | __GFP_NOMEMALLOC | __GFP_NOWARN); > + if (!prev) { > + more++; > + continue; > + } > + prev->next = NULL; > } > > if (!atomic_inc_not_zero(&vma->vm_mm->mm_users))
| |