@@ -406,7 +406,7 @@ alloc_workqueue(const char *fmt, unsigned int flags, int max_active, ...);
406
406
* alloc_ordered_workqueue - allocate an ordered workqueue
407
407
* @fmt: printf format for the name of the workqueue
408
408
* @flags: WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful)
409
- * @args... : args for @fmt
409
+ * @args: args for @fmt
410
410
*
411
411
* Allocate an ordered workqueue. An ordered workqueue executes at
412
412
* most one work item at any given time in the queued order. They are
@@ -445,7 +445,7 @@ extern bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq,
445
445
struct delayed_work * dwork , unsigned long delay );
446
446
extern bool queue_rcu_work (struct workqueue_struct * wq , struct rcu_work * rwork );
447
447
448
- extern void flush_workqueue (struct workqueue_struct * wq );
448
+ extern void __flush_workqueue (struct workqueue_struct * wq );
449
449
extern void drain_workqueue (struct workqueue_struct * wq );
450
450
451
451
extern int schedule_on_each_cpu (work_func_t func );
@@ -563,15 +563,23 @@ static inline bool schedule_work(struct work_struct *work)
563
563
return queue_work (system_wq , work );
564
564
}
565
565
566
+ /*
567
+ * Detect attempt to flush system-wide workqueues at compile time when possible.
568
+ *
569
+ * See https://lkml.kernel.org/r/[email protected]
570
+ * for reasons and steps for converting system-wide workqueues into local workqueues.
571
+ */
572
+ extern void __warn_flushing_systemwide_wq (void )
573
+ __compiletime_warning ("Please avoid flushing system-wide workqueues." );
574
+
566
575
/**
567
576
* flush_scheduled_work - ensure that any scheduled work has run to completion.
568
577
*
569
578
* Forces execution of the kernel-global workqueue and blocks until its
570
579
* completion.
571
580
*
572
- * Think twice before calling this function! It's very easy to get into
573
- * trouble if you don't take great care. Either of the following situations
574
- * will lead to deadlock:
581
+ * It's very easy to get into trouble if you don't take great care.
582
+ * Either of the following situations will lead to deadlock:
575
583
*
576
584
* One of the work items currently on the workqueue needs to acquire
577
585
* a lock held by your code or its caller.
@@ -586,11 +594,51 @@ static inline bool schedule_work(struct work_struct *work)
586
594
* need to know that a particular work item isn't queued and isn't running.
587
595
* In such cases you should use cancel_delayed_work_sync() or
588
596
* cancel_work_sync() instead.
597
+ *
598
+ * Please stop calling this function! A conversion to stop flushing system-wide
599
+ * workqueues is in progress. This function will be removed after all in-tree
600
+ * users stopped calling this function.
589
601
*/
590
- static inline void flush_scheduled_work (void )
591
- {
592
- flush_workqueue (system_wq );
593
- }
602
+ /*
603
+ * The background of commit 771c035372a036f8 ("deprecate the
604
+ * '__deprecated' attribute warnings entirely and for good") is that,
605
+ * since Linus builds all modules between every single pull he does,
606
+ * the standard kernel build needs to be _clean_ in order to be able to
607
+ * notice when new problems happen. Therefore, don't emit warning while
608
+ * there are in-tree users.
609
+ */
610
+ #define flush_scheduled_work () \
611
+ ({ \
612
+ if (0) \
613
+ __warn_flushing_systemwide_wq(); \
614
+ __flush_workqueue(system_wq); \
615
+ })
616
+
617
+ /*
618
+ * Although there is no longer in-tree caller, for now just emit warning
619
+ * in order to give out-of-tree callers time to update.
620
+ */
621
+ #define flush_workqueue (wq ) \
622
+ ({ \
623
+ struct workqueue_struct *_wq = (wq); \
624
+ \
625
+ if ((__builtin_constant_p(_wq == system_wq) && \
626
+ _wq == system_wq) || \
627
+ (__builtin_constant_p(_wq == system_highpri_wq) && \
628
+ _wq == system_highpri_wq) || \
629
+ (__builtin_constant_p(_wq == system_long_wq) && \
630
+ _wq == system_long_wq) || \
631
+ (__builtin_constant_p(_wq == system_unbound_wq) && \
632
+ _wq == system_unbound_wq) || \
633
+ (__builtin_constant_p(_wq == system_freezable_wq) && \
634
+ _wq == system_freezable_wq) || \
635
+ (__builtin_constant_p(_wq == system_power_efficient_wq) && \
636
+ _wq == system_power_efficient_wq) || \
637
+ (__builtin_constant_p(_wq == system_freezable_power_efficient_wq) && \
638
+ _wq == system_freezable_power_efficient_wq)) \
639
+ __warn_flushing_systemwide_wq(); \
640
+ __flush_workqueue(_wq); \
641
+ })
594
642
595
643
/**
596
644
* schedule_delayed_work_on - queue work in global workqueue on CPU after delay
0 commit comments