Lines Matching full:work
91 struct cm_work *work);
228 struct delayed_work work; member
239 struct cm_work work; member
299 static void cm_work_handler(struct work_struct *work);
718 __be32 remote_id = timewait_info->work.remote_id; in cm_insert_remote_id()
724 if (be32_lt(remote_id, cur_timewait_info->work.remote_id)) in cm_insert_remote_id()
726 else if (be32_gt(remote_id, cur_timewait_info->work.remote_id)) in cm_insert_remote_id()
752 if (be32_lt(remote_id, timewait_info->work.remote_id)) in cm_find_remote_id()
754 else if (be32_gt(remote_id, timewait_info->work.remote_id)) in cm_find_remote_id()
761 res = cm_acquire_id(timewait_info->work.local_id, in cm_find_remote_id()
762 timewait_info->work.remote_id); in cm_find_remote_id()
902 struct cm_work *work; in cm_dequeue_work() local
907 work = list_entry(cm_id_priv->work_list.next, struct cm_work, list); in cm_dequeue_work()
908 list_del(&work->list); in cm_dequeue_work()
909 return work; in cm_dequeue_work()
912 static void cm_free_work(struct cm_work *work) in cm_free_work() argument
914 if (work->mad_recv_wc) in cm_free_work()
915 ib_free_recv_mad(work->mad_recv_wc); in cm_free_work()
916 kfree(work); in cm_free_work()
920 struct cm_work *work) in cm_queue_work_unlock() argument
934 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_queue_work_unlock()
946 cm_process_work(cm_id_priv, work); in cm_queue_work_unlock()
997 timewait_info->work.local_id = local_id; in cm_create_timewait_info()
998 INIT_DELAYED_WORK(&timewait_info->work.work, cm_work_handler); in cm_create_timewait_info()
999 timewait_info->work.cm_event.event = IB_CM_TIMEWAIT_EXIT; in cm_create_timewait_info()
1031 queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work, in cm_enter_timewait()
1036 * The timewait_info is converted into a work and gets freed during in cm_enter_timewait()
1039 BUILD_BUG_ON(offsetof(struct cm_timewait_info, work) != 0); in cm_enter_timewait()
1062 struct cm_work *work; in cm_destroy_id() local
1175 while ((work = cm_dequeue_work(cm_id_priv)) != NULL) in cm_destroy_id()
1176 cm_free_work(work); in cm_destroy_id()
1401 /* Work-around until there's a way to obtain remote LID info */ in cm_format_req()
1749 static u16 cm_get_bth_pkey(struct cm_work *work) in cm_get_bth_pkey() argument
1751 struct ib_device *ib_dev = work->port->cm_dev->ib_device; in cm_get_bth_pkey()
1752 u8 port_num = work->port->port_num; in cm_get_bth_pkey()
1753 u16 pkey_index = work->mad_recv_wc->wc->pkey_index; in cm_get_bth_pkey()
1773 * @work: Work completion
1776 static void cm_opa_to_ib_sgid(struct cm_work *work, in cm_opa_to_ib_sgid() argument
1779 struct ib_device *dev = work->port->cm_dev->ib_device; in cm_opa_to_ib_sgid()
1780 u8 port_num = work->port->port_num; in cm_opa_to_ib_sgid()
1796 static void cm_format_req_event(struct cm_work *work, in cm_format_req_event() argument
1803 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_req_event()
1804 param = &work->cm_event.param.req_rcvd; in cm_format_req_event()
1806 param->bth_pkey = cm_get_bth_pkey(work); in cm_format_req_event()
1808 param->primary_path = &work->path[0]; in cm_format_req_event()
1809 cm_opa_to_ib_sgid(work, param->primary_path); in cm_format_req_event()
1811 param->alternate_path = &work->path[1]; in cm_format_req_event()
1812 cm_opa_to_ib_sgid(work, param->alternate_path); in cm_format_req_event()
1836 work->cm_event.private_data = in cm_format_req_event()
1841 struct cm_work *work) in cm_process_work() argument
1846 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &work->cm_event); in cm_process_work()
1847 cm_free_work(work); in cm_process_work()
1851 work = cm_dequeue_work(cm_id_priv); in cm_process_work()
1853 if (!work) in cm_process_work()
1857 &work->cm_event); in cm_process_work()
1858 cm_free_work(work); in cm_process_work()
1930 static void cm_dup_req_handler(struct cm_work *work, in cm_dup_req_handler() argument
1936 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dup_req_handler()
1947 ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg); in cm_dup_req_handler()
1979 static struct cm_id_private * cm_match_req(struct cm_work *work, in cm_match_req() argument
1986 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_match_req()
1992 cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_match_req()
1993 timewait_info->work.remote_id); in cm_match_req()
1996 cm_dup_req_handler(work, cur_cm_id_priv); in cm_match_req()
2006 cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_match_req()
2007 timewait_info->work.remote_id); in cm_match_req()
2010 cm_issue_rej(work->port, work->mad_recv_wc, in cm_match_req()
2027 cm_issue_rej(work->port, work->mad_recv_wc, in cm_match_req()
2037 * Work-around for inter-subnet connections. If the LIDs are permissive,
2039 * in the work completion.
2072 static int cm_req_handler(struct cm_work *work) in cm_req_handler() argument
2080 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_req_handler()
2083 cm_alloc_id_priv(work->port->cm_dev->ib_device, NULL, NULL); in cm_req_handler()
2109 ret = cm_init_av_for_response(work->port, work->mad_recv_wc->wc, in cm_req_handler()
2110 work->mad_recv_wc->recv_buf.grh, in cm_req_handler()
2121 cm_id_priv->timewait_info->work.remote_id = cm_id_priv->id.remote_id; in cm_req_handler()
2132 listen_cm_id_priv = cm_match_req(work, cm_id_priv); in cm_req_handler()
2140 cm_process_routed_req(req_msg, work->mad_recv_wc->wc); in cm_req_handler()
2142 memset(&work->path[0], 0, sizeof(work->path[0])); in cm_req_handler()
2144 memset(&work->path[1], 0, sizeof(work->path[1])); in cm_req_handler()
2149 rdma_protocol_roce(work->port->cm_dev->ib_device, in cm_req_handler()
2150 work->port->port_num)) { in cm_req_handler()
2151 work->path[0].rec_type = in cm_req_handler()
2155 work->port->cm_dev->ib_device, work->port->port_num, in cm_req_handler()
2156 &work->path[0], in cm_req_handler()
2161 work->path[1].rec_type = work->path[0].rec_type; in cm_req_handler()
2162 cm_format_paths_from_req(req_msg, &work->path[0], in cm_req_handler()
2163 &work->path[1]); in cm_req_handler()
2165 sa_path_set_dmac(&work->path[0], in cm_req_handler()
2167 work->path[0].hop_limit = grh->hop_limit; in cm_req_handler()
2168 ret = cm_init_av_by_path(&work->path[0], gid_attr, &cm_id_priv->av, in cm_req_handler()
2173 err = rdma_query_gid(work->port->cm_dev->ib_device, in cm_req_handler()
2174 work->port->port_num, 0, in cm_req_handler()
2175 &work->path[0].sgid); in cm_req_handler()
2181 &work->path[0].sgid, in cm_req_handler()
2182 sizeof(work->path[0].sgid), in cm_req_handler()
2187 ret = cm_init_av_by_path(&work->path[1], NULL, in cm_req_handler()
2192 &work->path[0].sgid, in cm_req_handler()
2193 sizeof(work->path[0].sgid), NULL, 0); in cm_req_handler()
2200 cm_format_req_event(work, cm_id_priv, &listen_cm_id_priv->id); in cm_req_handler()
2208 cm_queue_work_unlock(cm_id_priv, work); in cm_req_handler()
2389 static void cm_format_rep_event(struct cm_work *work, enum ib_qp_type qp_type) in cm_format_rep_event() argument
2394 rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_rep_event()
2395 param = &work->cm_event.param.rep_rcvd; in cm_format_rep_event()
2413 work->cm_event.private_data = in cm_format_rep_event()
2417 static void cm_dup_rep_handler(struct cm_work *work) in cm_dup_rep_handler() argument
2424 rep_msg = (struct cm_rep_msg *) work->mad_recv_wc->recv_buf.mad; in cm_dup_rep_handler()
2431 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dup_rep_handler()
2433 ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg); in cm_dup_rep_handler()
2462 static int cm_rep_handler(struct cm_work *work) in cm_rep_handler() argument
2470 rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rep_handler()
2474 cm_dup_rep_handler(work); in cm_rep_handler()
2480 cm_format_rep_event(work, cm_id_priv->qp_type); in cm_rep_handler()
2497 cm_id_priv->timewait_info->work.remote_id = in cm_rep_handler()
2517 cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_rep_handler()
2518 timewait_info->work.remote_id); in cm_rep_handler()
2522 cm_issue_rej(work->port, work->mad_recv_wc, in cm_rep_handler()
2559 cm_queue_work_unlock(cm_id_priv, work); in cm_rep_handler()
2567 static int cm_establish_handler(struct cm_work *work) in cm_establish_handler() argument
2572 cm_id_priv = cm_acquire_id(work->local_id, work->remote_id); in cm_establish_handler()
2583 cm_queue_work_unlock(cm_id_priv, work); in cm_establish_handler()
2590 static int cm_rtu_handler(struct cm_work *work) in cm_rtu_handler() argument
2595 rtu_msg = (struct cm_rtu_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rtu_handler()
2602 work->cm_event.private_data = in cm_rtu_handler()
2609 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_rtu_handler()
2616 cm_queue_work_unlock(cm_id_priv, work); in cm_rtu_handler()
2804 static int cm_dreq_handler(struct cm_work *work) in cm_dreq_handler() argument
2810 dreq_msg = (struct cm_dreq_msg *)work->mad_recv_wc->recv_buf.mad; in cm_dreq_handler()
2815 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dreq_handler()
2817 cm_issue_drep(work->port, work->mad_recv_wc); in cm_dreq_handler()
2824 work->cm_event.private_data = in cm_dreq_handler()
2845 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dreq_handler()
2847 msg = cm_alloc_response_msg_no_ah(work->port, work->mad_recv_wc); in cm_dreq_handler()
2856 if (cm_create_response_msg_ah(work->port, work->mad_recv_wc, msg) || in cm_dreq_handler()
2861 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dreq_handler()
2870 cm_queue_work_unlock(cm_id_priv, work); in cm_dreq_handler()
2878 static int cm_drep_handler(struct cm_work *work) in cm_drep_handler() argument
2883 drep_msg = (struct cm_drep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_drep_handler()
2890 work->cm_event.private_data = in cm_drep_handler()
2902 cm_queue_work_unlock(cm_id_priv, work); in cm_drep_handler()
2981 static void cm_format_rej_event(struct cm_work *work) in cm_format_rej_event() argument
2986 rej_msg = (struct cm_rej_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_rej_event()
2987 param = &work->cm_event.param.rej_rcvd; in cm_format_rej_event()
2991 work->cm_event.private_data = in cm_format_rej_event()
3019 static int cm_rej_handler(struct cm_work *work) in cm_rej_handler() argument
3024 rej_msg = (struct cm_rej_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rej_handler()
3029 cm_format_rej_event(work); in cm_rej_handler()
3069 cm_queue_work_unlock(cm_id_priv, work); in cm_rej_handler()
3174 static int cm_mra_handler(struct cm_work *work) in cm_mra_handler() argument
3180 mra_msg = (struct cm_mra_msg *)work->mad_recv_wc->recv_buf.mad; in cm_mra_handler()
3185 work->cm_event.private_data = in cm_mra_handler()
3187 work->cm_event.param.mra_rcvd.service_timeout = in cm_mra_handler()
3217 atomic_long_inc(&work->port-> in cm_mra_handler()
3226 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_mra_handler()
3236 cm_queue_work_unlock(cm_id_priv, work); in cm_mra_handler()
3290 static int cm_lap_handler(struct cm_work *work) in cm_lap_handler() argument
3301 if (rdma_protocol_roce(work->port->cm_dev->ib_device, in cm_lap_handler()
3302 work->port->port_num)) in cm_lap_handler()
3306 lap_msg = (struct cm_lap_msg *)work->mad_recv_wc->recv_buf.mad; in cm_lap_handler()
3313 param = &work->cm_event.param.lap_rcvd; in cm_lap_handler()
3314 memset(&work->path[0], 0, sizeof(work->path[1])); in cm_lap_handler()
3315 cm_path_set_rec_type(work->port->cm_dev->ib_device, in cm_lap_handler()
3316 work->port->port_num, &work->path[0], in cm_lap_handler()
3319 param->alternate_path = &work->path[0]; in cm_lap_handler()
3321 work->cm_event.private_data = in cm_lap_handler()
3333 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_lap_handler()
3335 msg = cm_alloc_response_msg_no_ah(work->port, work->mad_recv_wc); in cm_lap_handler()
3346 if (cm_create_response_msg_ah(work->port, work->mad_recv_wc, msg) || in cm_lap_handler()
3351 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_lap_handler()
3358 ret = cm_init_av_for_lap(work->port, work->mad_recv_wc->wc, in cm_lap_handler()
3359 work->mad_recv_wc->recv_buf.grh, in cm_lap_handler()
3371 cm_queue_work_unlock(cm_id_priv, work); in cm_lap_handler()
3379 static int cm_apr_handler(struct cm_work *work) in cm_apr_handler() argument
3387 if (rdma_protocol_roce(work->port->cm_dev->ib_device, in cm_apr_handler()
3388 work->port->port_num)) in cm_apr_handler()
3391 apr_msg = (struct cm_apr_msg *)work->mad_recv_wc->recv_buf.mad; in cm_apr_handler()
3398 work->cm_event.param.apr_rcvd.ap_status = in cm_apr_handler()
3400 work->cm_event.param.apr_rcvd.apr_info = in cm_apr_handler()
3402 work->cm_event.param.apr_rcvd.info_len = in cm_apr_handler()
3404 work->cm_event.private_data = in cm_apr_handler()
3417 cm_queue_work_unlock(cm_id_priv, work); in cm_apr_handler()
3424 static int cm_timewait_handler(struct cm_work *work) in cm_timewait_handler() argument
3429 timewait_info = container_of(work, struct cm_timewait_info, work); in cm_timewait_handler()
3434 cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_timewait_handler()
3435 timewait_info->work.remote_id); in cm_timewait_handler()
3446 cm_queue_work_unlock(cm_id_priv, work); in cm_timewait_handler()
3524 static void cm_format_sidr_req_event(struct cm_work *work, in cm_format_sidr_req_event() argument
3532 work->mad_recv_wc->recv_buf.mad; in cm_format_sidr_req_event()
3533 param = &work->cm_event.param.sidr_req_rcvd; in cm_format_sidr_req_event()
3538 param->bth_pkey = cm_get_bth_pkey(work); in cm_format_sidr_req_event()
3539 param->port = work->port->port_num; in cm_format_sidr_req_event()
3541 work->cm_event.private_data = in cm_format_sidr_req_event()
3545 static int cm_sidr_req_handler(struct cm_work *work) in cm_sidr_req_handler() argument
3553 cm_alloc_id_priv(work->port->cm_dev->ib_device, NULL, NULL); in cm_sidr_req_handler()
3559 work->mad_recv_wc->recv_buf.mad; in cm_sidr_req_handler()
3568 wc = work->mad_recv_wc->wc; in cm_sidr_req_handler()
3571 ret = cm_init_av_for_response(work->port, work->mad_recv_wc->wc, in cm_sidr_req_handler()
3572 work->mad_recv_wc->recv_buf.grh, in cm_sidr_req_handler()
3581 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_sidr_req_handler()
3606 cm_format_sidr_req_event(work, cm_id_priv, &listen_cm_id_priv->id); in cm_sidr_req_handler()
3607 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &work->cm_event); in cm_sidr_req_handler()
3608 cm_free_work(work); in cm_sidr_req_handler()
3702 static void cm_format_sidr_rep_event(struct cm_work *work, in cm_format_sidr_rep_event() argument
3709 work->mad_recv_wc->recv_buf.mad; in cm_format_sidr_rep_event()
3710 param = &work->cm_event.param.sidr_rep_rcvd; in cm_format_sidr_rep_event()
3719 work->cm_event.private_data = in cm_format_sidr_rep_event()
3723 static int cm_sidr_rep_handler(struct cm_work *work) in cm_sidr_rep_handler() argument
3729 work->mad_recv_wc->recv_buf.mad; in cm_sidr_rep_handler()
3744 cm_format_sidr_rep_event(work, cm_id_priv); in cm_sidr_rep_handler()
3745 cm_process_work(cm_id_priv, work); in cm_sidr_rep_handler()
3848 struct cm_work *work = container_of(_work, struct cm_work, work.work); in cm_work_handler() local
3851 switch (work->cm_event.event) { in cm_work_handler()
3853 ret = cm_req_handler(work); in cm_work_handler()
3856 ret = cm_mra_handler(work); in cm_work_handler()
3859 ret = cm_rej_handler(work); in cm_work_handler()
3862 ret = cm_rep_handler(work); in cm_work_handler()
3865 ret = cm_rtu_handler(work); in cm_work_handler()
3868 ret = cm_establish_handler(work); in cm_work_handler()
3871 ret = cm_dreq_handler(work); in cm_work_handler()
3874 ret = cm_drep_handler(work); in cm_work_handler()
3877 ret = cm_sidr_req_handler(work); in cm_work_handler()
3880 ret = cm_sidr_rep_handler(work); in cm_work_handler()
3883 ret = cm_lap_handler(work); in cm_work_handler()
3886 ret = cm_apr_handler(work); in cm_work_handler()
3889 ret = cm_timewait_handler(work); in cm_work_handler()
3892 trace_icm_handler_err(work->cm_event.event); in cm_work_handler()
3897 cm_free_work(work); in cm_work_handler()
3903 struct cm_work *work; in cm_establish() local
3912 work = kmalloc(sizeof *work, GFP_ATOMIC); in cm_establish()
3913 if (!work) in cm_establish()
3935 kfree(work); in cm_establish()
3941 * can execute this work item. To prevent potential deadlock, in cm_establish()
3945 INIT_DELAYED_WORK(&work->work, cm_work_handler); in cm_establish()
3946 work->local_id = cm_id->local_id; in cm_establish()
3947 work->remote_id = cm_id->remote_id; in cm_establish()
3948 work->mad_recv_wc = NULL; in cm_establish()
3949 work->cm_event.event = IB_CM_USER_ESTABLISHED; in cm_establish()
3954 queue_delayed_work(cm.wq, &work->work, 0); in cm_establish()
3956 kfree(work); in cm_establish()
4017 struct cm_work *work; in cm_recv_handler() local
4071 work = kmalloc(struct_size(work, path, paths), GFP_KERNEL); in cm_recv_handler()
4072 if (!work) { in cm_recv_handler()
4077 INIT_DELAYED_WORK(&work->work, cm_work_handler); in cm_recv_handler()
4078 work->cm_event.event = event; in cm_recv_handler()
4079 work->mad_recv_wc = mad_recv_wc; in cm_recv_handler()
4080 work->port = port; in cm_recv_handler()
4085 queue_delayed_work(cm.wq, &work->work, 0); in cm_recv_handler()
4091 kfree(work); in cm_recv_handler()
4514 cancel_delayed_work(&timewait_info->work.work); in ib_cm_cleanup()