bfq_end_wr_async() iterates q->blkg_list while only holding bfqd->lock,
but not blkcg_mutex. This can race with blkg_free_workfn() that removes
blkgs from the list while holding blkcg_mutex.
Add blkcg_mutex protection in bfq_end_wr() before taking bfqd->lock to
ensure proper synchronization when iterating q->blkg_list.
Signed-off-by: Yu Kuai <yukuai@fnnas.com>
---
block/bfq-cgroup.c | 3 ++-
block/bfq-iosched.c | 2 ++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/block/bfq-cgroup.c b/block/bfq-cgroup.c
index 6a75fe1c7a5c..839d266a6aa6 100644
--- a/block/bfq-cgroup.c
+++ b/block/bfq-cgroup.c
@@ -940,7 +940,8 @@ void bfq_end_wr_async(struct bfq_data *bfqd)
list_for_each_entry(blkg, &bfqd->queue->blkg_list, q_node) {
struct bfq_group *bfqg = blkg_to_bfqg(blkg);
- bfq_end_wr_async_queues(bfqd, bfqg);
+ if (bfqg)
+ bfq_end_wr_async_queues(bfqd, bfqg);
}
bfq_end_wr_async_queues(bfqd, bfqd->root_group);
}
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index 3ebdec40e758..617633be8abc 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -2645,6 +2645,7 @@ static void bfq_end_wr(struct bfq_data *bfqd)
struct bfq_queue *bfqq;
int i;
+ mutex_lock(&bfqd->queue->blkcg_mutex);
spin_lock_irq(&bfqd->lock);
for (i = 0; i < bfqd->num_actuators; i++) {
@@ -2656,6 +2657,7 @@ static void bfq_end_wr(struct bfq_data *bfqd)
bfq_end_wr_async(bfqd);
spin_unlock_irq(&bfqd->lock);
+ mutex_unlock(&bfqd->queue->blkcg_mutex);
}
static sector_t bfq_io_struct_pos(void *io_struct, bool request)
--
2.51.0
Hi Yu,
kernel test robot noticed the following build errors:
[auto build test ERROR on axboe/for-next]
[also build test ERROR on linus/master v6.19-rc8 next-20260202]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Yu-Kuai/blk-cgroup-protect-q-blkg_list-iteration-in-blkg_destroy_all-with-blkcg_mutex/20260203-161356
base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux.git for-next
patch link: https://lore.kernel.org/r/20260203080602.726505-3-yukuai%40fnnas.com
patch subject: [PATCH v2 2/7] bfq: protect q->blkg_list iteration in bfq_end_wr_async() with blkcg_mutex
config: s390-randconfig-002-20260203 (https://download.01.org/0day-ci/archive/20260203/202602032109.oYgANNeZ-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260203/202602032109.oYgANNeZ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602032109.oYgANNeZ-lkp@intel.com/
All errors (new ones prefixed by >>):
>> block/bfq-iosched.c:2648:27: error: no member named 'blkcg_mutex' in 'struct request_queue'
2648 | mutex_lock(&bfqd->queue->blkcg_mutex);
| ~~~~~~~~~~~ ^
include/linux/mutex.h:193:44: note: expanded from macro 'mutex_lock'
193 | #define mutex_lock(lock) mutex_lock_nested(lock, 0)
| ^~~~
block/bfq-iosched.c:2660:29: error: no member named 'blkcg_mutex' in 'struct request_queue'
2660 | mutex_unlock(&bfqd->queue->blkcg_mutex);
| ~~~~~~~~~~~ ^
2 errors generated.
vim +2648 block/bfq-iosched.c
2642
2643 static void bfq_end_wr(struct bfq_data *bfqd)
2644 {
2645 struct bfq_queue *bfqq;
2646 int i;
2647
> 2648 mutex_lock(&bfqd->queue->blkcg_mutex);
2649 spin_lock_irq(&bfqd->lock);
2650
2651 for (i = 0; i < bfqd->num_actuators; i++) {
2652 list_for_each_entry(bfqq, &bfqd->active_list[i], bfqq_list)
2653 bfq_bfqq_end_wr(bfqq);
2654 }
2655 list_for_each_entry(bfqq, &bfqd->idle_list, bfqq_list)
2656 bfq_bfqq_end_wr(bfqq);
2657 bfq_end_wr_async(bfqd);
2658
2659 spin_unlock_irq(&bfqd->lock);
2660 mutex_unlock(&bfqd->queue->blkcg_mutex);
2661 }
2662
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi Yu,
kernel test robot noticed the following build errors:
[auto build test ERROR on axboe/for-next]
[also build test ERROR on linus/master v6.19-rc8 next-20260202]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Yu-Kuai/blk-cgroup-protect-q-blkg_list-iteration-in-blkg_destroy_all-with-blkcg_mutex/20260203-161356
base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux.git for-next
patch link: https://lore.kernel.org/r/20260203080602.726505-3-yukuai%40fnnas.com
patch subject: [PATCH v2 2/7] bfq: protect q->blkg_list iteration in bfq_end_wr_async() with blkcg_mutex
config: i386-buildonly-randconfig-002-20260203 (https://download.01.org/0day-ci/archive/20260203/202602032018.BRG7c7LT-lkp@intel.com/config)
compiler: gcc-13 (Debian 13.3.0-16) 13.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260203/202602032018.BRG7c7LT-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602032018.BRG7c7LT-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from include/linux/seqlock.h:19,
from include/linux/mmzone.h:17,
from include/linux/gfp.h:7,
from include/linux/umh.h:4,
from include/linux/kmod.h:9,
from include/linux/module.h:18,
from block/bfq-iosched.c:116:
block/bfq-iosched.c: In function 'bfq_end_wr':
>> block/bfq-iosched.c:2648:32: error: 'struct request_queue' has no member named 'blkcg_mutex'
2648 | mutex_lock(&bfqd->queue->blkcg_mutex);
| ^~
include/linux/mutex.h:193:44: note: in definition of macro 'mutex_lock'
193 | #define mutex_lock(lock) mutex_lock_nested(lock, 0)
| ^~~~
block/bfq-iosched.c:2660:34: error: 'struct request_queue' has no member named 'blkcg_mutex'
2660 | mutex_unlock(&bfqd->queue->blkcg_mutex);
| ^~
vim +2648 block/bfq-iosched.c
2642
2643 static void bfq_end_wr(struct bfq_data *bfqd)
2644 {
2645 struct bfq_queue *bfqq;
2646 int i;
2647
> 2648 mutex_lock(&bfqd->queue->blkcg_mutex);
2649 spin_lock_irq(&bfqd->lock);
2650
2651 for (i = 0; i < bfqd->num_actuators; i++) {
2652 list_for_each_entry(bfqq, &bfqd->active_list[i], bfqq_list)
2653 bfq_bfqq_end_wr(bfqq);
2654 }
2655 list_for_each_entry(bfqq, &bfqd->idle_list, bfqq_list)
2656 bfq_bfqq_end_wr(bfqq);
2657 bfq_end_wr_async(bfqd);
2658
2659 spin_unlock_irq(&bfqd->lock);
2660 mutex_unlock(&bfqd->queue->blkcg_mutex);
2661 }
2662
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi,
在 2026/2/3 20:54, kernel test robot 写道:
> Hi Yu,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on axboe/for-next]
> [also build test ERROR on linus/master v6.19-rc8 next-20260202]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Yu-Kuai/blk-cgroup-protect-q-blkg_list-iteration-in-blkg_destroy_all-with-blkcg_mutex/20260203-161356
> base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux.git for-next
> patch link: https://lore.kernel.org/r/20260203080602.726505-3-yukuai%40fnnas.com
> patch subject: [PATCH v2 2/7] bfq: protect q->blkg_list iteration in bfq_end_wr_async() with blkcg_mutex
> config: i386-buildonly-randconfig-002-20260203 (https://download.01.org/0day-ci/archive/20260203/202602032018.BRG7c7LT-lkp@intel.com/config)
> compiler: gcc-13 (Debian 13.3.0-16) 13.3.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260203/202602032018.BRG7c7LT-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202602032018.BRG7c7LT-lkp@intel.com/
Looks like this is due to CONFIG_BLK_CGROUP is disabled, will fix this in the next
version.
>
> All errors (new ones prefixed by >>):
>
> In file included from include/linux/seqlock.h:19,
> from include/linux/mmzone.h:17,
> from include/linux/gfp.h:7,
> from include/linux/umh.h:4,
> from include/linux/kmod.h:9,
> from include/linux/module.h:18,
> from block/bfq-iosched.c:116:
> block/bfq-iosched.c: In function 'bfq_end_wr':
>>> block/bfq-iosched.c:2648:32: error: 'struct request_queue' has no member named 'blkcg_mutex'
> 2648 | mutex_lock(&bfqd->queue->blkcg_mutex);
> | ^~
> include/linux/mutex.h:193:44: note: in definition of macro 'mutex_lock'
> 193 | #define mutex_lock(lock) mutex_lock_nested(lock, 0)
> | ^~~~
> block/bfq-iosched.c:2660:34: error: 'struct request_queue' has no member named 'blkcg_mutex'
> 2660 | mutex_unlock(&bfqd->queue->blkcg_mutex);
> | ^~
>
>
> vim +2648 block/bfq-iosched.c
>
> 2642
> 2643 static void bfq_end_wr(struct bfq_data *bfqd)
> 2644 {
> 2645 struct bfq_queue *bfqq;
> 2646 int i;
> 2647
>> 2648 mutex_lock(&bfqd->queue->blkcg_mutex);
> 2649 spin_lock_irq(&bfqd->lock);
> 2650
> 2651 for (i = 0; i < bfqd->num_actuators; i++) {
> 2652 list_for_each_entry(bfqq, &bfqd->active_list[i], bfqq_list)
> 2653 bfq_bfqq_end_wr(bfqq);
> 2654 }
> 2655 list_for_each_entry(bfqq, &bfqd->idle_list, bfqq_list)
> 2656 bfq_bfqq_end_wr(bfqq);
> 2657 bfq_end_wr_async(bfqd);
> 2658
> 2659 spin_unlock_irq(&bfqd->lock);
> 2660 mutex_unlock(&bfqd->queue->blkcg_mutex);
> 2661 }
> 2662
>
--
Thansk,
Kuai
© 2016 - 2026 Red Hat, Inc.