Lines Matching refs:work
95 struct cm_work *work);
186 struct delayed_work work; member
197 struct cm_work work; member
269 static void cm_work_handler(struct work_struct *work);
696 __be32 remote_id = timewait_info->work.remote_id; in cm_insert_remote_id()
702 if (be32_lt(remote_id, cur_timewait_info->work.remote_id)) in cm_insert_remote_id()
704 else if (be32_gt(remote_id, cur_timewait_info->work.remote_id)) in cm_insert_remote_id()
730 if (be32_lt(remote_id, timewait_info->work.remote_id)) in cm_find_remote_id()
732 else if (be32_gt(remote_id, timewait_info->work.remote_id)) in cm_find_remote_id()
739 res = cm_acquire_id(timewait_info->work.local_id, in cm_find_remote_id()
740 timewait_info->work.remote_id); in cm_find_remote_id()
874 struct cm_work *work; in cm_dequeue_work() local
879 work = list_entry(cm_id_priv->work_list.next, struct cm_work, list); in cm_dequeue_work()
880 list_del(&work->list); in cm_dequeue_work()
881 return work; in cm_dequeue_work()
884 static void cm_free_work(struct cm_work *work) in cm_free_work() argument
886 if (work->mad_recv_wc) in cm_free_work()
887 ib_free_recv_mad(work->mad_recv_wc); in cm_free_work()
888 kfree(work); in cm_free_work()
892 struct cm_work *work) in cm_queue_work_unlock() argument
906 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_queue_work_unlock()
918 cm_process_work(cm_id_priv, work); in cm_queue_work_unlock()
969 timewait_info->work.local_id = local_id; in cm_create_timewait_info()
970 INIT_DELAYED_WORK(&timewait_info->work.work, cm_work_handler); in cm_create_timewait_info()
971 timewait_info->work.cm_event.event = IB_CM_TIMEWAIT_EXIT; in cm_create_timewait_info()
1003 queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work, in cm_enter_timewait()
1011 BUILD_BUG_ON(offsetof(struct cm_timewait_info, work) != 0); in cm_enter_timewait()
1045 struct cm_work *work; in cm_destroy_id() local
1163 while ((work = cm_dequeue_work(cm_id_priv)) != NULL) in cm_destroy_id()
1164 cm_free_work(work); in cm_destroy_id()
1757 static u16 cm_get_bth_pkey(struct cm_work *work) in cm_get_bth_pkey() argument
1759 struct ib_device *ib_dev = work->port->cm_dev->ib_device; in cm_get_bth_pkey()
1760 u32 port_num = work->port->port_num; in cm_get_bth_pkey()
1761 u16 pkey_index = work->mad_recv_wc->wc->pkey_index; in cm_get_bth_pkey()
1784 static void cm_opa_to_ib_sgid(struct cm_work *work, in cm_opa_to_ib_sgid() argument
1787 struct ib_device *dev = work->port->cm_dev->ib_device; in cm_opa_to_ib_sgid()
1788 u32 port_num = work->port->port_num; in cm_opa_to_ib_sgid()
1804 static void cm_format_req_event(struct cm_work *work, in cm_format_req_event() argument
1811 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_req_event()
1812 param = &work->cm_event.param.req_rcvd; in cm_format_req_event()
1814 param->bth_pkey = cm_get_bth_pkey(work); in cm_format_req_event()
1816 param->primary_path = &work->path[0]; in cm_format_req_event()
1817 cm_opa_to_ib_sgid(work, param->primary_path); in cm_format_req_event()
1819 param->alternate_path = &work->path[1]; in cm_format_req_event()
1820 cm_opa_to_ib_sgid(work, param->alternate_path); in cm_format_req_event()
1844 work->cm_event.private_data = in cm_format_req_event()
1849 struct cm_work *work) in cm_process_work() argument
1854 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &work->cm_event); in cm_process_work()
1855 cm_free_work(work); in cm_process_work()
1859 work = cm_dequeue_work(cm_id_priv); in cm_process_work()
1861 if (!work) in cm_process_work()
1865 &work->cm_event); in cm_process_work()
1866 cm_free_work(work); in cm_process_work()
1938 static void cm_dup_req_handler(struct cm_work *work, in cm_dup_req_handler() argument
1945 &work->port->counters[CM_RECV_DUPLICATES][CM_REQ_COUNTER]); in cm_dup_req_handler()
1955 ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, true, &msg); in cm_dup_req_handler()
1987 static struct cm_id_private *cm_match_req(struct cm_work *work, in cm_match_req() argument
1994 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_match_req()
2000 cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_match_req()
2001 timewait_info->work.remote_id); in cm_match_req()
2004 cm_dup_req_handler(work, cur_cm_id_priv); in cm_match_req()
2014 cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_match_req()
2015 timewait_info->work.remote_id); in cm_match_req()
2018 cm_issue_rej(work->port, work->mad_recv_wc, in cm_match_req()
2035 cm_issue_rej(work->port, work->mad_recv_wc, in cm_match_req()
2080 static int cm_req_handler(struct cm_work *work) in cm_req_handler() argument
2088 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_req_handler()
2091 cm_alloc_id_priv(work->port->cm_dev->ib_device, NULL, NULL); in cm_req_handler()
2116 ret = cm_init_av_for_response(work->port, work->mad_recv_wc->wc, in cm_req_handler()
2117 work->mad_recv_wc->recv_buf.grh, in cm_req_handler()
2128 cm_id_priv->timewait_info->work.remote_id = cm_id_priv->id.remote_id; in cm_req_handler()
2139 listen_cm_id_priv = cm_match_req(work, cm_id_priv); in cm_req_handler()
2147 memset(&work->path[0], 0, sizeof(work->path[0])); in cm_req_handler()
2149 memset(&work->path[1], 0, sizeof(work->path[1])); in cm_req_handler()
2154 work->path[0].rec_type = in cm_req_handler()
2157 cm_process_routed_req(req_msg, work->mad_recv_wc->wc); in cm_req_handler()
2159 work->port->cm_dev->ib_device, work->port->port_num, in cm_req_handler()
2160 &work->path[0], in cm_req_handler()
2165 work->path[1].rec_type = work->path[0].rec_type; in cm_req_handler()
2166 cm_format_paths_from_req(req_msg, &work->path[0], in cm_req_handler()
2167 &work->path[1], work->mad_recv_wc->wc); in cm_req_handler()
2169 sa_path_set_dmac(&work->path[0], in cm_req_handler()
2171 work->path[0].hop_limit = grh->hop_limit; in cm_req_handler()
2175 ret = cm_init_av_by_path(&work->path[0], gid_attr, &cm_id_priv->av); in cm_req_handler()
2179 err = rdma_query_gid(work->port->cm_dev->ib_device, in cm_req_handler()
2180 work->port->port_num, 0, in cm_req_handler()
2181 &work->path[0].sgid); in cm_req_handler()
2187 &work->path[0].sgid, in cm_req_handler()
2188 sizeof(work->path[0].sgid), in cm_req_handler()
2197 ret = cm_init_av_by_path(&work->path[1], NULL, in cm_req_handler()
2202 &work->path[0].sgid, in cm_req_handler()
2203 sizeof(work->path[0].sgid), NULL, 0); in cm_req_handler()
2210 cm_format_req_event(work, cm_id_priv, &listen_cm_id_priv->id); in cm_req_handler()
2218 cm_queue_work_unlock(cm_id_priv, work); in cm_req_handler()
2402 static void cm_format_rep_event(struct cm_work *work, enum ib_qp_type qp_type) in cm_format_rep_event() argument
2407 rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_rep_event()
2408 param = &work->cm_event.param.rep_rcvd; in cm_format_rep_event()
2426 work->cm_event.private_data = in cm_format_rep_event()
2430 static void cm_dup_rep_handler(struct cm_work *work) in cm_dup_rep_handler() argument
2437 rep_msg = (struct cm_rep_msg *) work->mad_recv_wc->recv_buf.mad; in cm_dup_rep_handler()
2445 &work->port->counters[CM_RECV_DUPLICATES][CM_REP_COUNTER]); in cm_dup_rep_handler()
2446 ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, true, &msg); in cm_dup_rep_handler()
2475 static int cm_rep_handler(struct cm_work *work) in cm_rep_handler() argument
2483 rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rep_handler()
2487 cm_dup_rep_handler(work); in cm_rep_handler()
2493 cm_format_rep_event(work, cm_id_priv->qp_type); in cm_rep_handler()
2510 cm_id_priv->timewait_info->work.remote_id = in cm_rep_handler()
2530 cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_rep_handler()
2531 timewait_info->work.remote_id); in cm_rep_handler()
2535 cm_issue_rej(work->port, work->mad_recv_wc, in cm_rep_handler()
2572 cm_queue_work_unlock(cm_id_priv, work); in cm_rep_handler()
2580 static int cm_establish_handler(struct cm_work *work) in cm_establish_handler() argument
2585 cm_id_priv = cm_acquire_id(work->local_id, work->remote_id); in cm_establish_handler()
2596 cm_queue_work_unlock(cm_id_priv, work); in cm_establish_handler()
2603 static int cm_rtu_handler(struct cm_work *work) in cm_rtu_handler() argument
2608 rtu_msg = (struct cm_rtu_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rtu_handler()
2615 work->cm_event.private_data = in cm_rtu_handler()
2622 atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] in cm_rtu_handler()
2629 cm_queue_work_unlock(cm_id_priv, work); in cm_rtu_handler()
2825 static int cm_dreq_handler(struct cm_work *work) in cm_dreq_handler() argument
2831 dreq_msg = (struct cm_dreq_msg *)work->mad_recv_wc->recv_buf.mad; in cm_dreq_handler()
2836 atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] in cm_dreq_handler()
2838 cm_issue_drep(work->port, work->mad_recv_wc); in cm_dreq_handler()
2845 work->cm_event.private_data = in cm_dreq_handler()
2865 atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] in cm_dreq_handler()
2867 msg = cm_alloc_response_msg_no_ah(work->port, work->mad_recv_wc, in cm_dreq_handler()
2877 if (cm_create_response_msg_ah(work->port, work->mad_recv_wc, msg) || in cm_dreq_handler()
2882 atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] in cm_dreq_handler()
2891 cm_queue_work_unlock(cm_id_priv, work); in cm_dreq_handler()
2899 static int cm_drep_handler(struct cm_work *work) in cm_drep_handler() argument
2904 drep_msg = (struct cm_drep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_drep_handler()
2911 work->cm_event.private_data = in cm_drep_handler()
2923 cm_queue_work_unlock(cm_id_priv, work); in cm_drep_handler()
3003 static void cm_format_rej_event(struct cm_work *work) in cm_format_rej_event() argument
3008 rej_msg = (struct cm_rej_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_rej_event()
3009 param = &work->cm_event.param.rej_rcvd; in cm_format_rej_event()
3013 work->cm_event.private_data = in cm_format_rej_event()
3041 static int cm_rej_handler(struct cm_work *work) in cm_rej_handler() argument
3046 rej_msg = (struct cm_rej_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rej_handler()
3051 cm_format_rej_event(work); in cm_rej_handler()
3090 cm_queue_work_unlock(cm_id_priv, work); in cm_rej_handler()
3195 static int cm_mra_handler(struct cm_work *work) in cm_mra_handler() argument
3201 mra_msg = (struct cm_mra_msg *)work->mad_recv_wc->recv_buf.mad; in cm_mra_handler()
3206 work->cm_event.private_data = in cm_mra_handler()
3208 work->cm_event.param.mra_rcvd.service_timeout = in cm_mra_handler()
3236 &work->port->counters[CM_RECV_DUPLICATES] in cm_mra_handler()
3244 atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] in cm_mra_handler()
3254 cm_queue_work_unlock(cm_id_priv, work); in cm_mra_handler()
3308 static int cm_lap_handler(struct cm_work *work) in cm_lap_handler() argument
3321 if (rdma_protocol_roce(work->port->cm_dev->ib_device, in cm_lap_handler()
3322 work->port->port_num)) in cm_lap_handler()
3326 lap_msg = (struct cm_lap_msg *)work->mad_recv_wc->recv_buf.mad; in cm_lap_handler()
3333 param = &work->cm_event.param.lap_rcvd; in cm_lap_handler()
3334 memset(&work->path[0], 0, sizeof(work->path[1])); in cm_lap_handler()
3335 cm_path_set_rec_type(work->port->cm_dev->ib_device, in cm_lap_handler()
3336 work->port->port_num, &work->path[0], in cm_lap_handler()
3339 param->alternate_path = &work->path[0]; in cm_lap_handler()
3341 work->cm_event.private_data = in cm_lap_handler()
3344 ret = ib_init_ah_attr_from_wc(work->port->cm_dev->ib_device, in cm_lap_handler()
3345 work->port->port_num, in cm_lap_handler()
3346 work->mad_recv_wc->wc, in cm_lap_handler()
3347 work->mad_recv_wc->recv_buf.grh, in cm_lap_handler()
3359 cm_init_av_for_lap(work->port, work->mad_recv_wc->wc, in cm_lap_handler()
3371 atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] in cm_lap_handler()
3373 msg = cm_alloc_response_msg_no_ah(work->port, work->mad_recv_wc, in cm_lap_handler()
3385 if (cm_create_response_msg_ah(work->port, work->mad_recv_wc, msg) || in cm_lap_handler()
3390 atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] in cm_lap_handler()
3399 cm_queue_work_unlock(cm_id_priv, work); in cm_lap_handler()
3407 static int cm_apr_handler(struct cm_work *work) in cm_apr_handler() argument
3415 if (rdma_protocol_roce(work->port->cm_dev->ib_device, in cm_apr_handler()
3416 work->port->port_num)) in cm_apr_handler()
3419 apr_msg = (struct cm_apr_msg *)work->mad_recv_wc->recv_buf.mad; in cm_apr_handler()
3426 work->cm_event.param.apr_rcvd.ap_status = in cm_apr_handler()
3428 work->cm_event.param.apr_rcvd.apr_info = in cm_apr_handler()
3430 work->cm_event.param.apr_rcvd.info_len = in cm_apr_handler()
3432 work->cm_event.private_data = in cm_apr_handler()
3444 cm_queue_work_unlock(cm_id_priv, work); in cm_apr_handler()
3451 static int cm_timewait_handler(struct cm_work *work) in cm_timewait_handler() argument
3456 timewait_info = container_of(work, struct cm_timewait_info, work); in cm_timewait_handler()
3461 cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_timewait_handler()
3462 timewait_info->work.remote_id); in cm_timewait_handler()
3473 cm_queue_work_unlock(cm_id_priv, work); in cm_timewait_handler()
3550 static void cm_format_sidr_req_event(struct cm_work *work, in cm_format_sidr_req_event() argument
3558 work->mad_recv_wc->recv_buf.mad; in cm_format_sidr_req_event()
3559 param = &work->cm_event.param.sidr_req_rcvd; in cm_format_sidr_req_event()
3564 param->bth_pkey = cm_get_bth_pkey(work); in cm_format_sidr_req_event()
3565 param->port = work->port->port_num; in cm_format_sidr_req_event()
3567 work->cm_event.private_data = in cm_format_sidr_req_event()
3571 static int cm_sidr_req_handler(struct cm_work *work) in cm_sidr_req_handler() argument
3579 cm_alloc_id_priv(work->port->cm_dev->ib_device, NULL, NULL); in cm_sidr_req_handler()
3585 work->mad_recv_wc->recv_buf.mad; in cm_sidr_req_handler()
3593 wc = work->mad_recv_wc->wc; in cm_sidr_req_handler()
3595 ret = cm_init_av_for_response(work->port, work->mad_recv_wc->wc, in cm_sidr_req_handler()
3596 work->mad_recv_wc->recv_buf.grh, in cm_sidr_req_handler()
3605 atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] in cm_sidr_req_handler()
3630 cm_format_sidr_req_event(work, cm_id_priv, &listen_cm_id_priv->id); in cm_sidr_req_handler()
3631 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &work->cm_event); in cm_sidr_req_handler()
3632 cm_free_work(work); in cm_sidr_req_handler()
3727 static void cm_format_sidr_rep_event(struct cm_work *work, in cm_format_sidr_rep_event() argument
3734 work->mad_recv_wc->recv_buf.mad; in cm_format_sidr_rep_event()
3735 param = &work->cm_event.param.sidr_rep_rcvd; in cm_format_sidr_rep_event()
3744 work->cm_event.private_data = in cm_format_sidr_rep_event()
3748 static int cm_sidr_rep_handler(struct cm_work *work) in cm_sidr_rep_handler() argument
3754 work->mad_recv_wc->recv_buf.mad; in cm_sidr_rep_handler()
3769 cm_format_sidr_rep_event(work, cm_id_priv); in cm_sidr_rep_handler()
3770 cm_process_work(cm_id_priv, work); in cm_sidr_rep_handler()
3865 struct cm_work *work = container_of(_work, struct cm_work, work.work); in cm_work_handler() local
3868 switch (work->cm_event.event) { in cm_work_handler()
3870 ret = cm_req_handler(work); in cm_work_handler()
3873 ret = cm_mra_handler(work); in cm_work_handler()
3876 ret = cm_rej_handler(work); in cm_work_handler()
3879 ret = cm_rep_handler(work); in cm_work_handler()
3882 ret = cm_rtu_handler(work); in cm_work_handler()
3885 ret = cm_establish_handler(work); in cm_work_handler()
3888 ret = cm_dreq_handler(work); in cm_work_handler()
3891 ret = cm_drep_handler(work); in cm_work_handler()
3894 ret = cm_sidr_req_handler(work); in cm_work_handler()
3897 ret = cm_sidr_rep_handler(work); in cm_work_handler()
3900 ret = cm_lap_handler(work); in cm_work_handler()
3903 ret = cm_apr_handler(work); in cm_work_handler()
3906 ret = cm_timewait_handler(work); in cm_work_handler()
3909 trace_icm_handler_err(work->cm_event.event); in cm_work_handler()
3914 cm_free_work(work); in cm_work_handler()
3920 struct cm_work *work; in cm_establish() local
3929 work = kmalloc(sizeof *work, GFP_ATOMIC); in cm_establish()
3930 if (!work) in cm_establish()
3951 kfree(work); in cm_establish()
3961 INIT_DELAYED_WORK(&work->work, cm_work_handler); in cm_establish()
3962 work->local_id = cm_id->local_id; in cm_establish()
3963 work->remote_id = cm_id->remote_id; in cm_establish()
3964 work->mad_recv_wc = NULL; in cm_establish()
3965 work->cm_event.event = IB_CM_USER_ESTABLISHED; in cm_establish()
3970 queue_delayed_work(cm.wq, &work->work, 0); in cm_establish()
3972 kfree(work); in cm_establish()
4024 struct cm_work *work; in cm_recv_handler() local
4077 work = kmalloc(struct_size(work, path, paths), GFP_KERNEL); in cm_recv_handler()
4078 if (!work) { in cm_recv_handler()
4083 INIT_DELAYED_WORK(&work->work, cm_work_handler); in cm_recv_handler()
4084 work->cm_event.event = event; in cm_recv_handler()
4085 work->mad_recv_wc = mad_recv_wc; in cm_recv_handler()
4086 work->port = port; in cm_recv_handler()
4091 queue_delayed_work(cm.wq, &work->work, 0); in cm_recv_handler()
4097 kfree(work); in cm_recv_handler()
4547 cancel_delayed_work(&timewait_info->work.work); in ib_cm_cleanup()