Commit f05837ed authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

blk-cgroup: store a gendisk to throttle in struct task_struct

Switch from a request_queue pointer and reference to a gendisk once
for the throttle information in struct task_struct.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarAndreas Herrmann <aherrmann@suse.de>
Link: https://lore.kernel.org/r/20230203150400.3199230-8-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 84d7d462
...@@ -1362,9 +1362,9 @@ static void blkcg_bind(struct cgroup_subsys_state *root_css) ...@@ -1362,9 +1362,9 @@ static void blkcg_bind(struct cgroup_subsys_state *root_css)
static void blkcg_exit(struct task_struct *tsk) static void blkcg_exit(struct task_struct *tsk)
{ {
if (tsk->throttle_queue) if (tsk->throttle_disk)
blk_put_queue(tsk->throttle_queue); put_disk(tsk->throttle_disk);
tsk->throttle_queue = NULL; tsk->throttle_disk = NULL;
} }
struct cgroup_subsys io_cgrp_subsys = { struct cgroup_subsys io_cgrp_subsys = {
...@@ -1815,29 +1815,29 @@ static void blkcg_maybe_throttle_blkg(struct blkcg_gq *blkg, bool use_memdelay) ...@@ -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 * 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 * 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 * 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 * to be called by people willy-nilly as it will actually do the work to
* throttle the task if it is setup for throttling. * throttle the task if it is setup for throttling.
*/ */
void blkcg_maybe_throttle_current(void) void blkcg_maybe_throttle_current(void)
{ {
struct request_queue *q = current->throttle_queue; struct gendisk *disk = current->throttle_disk;
struct blkcg *blkcg; struct blkcg *blkcg;
struct blkcg_gq *blkg; struct blkcg_gq *blkg;
bool use_memdelay = current->use_memdelay; bool use_memdelay = current->use_memdelay;
if (!q) if (!disk)
return; return;
current->throttle_queue = NULL; current->throttle_disk = NULL;
current->use_memdelay = false; current->use_memdelay = false;
rcu_read_lock(); rcu_read_lock();
blkcg = css_to_blkcg(blkcg_css()); blkcg = css_to_blkcg(blkcg_css());
if (!blkcg) if (!blkcg)
goto out; goto out;
blkg = blkg_lookup(blkcg, q); blkg = blkg_lookup(blkcg, disk->queue);
if (!blkg) if (!blkg)
goto out; goto out;
if (!blkg_tryget(blkg)) if (!blkg_tryget(blkg))
...@@ -1846,11 +1846,10 @@ void blkcg_maybe_throttle_current(void) ...@@ -1846,11 +1846,10 @@ void blkcg_maybe_throttle_current(void)
blkcg_maybe_throttle_blkg(blkg, use_memdelay); blkcg_maybe_throttle_blkg(blkg, use_memdelay);
blkg_put(blkg); blkg_put(blkg);
blk_put_queue(q); put_disk(disk);
return; return;
out: out:
rcu_read_unlock(); rcu_read_unlock();
blk_put_queue(q);
} }
/** /**
...@@ -1872,18 +1871,17 @@ void blkcg_maybe_throttle_current(void) ...@@ -1872,18 +1871,17 @@ void blkcg_maybe_throttle_current(void)
*/ */
void blkcg_schedule_throttle(struct gendisk *disk, bool use_memdelay) void blkcg_schedule_throttle(struct gendisk *disk, bool use_memdelay)
{ {
struct request_queue *q = disk->queue;
if (unlikely(current->flags & PF_KTHREAD)) if (unlikely(current->flags & PF_KTHREAD))
return; return;
if (current->throttle_queue != q) { if (current->throttle_disk != disk) {
if (!blk_get_queue(q)) if (test_bit(GD_DEAD, &disk->state))
return; return;
get_device(disk_to_dev(disk));
if (current->throttle_queue) if (current->throttle_disk)
blk_put_queue(current->throttle_queue); put_disk(current->throttle_disk);
current->throttle_queue = q; current->throttle_disk = disk;
} }
if (use_memdelay) if (use_memdelay)
......
...@@ -1436,7 +1436,7 @@ struct task_struct { ...@@ -1436,7 +1436,7 @@ struct task_struct {
#endif #endif
#ifdef CONFIG_BLK_CGROUP #ifdef CONFIG_BLK_CGROUP
struct request_queue *throttle_queue; struct gendisk *throttle_disk;
#endif #endif
#ifdef CONFIG_UPROBES #ifdef CONFIG_UPROBES
......
...@@ -1044,7 +1044,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node) ...@@ -1044,7 +1044,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
#endif #endif
#ifdef CONFIG_BLK_CGROUP #ifdef CONFIG_BLK_CGROUP
tsk->throttle_queue = NULL; tsk->throttle_disk = NULL;
tsk->use_memdelay = 0; tsk->use_memdelay = 0;
#endif #endif
......
...@@ -3642,7 +3642,7 @@ void __cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask) ...@@ -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 * We've already scheduled a throttle, avoid taking the global swap
* lock. * lock.
*/ */
if (current->throttle_queue) if (current->throttle_disk)
return; return;
spin_lock(&swap_avail_lock); spin_lock(&swap_avail_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment