• Xiubo Li's avatar
    tcmu: Add global data block pool support · b6df4b79
    Xiubo Li authored
    For each target there will be one ring, when the target number
    grows larger and larger, it could eventually runs out of the
    system memories.
    
    In this patch for each target ring, currently for the cmd area
    the size will be fixed to 8MB and for the data area the size
    will grow from 0 to max 256K * PAGE_SIZE(1G for 4K page size).
    
    For all the targets' data areas, they will get empty blocks
    from the "global data block pool", which has limited to 512K *
    PAGE_SIZE(2G for 4K page size) for now.
    
    When the "global data block pool" has been used up, then any
    target could wake up the unmap thread routine to shrink other
    targets' data area memories. And the unmap thread routine will
    always try to truncate the ring vma from the last using block
    offset.
    
    When user space has touched the data blocks out of tcmu_cmd
    iov[], the tcmu_page_fault() will try to return one zeroed blocks.
    
    Here we move the timeout's tcmu_handle_completions() into unmap
    thread routine, that's to say when the timeout fired, it will
    only do the tcmu_check_expired_cmd() and then wake up the unmap
    thread to do the completions() and then try to shrink its idle
    memories. Then the cmdr_lock could be a mutex and could simplify
    this patch because the unmap_mapping_range() or zap_* may go to
    sleep.
    Signed-off-by: default avatarXiubo Li <lixiubo@cmss.chinamobile.com>
    Signed-off-by: default avatarJianfei Hu <hujianfei@cmss.chinamobile.com>
    Acked-by: default avatarMike Christie <mchristi@redhat.com>
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    b6df4b79
target_core_user.c 41.3 KB