• V
    cfq-iosched: Fix a possible race with cfq cgroup removal code · 56edf7d7
    Vivek Goyal 提交于
    blkg->key = cfqd is an rcu protected pointer and hence we used to do
    call_rcu(cfqd->rcu_head) to free up cfqd after one rcu grace period.
    
    The problem here is that even though cfqd is around, there are no
    gurantees that associated request queue (td->queue) or q->queue_lock
    is still around. A driver might have called blk_cleanup_queue() and
    release the lock.
    
    It might happen that after freeing up the lock we call
    blkg->key->queue->queue_ock and crash. This is possible in following
    path.
    
    blkiocg_destroy()
     blkio_unlink_group_fn()
      cfq_unlink_blkio_group()
    
    Hence, wait for an rcu peirod if there are groups which have not
    been unlinked from blkcg->blkg_list. That way, if there are any groups
    which are taking cfq_unlink_blkio_group() path, can safely take queue
    lock.
    
    This is how we have taken care of race in throttling logic also.
    Signed-off-by: NVivek Goyal <vgoyal@redhat.com>
    Signed-off-by: NJens Axboe <jaxboe@fusionio.com>
    56edf7d7
cfq-iosched.c 105.3 KB