Lines Matching refs:work
237 struct delayed_work work; member
248 struct cm_work work; /* Must be first. */ member
306 static void cm_work_handler(struct work_struct *work);
743 __be32 remote_id = timewait_info->work.remote_id; in cm_insert_remote_id()
749 if (be32_lt(remote_id, cur_timewait_info->work.remote_id)) in cm_insert_remote_id()
751 else if (be32_gt(remote_id, cur_timewait_info->work.remote_id)) in cm_insert_remote_id()
775 if (be32_lt(remote_id, timewait_info->work.remote_id)) in cm_find_remote_id()
777 else if (be32_gt(remote_id, timewait_info->work.remote_id)) in cm_find_remote_id()
900 struct cm_work *work; in cm_dequeue_work() local
905 work = list_entry(cm_id_priv->work_list.next, struct cm_work, list); in cm_dequeue_work()
906 list_del(&work->list); in cm_dequeue_work()
907 return work; in cm_dequeue_work()
910 static void cm_free_work(struct cm_work *work) in cm_free_work() argument
912 if (work->mad_recv_wc) in cm_free_work()
913 ib_free_recv_mad(work->mad_recv_wc); in cm_free_work()
914 kfree(work); in cm_free_work()
963 timewait_info->work.local_id = local_id; in cm_create_timewait_info()
964 INIT_DELAYED_WORK(&timewait_info->work.work, cm_work_handler); in cm_create_timewait_info()
965 timewait_info->work.cm_event.event = IB_CM_TIMEWAIT_EXIT; in cm_create_timewait_info()
995 queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work, in cm_enter_timewait()
1019 struct cm_work *work; in cm_destroy_id() local
1115 while ((work = cm_dequeue_work(cm_id_priv)) != NULL) in cm_destroy_id()
1116 cm_free_work(work); in cm_destroy_id()
1637 static u16 cm_get_bth_pkey(struct cm_work *work) in cm_get_bth_pkey() argument
1639 struct ib_device *ib_dev = work->port->cm_dev->ib_device; in cm_get_bth_pkey()
1640 u8 port_num = work->port->port_num; in cm_get_bth_pkey()
1641 u16 pkey_index = work->mad_recv_wc->wc->pkey_index; in cm_get_bth_pkey()
1664 static void cm_opa_to_ib_sgid(struct cm_work *work, in cm_opa_to_ib_sgid() argument
1667 struct ib_device *dev = work->port->cm_dev->ib_device; in cm_opa_to_ib_sgid()
1668 u8 port_num = work->port->port_num; in cm_opa_to_ib_sgid()
1684 static void cm_format_req_event(struct cm_work *work, in cm_format_req_event() argument
1691 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_req_event()
1692 param = &work->cm_event.param.req_rcvd; in cm_format_req_event()
1694 param->bth_pkey = cm_get_bth_pkey(work); in cm_format_req_event()
1696 param->primary_path = &work->path[0]; in cm_format_req_event()
1697 cm_opa_to_ib_sgid(work, param->primary_path); in cm_format_req_event()
1699 param->alternate_path = &work->path[1]; in cm_format_req_event()
1700 cm_opa_to_ib_sgid(work, param->alternate_path); in cm_format_req_event()
1720 work->cm_event.private_data = &req_msg->private_data; in cm_format_req_event()
1724 struct cm_work *work) in cm_process_work() argument
1729 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &work->cm_event); in cm_process_work()
1730 cm_free_work(work); in cm_process_work()
1734 work = cm_dequeue_work(cm_id_priv); in cm_process_work()
1736 if (!work) in cm_process_work()
1740 &work->cm_event); in cm_process_work()
1741 cm_free_work(work); in cm_process_work()
1804 static void cm_dup_req_handler(struct cm_work *work, in cm_dup_req_handler() argument
1810 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dup_req_handler()
1817 ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg); in cm_dup_req_handler()
1847 static struct cm_id_private * cm_match_req(struct cm_work *work, in cm_match_req() argument
1855 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_match_req()
1861 cur_cm_id_priv = cm_get_id(timewait_info->work.local_id, in cm_match_req()
1862 timewait_info->work.remote_id); in cm_match_req()
1865 cm_dup_req_handler(work, cur_cm_id_priv); in cm_match_req()
1875 cur_cm_id_priv = cm_get_id(timewait_info->work.local_id, in cm_match_req()
1876 timewait_info->work.remote_id); in cm_match_req()
1879 cm_issue_rej(work->port, work->mad_recv_wc, in cm_match_req()
1896 cm_issue_rej(work->port, work->mad_recv_wc, in cm_match_req()
1938 static int cm_req_handler(struct cm_work *work) in cm_req_handler() argument
1947 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; in cm_req_handler()
1949 cm_id = ib_create_cm_id(work->port->cm_dev->ib_device, NULL, NULL); in cm_req_handler()
1955 ret = cm_init_av_for_response(work->port, work->mad_recv_wc->wc, in cm_req_handler()
1956 work->mad_recv_wc->recv_buf.grh, in cm_req_handler()
1966 cm_id_priv->timewait_info->work.remote_id = req_msg->local_comm_id; in cm_req_handler()
1970 listen_cm_id_priv = cm_match_req(work, cm_id_priv); in cm_req_handler()
1983 cm_process_routed_req(req_msg, work->mad_recv_wc->wc); in cm_req_handler()
1985 memset(&work->path[0], 0, sizeof(work->path[0])); in cm_req_handler()
1987 memset(&work->path[1], 0, sizeof(work->path[1])); in cm_req_handler()
1992 work->path[0].rec_type = in cm_req_handler()
1996 cm_path_set_rec_type(work->port->cm_dev->ib_device, in cm_req_handler()
1997 work->port->port_num, in cm_req_handler()
1998 &work->path[0], in cm_req_handler()
2002 work->path[1].rec_type = work->path[0].rec_type; in cm_req_handler()
2003 cm_format_paths_from_req(req_msg, &work->path[0], in cm_req_handler()
2004 &work->path[1]); in cm_req_handler()
2006 sa_path_set_dmac(&work->path[0], in cm_req_handler()
2008 work->path[0].hop_limit = grh->hop_limit; in cm_req_handler()
2009 ret = cm_init_av_by_path(&work->path[0], gid_attr, &cm_id_priv->av, in cm_req_handler()
2014 err = rdma_query_gid(work->port->cm_dev->ib_device, in cm_req_handler()
2015 work->port->port_num, 0, in cm_req_handler()
2016 &work->path[0].sgid); in cm_req_handler()
2022 &work->path[0].sgid, in cm_req_handler()
2023 sizeof(work->path[0].sgid), in cm_req_handler()
2028 ret = cm_init_av_by_path(&work->path[1], NULL, in cm_req_handler()
2032 &work->path[0].sgid, in cm_req_handler()
2033 sizeof(work->path[0].sgid), NULL, 0); in cm_req_handler()
2051 cm_format_req_event(work, cm_id_priv, &listen_cm_id_priv->id); in cm_req_handler()
2052 cm_process_work(cm_id_priv, work); in cm_req_handler()
2213 static void cm_format_rep_event(struct cm_work *work, enum ib_qp_type qp_type) in cm_format_rep_event() argument
2218 rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_rep_event()
2219 param = &work->cm_event.param.rep_rcvd; in cm_format_rep_event()
2231 work->cm_event.private_data = &rep_msg->private_data; in cm_format_rep_event()
2234 static void cm_dup_rep_handler(struct cm_work *work) in cm_dup_rep_handler() argument
2241 rep_msg = (struct cm_rep_msg *) work->mad_recv_wc->recv_buf.mad; in cm_dup_rep_handler()
2247 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dup_rep_handler()
2249 ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg); in cm_dup_rep_handler()
2277 static int cm_rep_handler(struct cm_work *work) in cm_rep_handler() argument
2286 rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rep_handler()
2289 cm_dup_rep_handler(work); in cm_rep_handler()
2295 cm_format_rep_event(work, cm_id_priv->qp_type); in cm_rep_handler()
2312 cm_id_priv->timewait_info->work.remote_id = rep_msg->local_comm_id; in cm_rep_handler()
2332 cur_cm_id_priv = cm_get_id(timewait_info->work.local_id, in cm_rep_handler()
2333 timewait_info->work.remote_id); in cm_rep_handler()
2337 cm_issue_rej(work->port, work->mad_recv_wc, in cm_rep_handler()
2375 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_rep_handler()
2379 cm_process_work(cm_id_priv, work); in cm_rep_handler()
2389 static int cm_establish_handler(struct cm_work *work) in cm_establish_handler() argument
2395 cm_id_priv = cm_acquire_id(work->local_id, work->remote_id); in cm_establish_handler()
2408 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_establish_handler()
2412 cm_process_work(cm_id_priv, work); in cm_establish_handler()
2421 static int cm_rtu_handler(struct cm_work *work) in cm_rtu_handler() argument
2427 rtu_msg = (struct cm_rtu_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rtu_handler()
2433 work->cm_event.private_data = &rtu_msg->private_data; in cm_rtu_handler()
2439 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_rtu_handler()
2448 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_rtu_handler()
2452 cm_process_work(cm_id_priv, work); in cm_rtu_handler()
2615 static int cm_dreq_handler(struct cm_work *work) in cm_dreq_handler() argument
2622 dreq_msg = (struct cm_dreq_msg *)work->mad_recv_wc->recv_buf.mad; in cm_dreq_handler()
2626 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dreq_handler()
2628 cm_issue_drep(work->port, work->mad_recv_wc); in cm_dreq_handler()
2635 work->cm_event.private_data = &dreq_msg->private_data; in cm_dreq_handler()
2654 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dreq_handler()
2656 msg = cm_alloc_response_msg_no_ah(work->port, work->mad_recv_wc); in cm_dreq_handler()
2665 if (cm_create_response_msg_ah(work->port, work->mad_recv_wc, msg) || in cm_dreq_handler()
2670 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_dreq_handler()
2683 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_dreq_handler()
2687 cm_process_work(cm_id_priv, work); in cm_dreq_handler()
2697 static int cm_drep_handler(struct cm_work *work) in cm_drep_handler() argument
2703 drep_msg = (struct cm_drep_msg *)work->mad_recv_wc->recv_buf.mad; in cm_drep_handler()
2709 work->cm_event.private_data = &drep_msg->private_data; in cm_drep_handler()
2722 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_drep_handler()
2726 cm_process_work(cm_id_priv, work); in cm_drep_handler()
2798 static void cm_format_rej_event(struct cm_work *work) in cm_format_rej_event() argument
2803 rej_msg = (struct cm_rej_msg *)work->mad_recv_wc->recv_buf.mad; in cm_format_rej_event()
2804 param = &work->cm_event.param.rej_rcvd; in cm_format_rej_event()
2808 work->cm_event.private_data = &rej_msg->private_data; in cm_format_rej_event()
2828 (timewait_info->work.local_id ^ in cm_acquire_rejected_id()
2845 static int cm_rej_handler(struct cm_work *work) in cm_rej_handler() argument
2851 rej_msg = (struct cm_rej_msg *)work->mad_recv_wc->recv_buf.mad; in cm_rej_handler()
2856 cm_format_rej_event(work); in cm_rej_handler()
2901 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_rej_handler()
2905 cm_process_work(cm_id_priv, work); in cm_rej_handler()
3010 static int cm_mra_handler(struct cm_work *work) in cm_mra_handler() argument
3016 mra_msg = (struct cm_mra_msg *)work->mad_recv_wc->recv_buf.mad; in cm_mra_handler()
3021 work->cm_event.private_data = &mra_msg->private_data; in cm_mra_handler()
3022 work->cm_event.param.mra_rcvd.service_timeout = in cm_mra_handler()
3049 atomic_long_inc(&work->port-> in cm_mra_handler()
3058 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_mra_handler()
3072 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_mra_handler()
3076 cm_process_work(cm_id_priv, work); in cm_mra_handler()
3223 static int cm_lap_handler(struct cm_work *work) in cm_lap_handler() argument
3234 if (rdma_protocol_roce(work->port->cm_dev->ib_device, in cm_lap_handler()
3235 work->port->port_num)) in cm_lap_handler()
3239 lap_msg = (struct cm_lap_msg *)work->mad_recv_wc->recv_buf.mad; in cm_lap_handler()
3245 param = &work->cm_event.param.lap_rcvd; in cm_lap_handler()
3246 memset(&work->path[0], 0, sizeof(work->path[1])); in cm_lap_handler()
3247 cm_path_set_rec_type(work->port->cm_dev->ib_device, in cm_lap_handler()
3248 work->port->port_num, in cm_lap_handler()
3249 &work->path[0], in cm_lap_handler()
3251 param->alternate_path = &work->path[0]; in cm_lap_handler()
3253 work->cm_event.private_data = &lap_msg->private_data; in cm_lap_handler()
3264 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_lap_handler()
3266 msg = cm_alloc_response_msg_no_ah(work->port, work->mad_recv_wc); in cm_lap_handler()
3277 if (cm_create_response_msg_ah(work->port, work->mad_recv_wc, msg) || in cm_lap_handler()
3282 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_lap_handler()
3289 ret = cm_init_av_for_lap(work->port, work->mad_recv_wc->wc, in cm_lap_handler()
3290 work->mad_recv_wc->recv_buf.grh, in cm_lap_handler()
3301 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_lap_handler()
3305 cm_process_work(cm_id_priv, work); in cm_lap_handler()
3381 static int cm_apr_handler(struct cm_work *work) in cm_apr_handler() argument
3390 if (rdma_protocol_roce(work->port->cm_dev->ib_device, in cm_apr_handler()
3391 work->port->port_num)) in cm_apr_handler()
3394 apr_msg = (struct cm_apr_msg *)work->mad_recv_wc->recv_buf.mad; in cm_apr_handler()
3400 work->cm_event.param.apr_rcvd.ap_status = apr_msg->ap_status; in cm_apr_handler()
3401 work->cm_event.param.apr_rcvd.apr_info = &apr_msg->info; in cm_apr_handler()
3402 work->cm_event.param.apr_rcvd.info_len = apr_msg->info_length; in cm_apr_handler()
3403 work->cm_event.private_data = &apr_msg->private_data; in cm_apr_handler()
3418 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_apr_handler()
3422 cm_process_work(cm_id_priv, work); in cm_apr_handler()
3431 static int cm_timewait_handler(struct cm_work *work) in cm_timewait_handler() argument
3437 timewait_info = (struct cm_timewait_info *)work; in cm_timewait_handler()
3442 cm_id_priv = cm_acquire_id(timewait_info->work.local_id, in cm_timewait_handler()
3443 timewait_info->work.remote_id); in cm_timewait_handler()
3456 list_add_tail(&work->list, &cm_id_priv->work_list); in cm_timewait_handler()
3460 cm_process_work(cm_id_priv, work); in cm_timewait_handler()
3535 static void cm_format_sidr_req_event(struct cm_work *work, in cm_format_sidr_req_event() argument
3543 work->mad_recv_wc->recv_buf.mad; in cm_format_sidr_req_event()
3544 param = &work->cm_event.param.sidr_req_rcvd; in cm_format_sidr_req_event()
3548 param->bth_pkey = cm_get_bth_pkey(work); in cm_format_sidr_req_event()
3549 param->port = work->port->port_num; in cm_format_sidr_req_event()
3551 work->cm_event.private_data = &sidr_req_msg->private_data; in cm_format_sidr_req_event()
3554 static int cm_sidr_req_handler(struct cm_work *work) in cm_sidr_req_handler() argument
3562 cm_id = ib_create_cm_id(work->port->cm_dev->ib_device, NULL, NULL); in cm_sidr_req_handler()
3569 work->mad_recv_wc->recv_buf.mad; in cm_sidr_req_handler()
3570 wc = work->mad_recv_wc->wc; in cm_sidr_req_handler()
3573 ret = cm_init_av_for_response(work->port, work->mad_recv_wc->wc, in cm_sidr_req_handler()
3574 work->mad_recv_wc->recv_buf.grh, in cm_sidr_req_handler()
3587 atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. in cm_sidr_req_handler()
3608 cm_format_sidr_req_event(work, cm_id_priv, &cur_cm_id_priv->id); in cm_sidr_req_handler()
3609 cm_process_work(cm_id_priv, work); in cm_sidr_req_handler()
3685 static void cm_format_sidr_rep_event(struct cm_work *work, in cm_format_sidr_rep_event() argument
3692 work->mad_recv_wc->recv_buf.mad; in cm_format_sidr_rep_event()
3693 param = &work->cm_event.param.sidr_rep_rcvd; in cm_format_sidr_rep_event()
3700 work->cm_event.private_data = &sidr_rep_msg->private_data; in cm_format_sidr_rep_event()
3703 static int cm_sidr_rep_handler(struct cm_work *work) in cm_sidr_rep_handler() argument
3709 work->mad_recv_wc->recv_buf.mad; in cm_sidr_rep_handler()
3723 cm_format_sidr_rep_event(work, cm_id_priv); in cm_sidr_rep_handler()
3724 cm_process_work(cm_id_priv, work); in cm_sidr_rep_handler()
3828 struct cm_work *work = container_of(_work, struct cm_work, work.work); in cm_work_handler() local
3831 switch (work->cm_event.event) { in cm_work_handler()
3833 ret = cm_req_handler(work); in cm_work_handler()
3836 ret = cm_mra_handler(work); in cm_work_handler()
3839 ret = cm_rej_handler(work); in cm_work_handler()
3842 ret = cm_rep_handler(work); in cm_work_handler()
3845 ret = cm_rtu_handler(work); in cm_work_handler()
3848 ret = cm_establish_handler(work); in cm_work_handler()
3851 ret = cm_dreq_handler(work); in cm_work_handler()
3854 ret = cm_drep_handler(work); in cm_work_handler()
3857 ret = cm_sidr_req_handler(work); in cm_work_handler()
3860 ret = cm_sidr_rep_handler(work); in cm_work_handler()
3863 ret = cm_lap_handler(work); in cm_work_handler()
3866 ret = cm_apr_handler(work); in cm_work_handler()
3869 ret = cm_timewait_handler(work); in cm_work_handler()
3872 pr_debug("cm_event.event: 0x%x\n", work->cm_event.event); in cm_work_handler()
3877 cm_free_work(work); in cm_work_handler()
3883 struct cm_work *work; in cm_establish() local
3892 work = kmalloc(sizeof *work, GFP_ATOMIC); in cm_establish()
3893 if (!work) in cm_establish()
3916 kfree(work); in cm_establish()
3926 INIT_DELAYED_WORK(&work->work, cm_work_handler); in cm_establish()
3927 work->local_id = cm_id->local_id; in cm_establish()
3928 work->remote_id = cm_id->remote_id; in cm_establish()
3929 work->mad_recv_wc = NULL; in cm_establish()
3930 work->cm_event.event = IB_CM_USER_ESTABLISHED; in cm_establish()
3935 queue_delayed_work(cm.wq, &work->work, 0); in cm_establish()
3937 kfree(work); in cm_establish()
3998 struct cm_work *work; in cm_recv_handler() local
4052 work = kmalloc(sizeof(*work) + sizeof(struct sa_path_rec) * paths, in cm_recv_handler()
4054 if (!work) { in cm_recv_handler()
4059 INIT_DELAYED_WORK(&work->work, cm_work_handler); in cm_recv_handler()
4060 work->cm_event.event = event; in cm_recv_handler()
4061 work->mad_recv_wc = mad_recv_wc; in cm_recv_handler()
4062 work->port = port; in cm_recv_handler()
4067 queue_delayed_work(cm.wq, &work->work, 0); in cm_recv_handler()
4073 kfree(work); in cm_recv_handler()
4549 cancel_delayed_work(&timewait_info->work.work); in ib_cm_cleanup()