On 08/02, Andrii Nakryiko wrote: > > On Fri, Aug 2, 2024 at 1:50 AM Oleg Nesterov <oleg@xxxxxxxxxx> wrote: > > > > On 08/01, Andrii Nakryiko wrote: > > > > > > > + /* TODO : cant unregister? schedule a worker thread */ > > > > + WARN(err, "leaking uprobe due to failed unregistration"); > > > > > Ok, so now that I added this very loud warning if > > > register_for_each_vma(uprobe, NULL) returns error, it turns out it's > > > not that unusual for this unregistration to fail. > > > > ... > > > > > So, is there something smarter we can do in this case besides leaking > > > an uprobe (and note, my changes don't change this behavior)? > > > > Something like schedule_work() which retries register_for_each_vma()... > > And if that fails again, what do we do? try again after some timeout ;) > Because I don't think we even > need schedule_work(), we can just keep some list of "pending to be > retried" items and check them after each > uprobe_register()/uprobe_unregister() call. Agreed, we need a list of "pending to be retried", but rightly or not I think this should be done from work_struct->func. Lets discuss this later? We seem to agree this is a known problem, and this has nothing to do with your optimizations. > I'm just not clear how we > should handle stubborn cases (but honestly I haven't even tried to > understand all the details about this just yet). Same here. Oleg.