Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'rcu.2025.09.23a' into HEAD

RCU miscellaneous updates:
* Document that rcu_barrier() hurries lazy callbacks
* Remove local_irq_save/restore() in rcu_preempt_deferred_qs_handler()
* Move list_for_each_rcu() to where it belongs
* Replace use of system_wq with system_percpu_wq
* WQ_PERCPU added to alloc_workqueue users
* WQ_UNBOUND added to sync_wq workqueue

+21 -18
-10
include/linux/list.h
··· 687 687 for (pos = (head)->next; !list_is_head(pos, (head)); pos = pos->next) 688 688 689 689 /** 690 - * list_for_each_rcu - Iterate over a list in an RCU-safe fashion 691 - * @pos: the &struct list_head to use as a loop cursor. 692 - * @head: the head for your list. 693 - */ 694 - #define list_for_each_rcu(pos, head) \ 695 - for (pos = rcu_dereference((head)->next); \ 696 - !list_is_head(pos, (head)); \ 697 - pos = rcu_dereference(pos->next)) 698 - 699 - /** 700 690 * list_for_each_continue - continue iteration over a list 701 691 * @pos: the &struct list_head to use as a loop cursor. 702 692 * @head: the head for your list.
+10
include/linux/rculist.h
··· 43 43 #define list_bidir_prev_rcu(list) (*((struct list_head __rcu **)(&(list)->prev))) 44 44 45 45 /** 46 + * list_for_each_rcu - Iterate over a list in an RCU-safe fashion 47 + * @pos: the &struct list_head to use as a loop cursor. 48 + * @head: the head for your list. 49 + */ 50 + #define list_for_each_rcu(pos, head) \ 51 + for (pos = rcu_dereference((head)->next); \ 52 + !list_is_head(pos, (head)); \ 53 + pos = rcu_dereference(pos->next)) 54 + 55 + /** 46 56 * list_tail_rcu - returns the prev pointer of the head of the list 47 57 * @head: the head of the list 48 58 *
+1
kernel/cgroup/dmem.c
··· 14 14 #include <linux/mutex.h> 15 15 #include <linux/page_counter.h> 16 16 #include <linux/parser.h> 17 + #include <linux/rculist.h> 17 18 #include <linux/slab.h> 18 19 19 20 struct dmem_cgroup_region {
+2 -2
kernel/rcu/tasks.h
··· 553 553 rtpcp_next = rtp->rtpcp_array[index]; 554 554 if (rtpcp_next->cpu < smp_load_acquire(&rtp->percpu_dequeue_lim)) { 555 555 cpuwq = rcu_cpu_beenfullyonline(rtpcp_next->cpu) ? rtpcp_next->cpu : WORK_CPU_UNBOUND; 556 - queue_work_on(cpuwq, system_wq, &rtpcp_next->rtp_work); 556 + queue_work_on(cpuwq, system_percpu_wq, &rtpcp_next->rtp_work); 557 557 index++; 558 558 if (index < num_possible_cpus()) { 559 559 rtpcp_next = rtp->rtpcp_array[index]; 560 560 if (rtpcp_next->cpu < smp_load_acquire(&rtp->percpu_dequeue_lim)) { 561 561 cpuwq = rcu_cpu_beenfullyonline(rtpcp_next->cpu) ? rtpcp_next->cpu : WORK_CPU_UNBOUND; 562 - queue_work_on(cpuwq, system_wq, &rtpcp_next->rtp_work); 562 + queue_work_on(cpuwq, system_percpu_wq, &rtpcp_next->rtp_work); 563 563 } 564 564 } 565 565 }
+7 -2
kernel/rcu/tree.c
··· 3800 3800 * to complete. For example, if there are no RCU callbacks queued anywhere 3801 3801 * in the system, then rcu_barrier() is within its rights to return 3802 3802 * immediately, without waiting for anything, much less an RCU grace period. 3803 + * In fact, rcu_barrier() will normally not result in any RCU grace periods 3804 + * beyond those that were already destined to be executed. 3805 + * 3806 + * In kernels built with CONFIG_RCU_LAZY=y, this function also hurries all 3807 + * pending lazy RCU callbacks. 3803 3808 */ 3804 3809 void rcu_barrier(void) 3805 3810 { ··· 4890 4885 rcutree_online_cpu(cpu); 4891 4886 4892 4887 /* Create workqueue for Tree SRCU and for expedited GPs. */ 4893 - rcu_gp_wq = alloc_workqueue("rcu_gp", WQ_MEM_RECLAIM, 0); 4888 + rcu_gp_wq = alloc_workqueue("rcu_gp", WQ_MEM_RECLAIM | WQ_PERCPU, 0); 4894 4889 WARN_ON(!rcu_gp_wq); 4895 4890 4896 - sync_wq = alloc_workqueue("sync_wq", WQ_MEM_RECLAIM, 0); 4891 + sync_wq = alloc_workqueue("sync_wq", WQ_MEM_RECLAIM | WQ_UNBOUND, 0); 4897 4892 WARN_ON(!sync_wq); 4898 4893 4899 4894 /* Respect if explicitly disabled via a boot parameter. */
+1 -4
kernel/rcu/tree_plugin.h
··· 626 626 */ 627 627 static void rcu_preempt_deferred_qs_handler(struct irq_work *iwp) 628 628 { 629 - unsigned long flags; 630 629 struct rcu_data *rdp; 631 630 631 + lockdep_assert_irqs_disabled(); 632 632 rdp = container_of(iwp, struct rcu_data, defer_qs_iw); 633 - local_irq_save(flags); 634 633 635 634 /* 636 635 * If the IRQ work handler happens to run in the middle of RCU read-side ··· 646 647 */ 647 648 if (rcu_preempt_depth() > 0) 648 649 WRITE_ONCE(rdp->defer_qs_iw_pending, DEFER_QS_IDLE); 649 - 650 - local_irq_restore(flags); 651 650 } 652 651 653 652 /*