On Fri, Nov 22, 2024 at 6:55 PM Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> wrote: > > On Fri, Nov 22, 2024 at 03:40:33PM +0000, Alice Ryhl wrote: > > Introduce a new type called `CurrentTask` that lets you perform various > > operations that are only safe on the `current` task. Use the new type to > > provide a way to access the current mm without incrementing its > > refcount. > > Nice! > > > > > With this change, you can write stuff such as > > > > let vma = current!().mm().lock_vma_under_rcu(addr); > > > > without incrementing any refcounts. > > > > Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx> > > On assumption that the problem you reference with the rust imports is > corrected in v10, and that what you are doing with current_raw() is > sensible, then: > > Acked-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> > > Thanks! > > > --- > > Reviewers: Does accessing task->mm on a non-current task require rcu > > protection? > > Hm I am not actually sure, but it seems like you probably do, and I would say > you need the task lock right? > > Looking at find_lock_task_mm() as used by the oomk for instance suggests as much. Okay, sounds complicated. I'm not going to bother with that right now. > > /// The type of process identifiers (PIDs). > > type Pid = bindings::pid_t; > > > > @@ -121,27 +141,25 @@ pub fn current_raw() -> *mut bindings::task_struct { > > /// # Safety > > /// > > /// Callers must ensure that the returned object doesn't outlive the current task/thread. > > - pub unsafe fn current() -> impl Deref<Target = Task> { > > - struct TaskRef<'a> { > > - task: &'a Task, > > - _not_send: NotThreadSafe, > > + pub unsafe fn current() -> impl Deref<Target = CurrentTask> { > > + struct TaskRef { > > + task: *const CurrentTask, > > } > > Why do we drop the NotThreadSafe bit here? And it seems like the 'a lifetime > stuff has gone too? > > I'm guessing the lifetime stuff is because of the SAFETY comment below about > assumptions about lifetime? I dropped the lifetime because it's not doing anything. As for NotThreadSafe: 1. See thread with Boqun. 2. Raw pointers are already considered not thread safe by default, so the *const CurrentTask field has the same effect. Alice