lkml.org 
[lkml]   [2011]   [Nov]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v7 3.2-rc2 3/30] uprobes: register/unregister probes.
    From
    Date
    On Fri, 2011-11-18 at 16:37 +0530, Srikar Dronamraju wrote:
    > +static void __unregister_uprobe(struct inode *inode, loff_t offset,
    > + struct uprobe *uprobe)
    > +{
    > + struct list_head try_list;
    > + struct address_space *mapping;
    > + struct vma_info *vi, *tmpvi;
    > + struct vm_area_struct *vma;
    > + struct mm_struct *mm;
    > + loff_t vaddr;
    > +
    > + mapping = inode->i_mapping;
    > + INIT_LIST_HEAD(&try_list);
    > + while ((vi = find_next_vma_info(&try_list, offset,
    > + mapping, false)) != NULL) {
    > + if (IS_ERR(vi))
    > + break;

    So what kind of half-assed state are we left in if we try an unregister
    under memory pressure and how do we deal with that?

    > + mm = vi->mm;
    > + down_read(&mm->mmap_sem);
    > + vma = find_vma(mm, (unsigned long)vi->vaddr);
    > + if (!vma || !valid_vma(vma, false)) {
    > + list_del(&vi->probe_list);
    > + kfree(vi);
    > + up_read(&mm->mmap_sem);
    > + mmput(mm);
    > + continue;
    > + }
    > + vaddr = vma->vm_start + offset;
    > + vaddr -= vma->vm_pgoff << PAGE_SHIFT;
    > + if (vma->vm_file->f_mapping->host != inode ||
    > + vaddr != vi->vaddr) {
    > + list_del(&vi->probe_list);
    > + kfree(vi);
    > + up_read(&mm->mmap_sem);
    > + mmput(mm);
    > + continue;
    > + }
    > + remove_breakpoint(mm);
    > + up_read(&mm->mmap_sem);
    > + mmput(mm);
    > + }
    > +
    > + list_for_each_entry_safe(vi, tmpvi, &try_list, probe_list) {
    > + list_del(&vi->probe_list);
    > + kfree(vi);
    > + }
    > + delete_uprobe(uprobe);
    > +}


    \
     
     \ /
      Last update: 2011-11-28 16:33    [W:6.779 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site