• Igor Ivanov's avatar
    IB/core: Infrastructure for extensible uverbs commands · 400dbc96
    Igor Ivanov authored
    Add infrastructure to support extended uverbs capabilities in a
    forward/backward manner.  Uverbs command opcodes which are based on
    the verbs extensions approach should be greater or equal to
    IB_USER_VERBS_CMD_THRESHOLD.  They have new header format and
    processed a bit differently.
    
    Whenever a specific IB_USER_VERBS_CMD_XXX is extended, which practically means
    it needs to have additional arguments, we will be able to add them without creating
    a completely new IB_USER_VERBS_CMD_YYY command or bumping the uverbs ABI version.
    
    This patch for itself doesn't provide the whole scheme which is also dependent
    on adding a comp_mask field to each extended uverbs command struct.
    
    The new header framework allows for future extension of the CMD arguments
    (ib_uverbs_cmd_hdr.in_words, ib_uverbs_cmd_hdr.out_words) for an existing
    new command (that is a command that supports the new uverbs command header format
    suggested in this patch) w/o bumping ABI version and with maintaining backward
    and formward compatibility to new and old libibverbs versions.
    
    In the uverbs command we are passing both uverbs arguments and the provider arguments.
    We split the ib_uverbs_cmd_hdr.in_words to ib_uverbs_cmd_hdr.in_words which will now carry only
    uverbs input argument struct size and  ib_uverbs_cmd_hdr.provider_in_words that will carry
    the provider input argument size. Same goes for the response (the uverbs CMD output argument).
    
    For example take the create_cq call and the mlx4_ib provider:
    
    The uverbs layer gets libibverb's struct ibv_create_cq (named struct ib_uverbs_create_cq
    in the kernel), mlx4_ib gets libmlx4's struct mlx4_create_cq (which includes struct
    ibv_create_cq and is named struct mlx4_ib_create_cq in the kernel) and
    in_words = sizeof(mlx4_create_cq)/4 .
    
    Thus ib_uverbs_cmd_hdr.in_words carry both uverbs plus mlx4_ib input argument sizes,
    where uverbs assumes it knows the size of its input argument - struct ibv_create_cq.
    
    Now, if we wish to add a variable to struct ibv_create_cq, we can add a comp_mask field
    to the struct which is basically bit field indicating which fields exists in the struct
    (as done for the libibverbs API extension), but we need a way to tell what is the total
    size of the struct and not assume the struct size is predefined (since we may get different
    struct sizes from different user libibverbs versions). So we know at which point the
    provider input argument (struct mlx4_create_cq) begins. Same goes for extending the
    provider struct mlx4_create_cq. Thus we split the ib_uverbs_cmd_hdr.in_words to
    ib_uverbs_cmd_hdr.in_words which will now carry only uverbs input argument struct size and
    ib_uverbs_cmd_hdr.provider_in_words that will carry the provider (mlx4_ib) input argument size.
    Signed-off-by: default avatarIgor Ivanov <Igor.Ivanov@itseez.com>
    Signed-off-by: default avatarHadar Hen Zion <hadarh@mellanox.com>
    Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    400dbc96
ib_user_verbs.h 14.5 KB