Loading drivers/infiniband/sw/rdmavt/mad.c +72 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ * */ #include <rdma/ib_mad.h> #include "mad.h" /** Loading Loading @@ -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); } } drivers/infiniband/sw/rdmavt/mad.h +2 −1 Original line number Diff line number Diff line Loading @@ -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 */ drivers/infiniband/sw/rdmavt/vt.c +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading drivers/infiniband/sw/rdmavt/vt.h +1 −0 Original line number Diff line number Diff line Loading @@ -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), \ Loading include/rdma/rdma_vt.h +5 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 Loading
drivers/infiniband/sw/rdmavt/mad.c +72 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ * */ #include <rdma/ib_mad.h> #include "mad.h" /** Loading Loading @@ -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); } }
drivers/infiniband/sw/rdmavt/mad.h +2 −1 Original line number Diff line number Diff line Loading @@ -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 */
drivers/infiniband/sw/rdmavt/vt.c +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading
drivers/infiniband/sw/rdmavt/vt.h +1 −0 Original line number Diff line number Diff line Loading @@ -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), \ Loading
include/rdma/rdma_vt.h +5 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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