A set of percpu lockless lists per block cgroup (blkcg) is added to track the set of recently updated iostat_cpu structures. Add comment in the code to document the design of this new set of lockless lists. Signed-off-by: Waiman Long <longman@xxxxxxxxxx> --- block/blk-cgroup.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 8af97f3b2fc9..f8f27551c16a 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c @@ -60,6 +60,21 @@ static struct workqueue_struct *blkcg_punt_bio_wq; #define BLKG_DESTROY_BATCH_SIZE 64 /* + * Lockless lists for tracking IO stats update + * + * New IO stats are stored in the percpu iostat_cpu within blkcg_gq (blkg). + * There are multiple blkg's (one for each block device) attached to each + * blkcg. The rstat code keeps track of which cpu has IO stats updated, + * but it doesn't know which blkg has the updated stats. If there are many + * block devices in a system, the cost of iterating all the blkg's to flush + * out the IO stats can be high. To reduce such overhead, a set of percpu + * lockless lists (lhead) per blkcg are used to track the set of recently + * updated iostat_cpu's since the last flush. An iostat_cpu will be put + * onto the lockless list on the update side [blk_cgroup_bio_start()] if + * not there yet and then removed when being flushed [blkcg_rstat_flush()]. + * References to blkg are gotten and then put back in the process to + * protect against blkg removal. + * * lnode.next of the last entry in a lockless list is NULL. To enable us to * use lnode.next as a boolean flag to indicate its presence in a lockless * list, we have to make it non-NULL for all. This is done by using a -- 2.31.1