@@ -1304,6 +1304,8 @@ module_param(rcu_min_cached_objs, int, 0444);
1304
1304
static int rcu_delay_page_cache_fill_msec = 5000 ;
1305
1305
module_param (rcu_delay_page_cache_fill_msec , int , 0444 );
1306
1306
1307
+ static struct workqueue_struct * rcu_reclaim_wq ;
1308
+
1307
1309
/* Maximum number of jiffies to wait before draining a batch. */
1308
1310
#define KFREE_DRAIN_JIFFIES (5 * HZ)
1309
1311
#define KFREE_N_BATCHES 2
@@ -1632,10 +1634,10 @@ __schedule_delayed_monitor_work(struct kfree_rcu_cpu *krcp)
1632
1634
if (delayed_work_pending (& krcp -> monitor_work )) {
1633
1635
delay_left = krcp -> monitor_work .timer .expires - jiffies ;
1634
1636
if (delay < delay_left )
1635
- mod_delayed_work (system_unbound_wq , & krcp -> monitor_work , delay );
1637
+ mod_delayed_work (rcu_reclaim_wq , & krcp -> monitor_work , delay );
1636
1638
return ;
1637
1639
}
1638
- queue_delayed_work (system_unbound_wq , & krcp -> monitor_work , delay );
1640
+ queue_delayed_work (rcu_reclaim_wq , & krcp -> monitor_work , delay );
1639
1641
}
1640
1642
1641
1643
static void
@@ -1733,7 +1735,7 @@ kvfree_rcu_queue_batch(struct kfree_rcu_cpu *krcp)
1733
1735
// "free channels", the batch can handle. Break
1734
1736
// the loop since it is done with this CPU thus
1735
1737
// queuing an RCU work is _always_ success here.
1736
- queued = queue_rcu_work (system_unbound_wq , & krwp -> rcu_work );
1738
+ queued = queue_rcu_work (rcu_reclaim_wq , & krwp -> rcu_work );
1737
1739
WARN_ON_ONCE (!queued );
1738
1740
break ;
1739
1741
}
@@ -1883,7 +1885,7 @@ run_page_cache_worker(struct kfree_rcu_cpu *krcp)
1883
1885
if (rcu_scheduler_active == RCU_SCHEDULER_RUNNING &&
1884
1886
!atomic_xchg (& krcp -> work_in_progress , 1 )) {
1885
1887
if (atomic_read (& krcp -> backoff_page_cache_fill )) {
1886
- queue_delayed_work (system_unbound_wq ,
1888
+ queue_delayed_work (rcu_reclaim_wq ,
1887
1889
& krcp -> page_cache_work ,
1888
1890
msecs_to_jiffies (rcu_delay_page_cache_fill_msec ));
1889
1891
} else {
@@ -2120,6 +2122,10 @@ void __init kvfree_rcu_init(void)
2120
2122
int i , j ;
2121
2123
struct shrinker * kfree_rcu_shrinker ;
2122
2124
2125
+ rcu_reclaim_wq = alloc_workqueue ("kvfree_rcu_reclaim" ,
2126
+ WQ_UNBOUND | WQ_MEM_RECLAIM , 0 );
2127
+ WARN_ON (!rcu_reclaim_wq );
2128
+
2123
2129
/* Clamp it to [0:100] seconds interval. */
2124
2130
if (rcu_delay_page_cache_fill_msec < 0 ||
2125
2131
rcu_delay_page_cache_fill_msec > 100 * MSEC_PER_SEC ) {
0 commit comments