blk-cgroup: store a gendisk to throttle in struct task_struct
authorChristoph Hellwig <hch@lst.de>
Fri, 3 Feb 2023 15:03:48 +0000 (16:03 +0100)
committerJens Axboe <axboe@kernel.dk>
Fri, 3 Feb 2023 15:20:05 +0000 (08:20 -0700)
Switch from a request_queue pointer and reference to a gendisk once
for the throttle information in struct task_struct.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Andreas Herrmann <aherrmann@suse.de>
Link: https://lore.kernel.org/r/20230203150400.3199230-8-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-cgroup.c
include/linux/sched.h
kernel/fork.c
mm/swapfile.c

index 0e36838..168b2f8 100644 (file)
@@ -1362,9 +1362,9 @@ static void blkcg_bind(struct cgroup_subsys_state *root_css)
 
 static void blkcg_exit(struct task_struct *tsk)
 {
-       if (tsk->throttle_queue)
-               blk_put_queue(tsk->throttle_queue);
-       tsk->throttle_queue = NULL;
+       if (tsk->throttle_disk)
+               put_disk(tsk->throttle_disk);
+       tsk->throttle_disk = NULL;
 }
 
 struct cgroup_subsys io_cgrp_subsys = {
@@ -1815,29 +1815,29 @@ static void blkcg_maybe_throttle_blkg(struct blkcg_gq *blkg, bool use_memdelay)
  *
  * This is only called if we've been marked with set_notify_resume().  Obviously
  * we can be set_notify_resume() for reasons other than blkcg throttling, so we
- * check to see if current->throttle_queue is set and if not this doesn't do
+ * check to see if current->throttle_disk is set and if not this doesn't do
  * anything.  This should only ever be called by the resume code, it's not meant
  * to be called by people willy-nilly as it will actually do the work to
  * throttle the task if it is setup for throttling.
  */
 void blkcg_maybe_throttle_current(void)
 {
-       struct request_queue *q = current->throttle_queue;
+       struct gendisk *disk = current->throttle_disk;
        struct blkcg *blkcg;
        struct blkcg_gq *blkg;
        bool use_memdelay = current->use_memdelay;
 
-       if (!q)
+       if (!disk)
                return;
 
-       current->throttle_queue = NULL;
+       current->throttle_disk = NULL;
        current->use_memdelay = false;
 
        rcu_read_lock();
        blkcg = css_to_blkcg(blkcg_css());
        if (!blkcg)
                goto out;
-       blkg = blkg_lookup(blkcg, q);
+       blkg = blkg_lookup(blkcg, disk->queue);
        if (!blkg)
                goto out;
        if (!blkg_tryget(blkg))
@@ -1846,11 +1846,10 @@ void blkcg_maybe_throttle_current(void)
 
        blkcg_maybe_throttle_blkg(blkg, use_memdelay);
        blkg_put(blkg);
-       blk_put_queue(q);
+       put_disk(disk);
        return;
 out:
        rcu_read_unlock();
-       blk_put_queue(q);
 }
 
 /**
@@ -1872,18 +1871,17 @@ out:
  */
 void blkcg_schedule_throttle(struct gendisk *disk, bool use_memdelay)
 {
-       struct request_queue *q = disk->queue;
-
        if (unlikely(current->flags & PF_KTHREAD))
                return;
 
-       if (current->throttle_queue != q) {
-               if (!blk_get_queue(q))
+       if (current->throttle_disk != disk) {
+               if (test_bit(GD_DEAD, &disk->state))
                        return;
+               get_device(disk_to_dev(disk));
 
-               if (current->throttle_queue)
-                       blk_put_queue(current->throttle_queue);
-               current->throttle_queue = q;
+               if (current->throttle_disk)
+                       put_disk(current->throttle_disk);
+               current->throttle_disk = disk;
        }
 
        if (use_memdelay)
index 853d08f..6f6ce9c 100644 (file)
@@ -1436,7 +1436,7 @@ struct task_struct {
 #endif
 
 #ifdef CONFIG_BLK_CGROUP
-       struct request_queue            *throttle_queue;
+       struct gendisk                  *throttle_disk;
 #endif
 
 #ifdef CONFIG_UPROBES
index 9f7fe35..d9c9770 100644 (file)
@@ -1044,7 +1044,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
 #endif
 
 #ifdef CONFIG_BLK_CGROUP
-       tsk->throttle_queue = NULL;
+       tsk->throttle_disk = NULL;
        tsk->use_memdelay = 0;
 #endif
 
index 908a529..3e0a742 100644 (file)
@@ -3642,7 +3642,7 @@ void __cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
         * We've already scheduled a throttle, avoid taking the global swap
         * lock.
         */
-       if (current->throttle_queue)
+       if (current->throttle_disk)
                return;
 
        spin_lock(&swap_avail_lock);