IB/rdmavt: Add mad agents to rdmavt
This patch adds mad agent create and free to rdmavt. Reviewed-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
ff6acd6951
commit
3711baf27d
|
@ -45,6 +45,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <rdma/ib_mad.h>
|
||||
#include "mad.h"
|
||||
|
||||
/**
|
||||
|
@ -83,3 +84,74 @@ int rvt_process_mad(struct ib_device *ibdev, int mad_flags, u8 port,
|
|||
*/
|
||||
return IB_MAD_RESULT_FAILURE;
|
||||
}
|
||||
|
||||
static void rvt_send_mad_handler(struct ib_mad_agent *agent,
|
||||
struct ib_mad_send_wc *mad_send_wc)
|
||||
{
|
||||
ib_free_send_mad(mad_send_wc->send_buf);
|
||||
}
|
||||
|
||||
int rvt_create_mad_agents(struct rvt_dev_info *rdi)
|
||||
{
|
||||
struct ib_mad_agent *agent;
|
||||
struct rvt_ibport *rvp;
|
||||
int p;
|
||||
int ret;
|
||||
|
||||
for (p = 0; p < rdi->dparms.nports; p++) {
|
||||
rvp = rdi->ports[p];
|
||||
agent = ib_register_mad_agent(&rdi->ibdev, p + 1,
|
||||
IB_QPT_SMI,
|
||||
NULL, 0, rvt_send_mad_handler,
|
||||
NULL, NULL, 0);
|
||||
if (IS_ERR(agent)) {
|
||||
ret = PTR_ERR(agent);
|
||||
goto err;
|
||||
}
|
||||
|
||||
rvp->send_agent = agent;
|
||||
|
||||
if (rdi->driver_f.notify_create_mad_agent)
|
||||
rdi->driver_f.notify_create_mad_agent(rdi, p);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
for (p = 0; p < rdi->dparms.nports; p++) {
|
||||
rvp = rdi->ports[p];
|
||||
if (rvp->send_agent) {
|
||||
agent = rvp->send_agent;
|
||||
rvp->send_agent = NULL;
|
||||
ib_unregister_mad_agent(agent);
|
||||
if (rdi->driver_f.notify_free_mad_agent)
|
||||
rdi->driver_f.notify_free_mad_agent(rdi, p);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void rvt_free_mad_agents(struct rvt_dev_info *rdi)
|
||||
{
|
||||
struct ib_mad_agent *agent;
|
||||
struct rvt_ibport *rvp;
|
||||
int p;
|
||||
|
||||
for (p = 0; p < rdi->dparms.nports; p++) {
|
||||
rvp = rdi->ports[p];
|
||||
if (rvp->send_agent) {
|
||||
agent = rvp->send_agent;
|
||||
rvp->send_agent = NULL;
|
||||
ib_unregister_mad_agent(agent);
|
||||
}
|
||||
if (rvp->sm_ah) {
|
||||
ib_destroy_ah(&rvp->sm_ah->ibah);
|
||||
rvp->sm_ah = NULL;
|
||||
}
|
||||
|
||||
if (rdi->driver_f.notify_free_mad_agent)
|
||||
rdi->driver_f.notify_free_mad_agent(rdi, p);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -55,5 +55,6 @@ int rvt_process_mad(struct ib_device *ibdev, int mad_flags, u8 port,
|
|||
const struct ib_mad_hdr *in, size_t in_mad_size,
|
||||
struct ib_mad_hdr *out, size_t *out_mad_size,
|
||||
u16 *out_mad_pkey_index);
|
||||
|
||||
int rvt_create_mad_agents(struct rvt_dev_info *rdi);
|
||||
void rvt_free_mad_agents(struct rvt_dev_info *rdi);
|
||||
#endif /* DEF_RVTMAD_H */
|
||||
|
|
|
@ -416,6 +416,8 @@ int rvt_register_device(struct rvt_dev_info *rdi)
|
|||
goto bail_cq;
|
||||
}
|
||||
|
||||
rvt_create_mad_agents(rdi);
|
||||
|
||||
rvt_pr_info(rdi, "Registration with rdmavt done.\n");
|
||||
return ret;
|
||||
|
||||
|
@ -438,6 +440,8 @@ void rvt_unregister_device(struct rvt_dev_info *rdi)
|
|||
if (!rdi)
|
||||
return;
|
||||
|
||||
rvt_free_mad_agents(rdi);
|
||||
|
||||
ib_unregister_device(&rdi->ibdev);
|
||||
rvt_cq_exit(rdi);
|
||||
rvt_mr_exit(rdi);
|
||||
|
|
|
@ -59,6 +59,7 @@
|
|||
#include "mcast.h"
|
||||
#include "mmap.h"
|
||||
#include "cq.h"
|
||||
#include "mad.h"
|
||||
|
||||
#define rvt_pr_info(rdi, fmt, ...) \
|
||||
__rvt_pr_info(rdi->driver_f.get_pci_dev(rdi), \
|
||||
|
|
|
@ -136,7 +136,8 @@ struct rvt_ibport {
|
|||
*/
|
||||
u16 *pkey_table;
|
||||
|
||||
/* TODO: Move sm_ah and smi_ah into here as well*/
|
||||
struct rvt_ah *sm_ah;
|
||||
struct rvt_ah *smi_ah;
|
||||
};
|
||||
|
||||
#define RVT_CQN_MAX 16 /* maximum length of cq name */
|
||||
|
@ -263,6 +264,9 @@ struct rvt_driver_provided {
|
|||
int attr_mask, struct ib_udata *udata);
|
||||
void (*modify_qp)(struct rvt_qp *qp, struct ib_qp_attr *attr,
|
||||
int attr_mask, struct ib_udata *udata);
|
||||
|
||||
void (*notify_create_mad_agent)(struct rvt_dev_info *rdi, int port_idx);
|
||||
void (*notify_free_mad_agent)(struct rvt_dev_info *rdi, int port_idx);
|
||||
};
|
||||
|
||||
struct rvt_dev_info {
|
||||
|
|
Loading…
Reference in a new issue