• Xiubo Li's avatar
    tcmu: Add dynamic growing data area feature support · 141685a3
    Xiubo Li authored
    Currently for the TCMU, the ring buffer size is fixed to 64K cmd
    area + 1M data area, and this will be bottlenecks for high iops.
    
    The struct tcmu_cmd_entry {} size is fixed about 112 bytes with
    iovec[N] & N <= 4, and the size of struct iovec is about 16 bytes.
    
    If N == 0, the ratio will be sizeof(cmd entry) : sizeof(datas) ==
    112Bytes : (N * 4096)Bytes = 28 : 0, no data area is need.
    
    If 0 < N <=4, the ratio will be sizeof(cmd entry) : sizeof(datas)
    == 112Bytes : (N * 4096)Bytes = 28 : (N * 1024), so the max will
    be 28 : 1024.
    
    If N > 4, the sizeof(cmd entry) will be [(N - 4) *16 + 112] bytes,
    and its corresponding data size will be [N * 4096], so the ratio
    of sizeof(cmd entry) : sizeof(datas) == [(N - 4) * 16 + 112)Bytes
    : (N * 4096)Bytes == 4/1024 - 12/(N * 1024), so the max is about
    4 : 1024.
    
    When N is bigger, the ratio will be smaller.
    
    As the initial patch, we will set the cmd area size to 2M, and
    the cmd area size to 32M. The TCMU will dynamically grows the data
    area from 0 to max 32M size as needed.
    
    The cmd area memory will be allocated through vmalloc(), and the
    data area's blocks will be allocated individually later when needed.
    
    The allocated data area block memory will be managed via radix tree.
    For now the bitmap still be the most efficient way to search and
    manage the block index, this could be update later.
    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>
    141685a3
target_core_user.c 36.3 KB