On Sat, Dec 02, 2023 at 03:50:55PM +0800, Hillf Danton wrote: > On Fri, 1 Dec 2023 19:08:29 +0000 Catalin Marinas <catalin.marinas@xxxxxxx> > > @@ -1472,14 +1474,27 @@ static void scan_object(struct kmemleak_object *object) > > /* already freed object */ > > goto out; > > > > - obj_ptr = object->flags & OBJECT_PHYS ? > > - __va((phys_addr_t)object->pointer) : > > - (void *)object->pointer; > > + if (object->flags & OBJECT_PERCPU) { > > + unsigned int cpu; > > > > - if (hlist_empty(&object->area_list) || > > + for_each_possible_cpu(cpu) { > > + void *start = per_cpu_ptr((void __percpu *)object->pointer, cpu); > > + void *end = start + object->size; > > + > > + scan_block(start, end, object); > > + > > + raw_spin_unlock_irqrestore(&object->lock, flags); > > + cond_resched(); > > + raw_spin_lock_irqsave(&object->lock, flags); > > Nit, spin_lock/unlock can be collapsed into need_resched(). > > if (need_resched()) { > raw_spin_unlock_irqrestore(&object->lock, flags); > cond_resched(); > raw_spin_lock_irqsave(&object->lock, flags); > } The reason I'd not do this is that we also want the interrupts to be re-enabled regularly. Keeping them disabled may not even mark the current thread as need_resched(). -- Catalin