Jack Morgenstein wrote:
Actually, we did not break the ABI for XRC (we had to do cartwheels to avoid 
this, but what the heck).

The create_flags field was added ONLY to struct ib_qp_init_attr (kernel only),
and was not exported upwards to the userspace API (so as not to break the ABI).

I got around the create_flags problem by adding a new verb to userspace
(ibv_create_xrc_rcv_qp() ) with its own ABI to kernel space.  Since the kernel space 
function (added to uverbs_cmd: ib_uverbs_create_xrc_rcv_qp() ) "knew" that it 
was creating an XRC_RCV qp, it set the flag in ib_qp_init_attr appropriately.

Additionally, Eli did not need user-space involvement for his LSO flag -- so we 
escaped needing to increment the ABI version number.

If we need to use the create_flags field in userspace, we WILL need to break 
the ABI.

You can avoid doing this in one of 2 ways:
Either:  create a new QP type
Or:      add new verbs to the core.
Jack,

I am trying to figure out what would be the least painful way to allow for specifi

Looking on the libibverbs - XRC instance (git://git.openfabrics.org/ofed_1_3/libibverbs.git) and re-reading your email, my understanding is that the way you went was

1. add a new field at the end of struct ibv_qp_init_attr
2. add bunch of new XRC verbs packed in struct ibv_xrc_ops
3. both create_qp & create_xrc_rcv_qp get ibv_qp_init_attr, the latter looks on the xrc field
4. add ibv_xrc_ops at the end of the ibv_context

I have pasted below the relevant code from verbs.h, as I can't point on one patch that does this all, since there were some fixes/changes since the initial commit.

So if we want to have qp creation verb that gets creation flags, we can can

A. add create_flags field to the end of ibv_qp_init_attr
B. introduce struct ibv_qp * (*create_qp_ext)(struct ibv_pd *pd, struct ibv_qp_init_attr *attr) C. enhance struct ibv_context similarily to what was done for xrc This seems to bring to minimum the breakage from the perspective of libibverbs consumers.

As for taking this down to uverbs, I am fine with anything you suggest.

Or.
struct ibv_qp_init_attr {
        void                   *qp_context;
        struct ibv_cq          *send_cq;
        struct ibv_cq          *recv_cq;
        struct ibv_srq         *srq;
        struct ibv_qp_cap       cap;
        enum ibv_qp_type        qp_type;
        int                     sq_sig_all;
        struct ibv_xrc_domain  *xrc_domain;
};

struct ibv_qp * (*create_qp)(struct ibv_pd *pd, struct ibv_qp_init_attr *attr);

struct ibv_xrc_ops {
        ...
        int (*create_xrc_rcv_qp)(struct ibv_qp_init_attr *init_attr, uint32_t 
*xrc_qp_num);
        ...
};

struct ibv_context {
        struct ibv_device      *device;
        struct ibv_context_ops  ops;
        int                     cmd_fd;
        int                     async_fd;
        int                     num_comp_vectors;
        pthread_mutex_t         mutex;
        void                   *abi_compat;
        struct ibv_xrc_ops     *xrc_ops;
};





_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to