From: chengkaitao <[email protected]> The list_for_each*_safe() helpers are used when the loop body may remove the current entry. Their current interface, however, forces every caller to define a temporary cursor outside the macro and pass it in, even when the caller never uses that cursor directly. For most call sites this extra cursor is just boilerplate required by the macro implementation.
This is awkward because the saved next pointer is an internal detail of the iteration. Callers that only remove or move the current entry do not need to spell it out. The _safe() suffix has also caused confusion. Christian Koenig pointed out that the name is easy to read as a thread-safe variant, especially for beginners, even though it only means that the iterator keeps enough state to tolerate removal of the current entry. He suggested _mutable() as a clearer description of what the loop permits. Add *_mutable() iterator variants for list, hlist and llist. The new helpers are variadic and support both forms. In the common case, the caller omits the temporary cursor and the macro creates a unique internal cursor with typeof(pos) and __UNIQUE_ID(). If a loop really needs an explicit temporary cursor, the caller can still pass it and the helper keeps the existing *_safe() behaviour. For example, a call site may use the shorter form: list_for_each_entry_mutable(pos, head, member) or keep the explicit temporary cursor form: list_for_each_entry_mutable(pos, tmp, head, member) The existing *_safe() helpers remain available for compatibility. This series only converts users in mm, block, kernel, init and io_uring. If this approach looks acceptable, the remaining users can be converted in follow-up series. Changes in v3 (Christian König, Andy Shevchenko): - Convert safe list walks to mutable iterators Changes in v2 (Muchun Song, Andy Shevchenko): - Drop the list_for_each_entry_mutable*() helpers from v1 and make the cursor change directly in the existing list_for_each_entry*() helpers. - Open-code special list walks that rely on updating the loop cursor in the body, preserving their existing traversal semantics. Link to v2: https://lore.kernel.org/all/[email protected]/ Link to v1: https://lore.kernel.org/all/[email protected]/ Kaitao Cheng (7): list: Add mutable iterator variants llist: Add mutable iterator variants mm: Use mutable list iterators block: Use mutable list iterators kernel: Use mutable list iterators initramfs: Use mutable list iterator io_uring: Use mutable list iterators block/bfq-iosched.c | 17 +- block/blk-cgroup.c | 12 +- block/blk-flush.c | 4 +- block/blk-iocost.c | 18 +- block/blk-mq.c | 8 +- block/blk-throttle.c | 4 +- block/kyber-iosched.c | 4 +- block/partitions/ldm.c | 8 +- block/sed-opal.c | 4 +- include/linux/list.h | 269 ++++++++++++++++++++++++---- include/linux/llist.h | 81 +++++++-- init/initramfs.c | 5 +- io_uring/cancel.c | 6 +- io_uring/poll.c | 3 +- io_uring/rw.c | 4 +- io_uring/timeout.c | 8 +- io_uring/uring_cmd.c | 3 +- kernel/audit_tree.c | 4 +- kernel/audit_watch.c | 16 +- kernel/auditfilter.c | 4 +- kernel/auditsc.c | 4 +- kernel/bpf/arena.c | 10 +- kernel/bpf/arraymap.c | 8 +- kernel/bpf/bpf_local_storage.c | 3 +- kernel/bpf/bpf_lru_list.c | 25 ++- kernel/bpf/btf.c | 18 +- kernel/bpf/cgroup.c | 7 +- kernel/bpf/cpumap.c | 4 +- kernel/bpf/devmap.c | 10 +- kernel/bpf/helpers.c | 8 +- kernel/bpf/local_storage.c | 4 +- kernel/bpf/memalloc.c | 16 +- kernel/bpf/offload.c | 8 +- kernel/bpf/states.c | 4 +- kernel/bpf/stream.c | 4 +- kernel/bpf/verifier.c | 6 +- kernel/cgroup/cgroup-v1.c | 4 +- kernel/cgroup/cgroup.c | 54 +++--- kernel/cgroup/dmem.c | 12 +- kernel/cgroup/rdma.c | 8 +- kernel/events/core.c | 44 +++-- kernel/events/uprobes.c | 12 +- kernel/exit.c | 8 +- kernel/fail_function.c | 4 +- kernel/gcov/clang.c | 4 +- kernel/irq_work.c | 4 +- kernel/kexec_core.c | 4 +- kernel/kprobes.c | 16 +- kernel/livepatch/core.c | 4 +- kernel/livepatch/core.h | 4 +- kernel/liveupdate/kho_block.c | 4 +- kernel/liveupdate/luo_flb.c | 4 +- kernel/locking/rwsem.c | 2 +- kernel/locking/test-ww_mutex.c | 2 +- kernel/module/main.c | 11 +- kernel/padata.c | 4 +- kernel/power/snapshot.c | 8 +- kernel/power/wakelock.c | 4 +- kernel/printk/printk.c | 11 +- kernel/ptrace.c | 4 +- kernel/rcu/rcutorture.c | 3 +- kernel/rcu/tasks.h | 9 +- kernel/rcu/tree.c | 6 +- kernel/resource.c | 4 +- kernel/sched/core.c | 4 +- kernel/sched/ext.c | 22 +-- kernel/sched/fair.c | 28 +-- kernel/sched/topology.c | 4 +- kernel/sched/wait.c | 4 +- kernel/seccomp.c | 4 +- kernel/signal.c | 11 +- kernel/smp.c | 4 +- kernel/taskstats.c | 8 +- kernel/time/clockevents.c | 6 +- kernel/time/clocksource.c | 4 +- kernel/time/posix-cpu-timers.c | 4 +- kernel/time/posix-timers.c | 3 +- kernel/torture.c | 3 +- kernel/trace/bpf_trace.c | 4 +- kernel/trace/ftrace.c | 49 +++-- kernel/trace/ring_buffer.c | 25 ++- kernel/trace/trace.c | 12 +- kernel/trace/trace_dynevent.c | 6 +- kernel/trace/trace_dynevent.h | 5 +- kernel/trace/trace_events.c | 35 ++-- kernel/trace/trace_events_filter.c | 4 +- kernel/trace/trace_events_hist.c | 8 +- kernel/trace/trace_events_trigger.c | 17 +- kernel/trace/trace_events_user.c | 16 +- kernel/trace/trace_stat.c | 4 +- kernel/user-return-notifier.c | 3 +- kernel/workqueue.c | 16 +- mm/backing-dev.c | 8 +- mm/balloon.c | 8 +- mm/cma.c | 4 +- mm/compaction.c | 4 +- mm/damon/core.c | 4 +- mm/damon/sysfs-schemes.c | 4 +- mm/dmapool.c | 4 +- mm/huge_memory.c | 8 +- mm/hugetlb.c | 56 +++--- mm/hugetlb_vmemmap.c | 16 +- mm/khugepaged.c | 14 +- mm/kmemleak.c | 7 +- mm/ksm.c | 25 +-- mm/list_lru.c | 4 +- mm/memcontrol-v1.c | 8 +- mm/memory-failure.c | 12 +- mm/memory-tiers.c | 4 +- mm/migrate.c | 23 ++- mm/mmu_notifier.c | 9 +- mm/page_alloc.c | 8 +- mm/page_reporting.c | 2 +- mm/percpu.c | 11 +- mm/pgtable-generic.c | 4 +- mm/rmap.c | 10 +- mm/shmem.c | 9 +- mm/slab_common.c | 14 +- mm/slub.c | 33 ++-- mm/swapfile.c | 4 +- mm/userfaultfd.c | 12 +- mm/vmalloc.c | 24 +-- mm/vmscan.c | 7 +- mm/zsmalloc.c | 4 +- 124 files changed, 875 insertions(+), 681 deletions(-) -- 2.43.0
