• Linus Walleij's avatar
    mmc: block: move single ioctl() commands to block requests · 614f0388
    Linus Walleij authored
    This wraps single ioctl() commands into block requests using
    the custom block layer request types REQ_OP_DRV_IN and
    REQ_OP_DRV_OUT.
    
    By doing this we are loosening the grip on the big host lock,
    since two calls to mmc_get_card()/mmc_put_card() are removed.
    
    We are storing the ioctl() in/out argument as a pointer in
    the per-request struct mmc_blk_request container. Since we
    now let the block layer allocate this data, blk_get_request()
    will allocate it for us and we can immediately dereference
    it and use it to pass the argument into the block layer.
    
    We refactor the if/else/if/else ladder in mmc_blk_issue_rq()
    as part of the job, keeping some extra attention to the
    case when a NULL req is passed into this function and
    making that pipeline flush more explicit.
    
    Tested on the ux500 with the userspace:
    mmc extcsd read /dev/mmcblk3
    resulting in a successful EXTCSD info dump back to the
    console.
    
    This commit fixes a starvation issue in the MMC/SD stack
    that can be easily provoked in the following way by
    issueing the following commands in sequence:
    
    > dd if=/dev/mmcblk3 of=/dev/null bs=1M &
    > mmc extcs read /dev/mmcblk3
    
    Before this patch, the extcsd read command would hang
    (starve) while waiting for the dd command to finish since
    the block layer was holding the card/host lock.
    
    After this patch, the extcsd ioctl() command is nicely
    interpersed with the rest of the block commands and we
    can issue a bunch of ioctl()s from userspace while there
    is some busy block IO going on without any problems.
    
    Conversely userspace ioctl()s can no longer starve
    the block layer by holding the card/host lock.
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Tested-by: default avatarAvri Altman <Avri.Altman@sandisk.com>
    614f0388
block.c 58.3 KB