static int oprof_output_maps(struct task_struct * task) { int size=0; struct mm_struct * mm; struct vm_area_struct * map; /* we don't need to worry about mm_users here, since there is at least one user (current), and if there's other code using this mm, then mm_users must be at least 2; we should never have to mmput() here. */ if (!(mm = task->mm)) goto out; lock_mmap(mm); spin_lock(¬e_lock); /* We need two pass, daemon assume than the first mmap notification * is for the executable but some process doesn't follow this model. */ for (map = mm->mmap; map; map = map->vm_next) { if (!(map->vm_flags & VM_EXEC) || !map->vm_file) continue; if (!(map->vm_flags & VM_EXECUTABLE)) continue; oprof_output_map(map->vm_start, map->vm_end-map->vm_start, GET_VM_OFFSET(map), map->vm_file, 1); } for (map = mm->mmap; map; map = map->vm_next) { if (!(map->vm_flags & VM_EXEC) || !map->vm_file) continue; if (map->vm_flags & VM_EXECUTABLE) continue; oprof_output_map(map->vm_start, map->vm_end-map->vm_start, GET_VM_OFFSET(map), map->vm_file, 0); } spin_unlock(¬e_lock); unlock_mmap(mm); out: return size; }
void scribe_lock_mmap_write(struct mm_struct *mm) { lock_mmap(mm, SCRIBE_WRITE); }
void scribe_lock_mmap_read(struct mm_struct *mm) { lock_mmap(mm, SCRIBE_READ); }