Lines Matching defs:mad_agent_priv

99 static void cancel_mads(struct ib_mad_agent_private *mad_agent_priv);
230 struct ib_mad_agent_private *mad_agent_priv;
366 mad_agent_priv = kzalloc(sizeof *mad_agent_priv, GFP_KERNEL);
367 if (!mad_agent_priv) {
381 mad_agent_priv->qp_info = &port_priv->qp_info[qpn];
382 mad_agent_priv->reg_req = reg_req;
383 mad_agent_priv->agent.rmpp_version = rmpp_version;
384 mad_agent_priv->agent.device = device;
385 mad_agent_priv->agent.recv_handler = recv_handler;
386 mad_agent_priv->agent.send_handler = send_handler;
387 mad_agent_priv->agent.context = context;
388 mad_agent_priv->agent.qp = port_priv->qp_info[qpn].qp;
389 mad_agent_priv->agent.port_num = port_num;
390 mad_agent_priv->agent.flags = registration_flags;
391 spin_lock_init(&mad_agent_priv->lock);
392 INIT_LIST_HEAD(&mad_agent_priv->send_list);
393 INIT_LIST_HEAD(&mad_agent_priv->wait_list);
394 INIT_LIST_HEAD(&mad_agent_priv->done_list);
395 INIT_LIST_HEAD(&mad_agent_priv->rmpp_list);
396 INIT_DELAYED_WORK(&mad_agent_priv->timed_work, timeout_sends);
397 INIT_LIST_HEAD(&mad_agent_priv->local_list);
398 INIT_WORK(&mad_agent_priv->local_work, local_completions);
399 refcount_set(&mad_agent_priv->refcount, 1);
400 init_completion(&mad_agent_priv->comp);
402 ret2 = ib_mad_agent_security_setup(&mad_agent_priv->agent, qp_type);
412 ret2 = xa_alloc_cyclic(&ib_mad_clients, &mad_agent_priv->agent.hi_tid,
413 mad_agent_priv, XA_LIMIT(0, (1 << 24) - 1),
438 ret2 = add_nonoui_reg_req(mad_reg_req, mad_agent_priv,
454 ret2 = add_oui_reg_req(mad_reg_req, mad_agent_priv);
463 trace_ib_mad_create_agent(mad_agent_priv);
464 return &mad_agent_priv->agent;
467 xa_erase(&ib_mad_clients, mad_agent_priv->agent.hi_tid);
469 ib_mad_agent_security_cleanup(&mad_agent_priv->agent);
473 kfree(mad_agent_priv);
479 static inline void deref_mad_agent(struct ib_mad_agent_private *mad_agent_priv)
481 if (refcount_dec_and_test(&mad_agent_priv->refcount))
482 complete(&mad_agent_priv->comp);
485 static void unregister_mad_agent(struct ib_mad_agent_private *mad_agent_priv)
490 trace_ib_mad_unregister_agent(mad_agent_priv);
496 cancel_mads(mad_agent_priv);
497 port_priv = mad_agent_priv->qp_info->port_priv;
498 cancel_delayed_work(&mad_agent_priv->timed_work);
501 remove_mad_reg_req(mad_agent_priv);
503 xa_erase(&ib_mad_clients, mad_agent_priv->agent.hi_tid);
507 deref_mad_agent(mad_agent_priv);
508 wait_for_completion(&mad_agent_priv->comp);
509 ib_cancel_rmpp_recvs(mad_agent_priv);
511 ib_mad_agent_security_cleanup(&mad_agent_priv->agent);
513 kfree(mad_agent_priv->reg_req);
514 kfree_rcu(mad_agent_priv, rcu);
524 struct ib_mad_agent_private *mad_agent_priv;
526 mad_agent_priv = container_of(mad_agent,
529 unregister_mad_agent(mad_agent_priv);
593 static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
604 struct ib_device *device = mad_agent_priv->agent.device;
608 size_t mad_size = port_mad_size(mad_agent_priv->qp_info->port_priv);
611 bool opa = rdma_cap_opa_mad(mad_agent_priv->qp_info->port_priv->device,
612 mad_agent_priv->qp_info->port_priv->port_num);
618 port_num = mad_agent_priv->agent.port_num;
688 build_smp_wc(mad_agent_priv->agent.qp,
707 mad_agent_priv->agent.recv_handler) {
709 local->recv_mad_agent = mad_agent_priv;
714 refcount_inc(&mad_agent_priv->refcount);
723 port_priv = ib_get_mad_port(mad_agent_priv->agent.device,
724 mad_agent_priv->agent.port_num);
754 refcount_inc(&mad_agent_priv->refcount);
756 spin_lock_irqsave(&mad_agent_priv->lock, flags);
757 list_add_tail(&local->completion_list, &mad_agent_priv->local_list);
758 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
759 queue_work(mad_agent_priv->qp_info->port_priv->wq,
760 &mad_agent_priv->local_work);
816 rmpp_mad->rmpp_hdr.rmpp_version = send_wr->mad_agent_priv->
839 struct ib_mad_agent_private *mad_agent_priv;
846 mad_agent_priv = container_of(mad_agent, struct ib_mad_agent_private,
878 mad_send_wr->mad_agent_priv = mad_agent_priv;
911 refcount_inc(&mad_agent_priv->refcount);
979 struct ib_mad_agent_private *mad_agent_priv;
982 mad_agent_priv = container_of(send_buf->mad_agent,
989 deref_mad_agent(mad_agent_priv);
1003 qp_info = mad_send_wr->mad_agent_priv->qp_info;
1065 struct ib_mad_agent_private *mad_agent_priv;
1076 mad_agent_priv = mad_send_wr->mad_agent_priv;
1078 ret = ib_mad_enforce_security(mad_agent_priv,
1091 if (mad_agent_priv->agent.rmpp_version) {
1107 ret = handle_outgoing_dr_smp(mad_agent_priv,
1126 refcount_inc(&mad_agent_priv->refcount);
1127 spin_lock_irqsave(&mad_agent_priv->lock, flags);
1129 &mad_agent_priv->send_list);
1130 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1132 if (ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)) {
1140 spin_lock_irqsave(&mad_agent_priv->lock, flags);
1142 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1143 deref_mad_agent(mad_agent_priv);
1649 static int is_rmpp_data_mad(const struct ib_mad_agent_private *mad_agent_priv,
1655 return !mad_agent_priv->agent.rmpp_version ||
1656 !ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent) ||
1670 rcv_has_same_gid(const struct ib_mad_agent_private *mad_agent_priv,
1677 struct ib_device *device = mad_agent_priv->agent.device;
1678 u32 port_num = mad_agent_priv->agent.port_num;
1732 ib_find_send_mad(const struct ib_mad_agent_private *mad_agent_priv,
1740 list_for_each_entry(wr, &mad_agent_priv->wait_list, agent_list) {
1748 rcv_has_same_gid(mad_agent_priv, wr, wc)))
1756 list_for_each_entry(wr, &mad_agent_priv->send_list, agent_list) {
1757 if (is_rmpp_data_mad(mad_agent_priv, wr->send_buf.mad) &&
1766 rcv_has_same_gid(mad_agent_priv, wr, wc)))
1778 &mad_send_wr->mad_agent_priv->done_list);
1781 static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
1790 ret = ib_mad_enforce_security(mad_agent_priv,
1794 deref_mad_agent(mad_agent_priv);
1799 if (ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)) {
1800 mad_recv_wc = ib_process_rmpp_recv_wc(mad_agent_priv,
1803 deref_mad_agent(mad_agent_priv);
1810 spin_lock_irqsave(&mad_agent_priv->lock, flags);
1811 mad_send_wr = ib_find_send_mad(mad_agent_priv, mad_recv_wc);
1813 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1814 if (!ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)
1821 mad_agent_priv->agent.recv_handler(
1822 &mad_agent_priv->agent, NULL,
1824 deref_mad_agent(mad_agent_priv);
1830 deref_mad_agent(mad_agent_priv);
1835 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1838 mad_agent_priv->agent.recv_handler(
1839 &mad_agent_priv->agent,
1842 deref_mad_agent(mad_agent_priv);
1850 mad_agent_priv->agent.recv_handler(&mad_agent_priv->agent, NULL,
1852 deref_mad_agent(mad_agent_priv);
2148 static void adjust_timeout(struct ib_mad_agent_private *mad_agent_priv)
2153 if (list_empty(&mad_agent_priv->wait_list)) {
2154 cancel_delayed_work(&mad_agent_priv->timed_work);
2156 mad_send_wr = list_entry(mad_agent_priv->wait_list.next,
2160 if (time_after(mad_agent_priv->timeout,
2162 mad_agent_priv->timeout = mad_send_wr->timeout;
2166 mod_delayed_work(mad_agent_priv->qp_info->port_priv->wq,
2167 &mad_agent_priv->timed_work, delay);
2174 struct ib_mad_agent_private *mad_agent_priv;
2179 mad_agent_priv = mad_send_wr->mad_agent_priv;
2186 list_for_each_prev(list_item, &mad_agent_priv->wait_list) {
2195 list_item = &mad_agent_priv->wait_list;
2201 if (mad_agent_priv->wait_list.next == &mad_send_wr->agent_list)
2202 mod_delayed_work(mad_agent_priv->qp_info->port_priv->wq,
2203 &mad_agent_priv->timed_work, delay);
2219 struct ib_mad_agent_private *mad_agent_priv;
2223 mad_agent_priv = mad_send_wr->mad_agent_priv;
2224 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2225 if (ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)) {
2248 adjust_timeout(mad_agent_priv);
2249 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2256 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
2260 deref_mad_agent(mad_agent_priv);
2263 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2291 trace_ib_mad_send_done_agent(mad_send_wr->mad_agent_priv);
2399 static void cancel_mads(struct ib_mad_agent_private *mad_agent_priv)
2408 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2410 &mad_agent_priv->send_list, agent_list) {
2418 list_splice_init(&mad_agent_priv->wait_list, &cancel_list);
2419 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2429 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
2431 deref_mad_agent(mad_agent_priv);
2436 find_send_wr(struct ib_mad_agent_private *mad_agent_priv,
2441 list_for_each_entry(mad_send_wr, &mad_agent_priv->wait_list,
2447 list_for_each_entry(mad_send_wr, &mad_agent_priv->send_list,
2449 if (is_rmpp_data_mad(mad_agent_priv,
2459 struct ib_mad_agent_private *mad_agent_priv;
2467 mad_agent_priv = container_of(send_buf->mad_agent,
2469 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2470 mad_send_wr = find_send_wr(mad_agent_priv, send_buf);
2472 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2488 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2495 struct ib_mad_agent_private *mad_agent_priv;
2504 mad_agent_priv =
2507 opa = rdma_cap_opa_mad(mad_agent_priv->qp_info->port_priv->device,
2508 mad_agent_priv->qp_info->port_priv->port_num);
2510 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2511 while (!list_empty(&mad_agent_priv->local_list)) {
2512 local = list_entry(mad_agent_priv->local_list.next,
2516 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2522 dev_err(&mad_agent_priv->agent.device->dev,
2569 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
2572 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2573 deref_mad_agent(mad_agent_priv);
2578 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2593 if (ib_mad_kernel_rmpp_agent(&mad_send_wr->mad_agent_priv->agent)) {
2612 &mad_send_wr->mad_agent_priv->send_list);
2619 struct ib_mad_agent_private *mad_agent_priv;
2624 mad_agent_priv = container_of(work, struct ib_mad_agent_private,
2628 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2629 while (!list_empty(&mad_agent_priv->wait_list)) {
2630 mad_send_wr = list_entry(mad_agent_priv->wait_list.next,
2638 queue_delayed_work(mad_agent_priv->qp_info->
2640 &mad_agent_priv->timed_work, delay);
2649 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2656 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
2659 deref_mad_agent(mad_agent_priv);
2660 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2662 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);