mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +00:00
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: 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>
This commit is contained in:
parent
84d7d462b1
commit
f05837ed73
@ -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 @@ void blkcg_maybe_throttle_current(void)
|
||||
*/
|
||||
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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user