• Home
  • Raw
  • Download

Lines Matching refs:sess

36 static inline bool rnbd_clt_get_sess(struct rnbd_clt_session *sess)  in rnbd_clt_get_sess()  argument
38 return refcount_inc_not_zero(&sess->refcount); in rnbd_clt_get_sess()
41 static void free_sess(struct rnbd_clt_session *sess);
43 static void rnbd_clt_put_sess(struct rnbd_clt_session *sess) in rnbd_clt_put_sess() argument
47 if (refcount_dec_and_test(&sess->refcount)) in rnbd_clt_put_sess()
48 free_sess(sess); in rnbd_clt_put_sess()
63 rnbd_clt_put_sess(dev->sess); in rnbd_clt_put_dev()
76 struct rnbd_clt_session *sess = dev->sess; in rnbd_clt_set_dev_attr() local
94 dev->max_hw_sectors = sess->max_io_size / SECTOR_SIZE; in rnbd_clt_set_dev_attr()
95 dev->max_segments = sess->max_segments; in rnbd_clt_set_dev_attr()
189 rnbd_get_cpu_qlist(struct rnbd_clt_session *sess, int cpu) in rnbd_get_cpu_qlist() argument
194 bit = find_next_bit(sess->cpu_queues_bm, nr_cpu_ids, cpu); in rnbd_get_cpu_qlist()
196 return per_cpu_ptr(sess->cpu_queues, bit); in rnbd_get_cpu_qlist()
199 bit = find_next_bit(sess->cpu_queues_bm, cpu, 0); in rnbd_get_cpu_qlist()
201 return per_cpu_ptr(sess->cpu_queues, bit); in rnbd_get_cpu_qlist()
227 static bool rnbd_rerun_if_needed(struct rnbd_clt_session *sess) in rnbd_rerun_if_needed() argument
239 cpup = get_cpu_ptr(sess->cpu_rr); in rnbd_rerun_if_needed()
240 for (cpu_q = rnbd_get_cpu_qlist(sess, nxt_cpu(*cpup)); cpu_q; in rnbd_rerun_if_needed()
241 cpu_q = rnbd_get_cpu_qlist(sess, nxt_cpu(cpu_q->cpu))) { in rnbd_rerun_if_needed()
244 if (!test_bit(cpu_q->cpu, sess->cpu_queues_bm)) in rnbd_rerun_if_needed()
256 clear_bit(cpu_q->cpu, sess->cpu_queues_bm); in rnbd_rerun_if_needed()
274 put_cpu_ptr(sess->cpu_rr); in rnbd_rerun_if_needed()
307 static void rnbd_rerun_all_if_idle(struct rnbd_clt_session *sess) in rnbd_rerun_all_if_idle() argument
312 requeued = rnbd_rerun_if_needed(sess); in rnbd_rerun_all_if_idle()
313 } while (atomic_read(&sess->busy) == 0 && requeued); in rnbd_rerun_all_if_idle()
316 static struct rtrs_permit *rnbd_get_permit(struct rnbd_clt_session *sess, in rnbd_get_permit() argument
322 permit = rtrs_clt_get_permit(sess->rtrs, con_type, wait); in rnbd_get_permit()
329 atomic_inc(&sess->busy); in rnbd_get_permit()
334 static void rnbd_put_permit(struct rnbd_clt_session *sess, in rnbd_put_permit() argument
337 rtrs_clt_put_permit(sess->rtrs, permit); in rnbd_put_permit()
338 atomic_dec(&sess->busy); in rnbd_put_permit()
343 rnbd_rerun_all_if_idle(sess); in rnbd_put_permit()
346 static struct rnbd_iu *rnbd_get_iu(struct rnbd_clt_session *sess, in rnbd_get_iu() argument
357 permit = rnbd_get_permit(sess, con_type, wait); in rnbd_get_iu()
377 rnbd_put_permit(sess, permit); in rnbd_get_iu()
385 static void rnbd_put_iu(struct rnbd_clt_session *sess, struct rnbd_iu *iu) in rnbd_put_iu() argument
389 rnbd_put_permit(sess, iu->permit); in rnbd_put_iu()
397 struct rnbd_clt_session *sess = dev->sess; in rnbd_softirq_done_fn() local
402 rnbd_put_permit(sess, iu->permit); in rnbd_softirq_done_fn()
468 rnbd_put_iu(dev->sess, iu); in msg_close_conf()
475 struct rnbd_clt_session *sess = dev->sess; in send_msg_close() local
484 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT); in send_msg_close()
495 err = send_usr_msg(sess->rtrs, WRITE, iu, &vec, 0, NULL, 0, in send_msg_close()
499 rnbd_put_iu(sess, iu); in send_msg_close()
504 rnbd_put_iu(sess, iu); in send_msg_close()
532 rnbd_put_iu(dev->sess, iu); in msg_open_conf()
540 struct rnbd_clt_session *sess = iu->sess; in msg_sess_info_conf() local
543 sess->ver = min_t(u8, rsp->ver, RNBD_PROTO_VER_MAJOR); in msg_sess_info_conf()
547 rnbd_put_iu(sess, iu); in msg_sess_info_conf()
548 rnbd_clt_put_sess(sess); in msg_sess_info_conf()
553 struct rnbd_clt_session *sess = dev->sess; in send_msg_open() local
567 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT); in send_msg_open()
583 err = send_usr_msg(sess->rtrs, READ, iu, in send_msg_open()
588 rnbd_put_iu(sess, iu); in send_msg_open()
594 rnbd_put_iu(sess, iu); in send_msg_open()
598 static int send_msg_sess_info(struct rnbd_clt_session *sess, enum wait_type wait) in send_msg_sess_info() argument
613 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT); in send_msg_sess_info()
620 iu->sess = sess; in send_msg_sess_info()
626 if (!rnbd_clt_get_sess(sess)) { in send_msg_sess_info()
636 err = send_usr_msg(sess->rtrs, READ, iu, in send_msg_sess_info()
640 rnbd_clt_put_sess(sess); in send_msg_sess_info()
642 rnbd_put_iu(sess, iu); in send_msg_sess_info()
647 rnbd_put_iu(sess, iu); in send_msg_sess_info()
651 static void set_dev_states_to_disconnected(struct rnbd_clt_session *sess) in set_dev_states_to_disconnected() argument
656 mutex_lock(&sess->lock); in set_dev_states_to_disconnected()
657 list_for_each_entry(dev, &sess->devs_list, list) { in set_dev_states_to_disconnected()
668 mutex_unlock(&sess->lock); in set_dev_states_to_disconnected()
671 static void remap_devs(struct rnbd_clt_session *sess) in remap_devs() argument
688 err = send_msg_sess_info(sess, RTRS_PERMIT_NOWAIT); in remap_devs()
690 pr_err("send_msg_sess_info(\"%s\"): %d\n", sess->sessname, err); in remap_devs()
694 err = rtrs_clt_query(sess->rtrs, &attrs); in remap_devs()
696 pr_err("rtrs_clt_query(\"%s\"): %d\n", sess->sessname, err); in remap_devs()
699 mutex_lock(&sess->lock); in remap_devs()
700 sess->max_io_size = attrs.max_io_size; in remap_devs()
702 list_for_each_entry(dev, &sess->devs_list, list) { in remap_devs()
722 mutex_unlock(&sess->lock); in remap_devs()
727 struct rnbd_clt_session *sess = priv; in rnbd_clt_link_ev() local
731 set_dev_states_to_disconnected(sess); in rnbd_clt_link_ev()
734 remap_devs(sess); in rnbd_clt_link_ev()
738 ev, sess->sessname); in rnbd_clt_link_ev()
756 static void destroy_mq_tags(struct rnbd_clt_session *sess) in destroy_mq_tags() argument
758 if (sess->tag_set.tags) in destroy_mq_tags()
759 blk_mq_free_tag_set(&sess->tag_set); in destroy_mq_tags()
762 static inline void wake_up_rtrs_waiters(struct rnbd_clt_session *sess) in wake_up_rtrs_waiters() argument
764 sess->rtrs_ready = true; in wake_up_rtrs_waiters()
765 wake_up_all(&sess->rtrs_waitq); in wake_up_rtrs_waiters()
768 static void close_rtrs(struct rnbd_clt_session *sess) in close_rtrs() argument
772 if (!IS_ERR_OR_NULL(sess->rtrs)) { in close_rtrs()
773 rtrs_clt_close(sess->rtrs); in close_rtrs()
774 sess->rtrs = NULL; in close_rtrs()
775 wake_up_rtrs_waiters(sess); in close_rtrs()
779 static void free_sess(struct rnbd_clt_session *sess) in free_sess() argument
781 WARN_ON(!list_empty(&sess->devs_list)); in free_sess()
785 close_rtrs(sess); in free_sess()
786 destroy_mq_tags(sess); in free_sess()
787 if (!list_empty(&sess->list)) { in free_sess()
789 list_del(&sess->list); in free_sess()
792 free_percpu(sess->cpu_queues); in free_sess()
793 free_percpu(sess->cpu_rr); in free_sess()
794 mutex_destroy(&sess->lock); in free_sess()
795 kfree(sess); in free_sess()
800 struct rnbd_clt_session *sess; in alloc_sess() local
803 sess = kzalloc_node(sizeof(*sess), GFP_KERNEL, NUMA_NO_NODE); in alloc_sess()
804 if (!sess) in alloc_sess()
806 strscpy(sess->sessname, sessname, sizeof(sess->sessname)); in alloc_sess()
807 atomic_set(&sess->busy, 0); in alloc_sess()
808 mutex_init(&sess->lock); in alloc_sess()
809 INIT_LIST_HEAD(&sess->devs_list); in alloc_sess()
810 INIT_LIST_HEAD(&sess->list); in alloc_sess()
811 bitmap_zero(sess->cpu_queues_bm, num_possible_cpus()); in alloc_sess()
812 init_waitqueue_head(&sess->rtrs_waitq); in alloc_sess()
813 refcount_set(&sess->refcount, 1); in alloc_sess()
815 sess->cpu_queues = alloc_percpu(struct rnbd_cpu_qlist); in alloc_sess()
816 if (!sess->cpu_queues) { in alloc_sess()
820 rnbd_init_cpu_qlists(sess->cpu_queues); in alloc_sess()
827 sess->cpu_rr = alloc_percpu(int); in alloc_sess()
828 if (!sess->cpu_rr) { in alloc_sess()
833 * per_cpu_ptr(sess->cpu_rr, cpu) = cpu; in alloc_sess()
835 return sess; in alloc_sess()
838 free_sess(sess); in alloc_sess()
843 static int wait_for_rtrs_connection(struct rnbd_clt_session *sess) in wait_for_rtrs_connection() argument
845 wait_event(sess->rtrs_waitq, sess->rtrs_ready); in wait_for_rtrs_connection()
846 if (IS_ERR_OR_NULL(sess->rtrs)) in wait_for_rtrs_connection()
852 static void wait_for_rtrs_disconnection(struct rnbd_clt_session *sess) in wait_for_rtrs_disconnection() argument
858 prepare_to_wait(&sess->rtrs_waitq, &wait, TASK_UNINTERRUPTIBLE); in wait_for_rtrs_disconnection()
859 if (IS_ERR_OR_NULL(sess->rtrs)) { in wait_for_rtrs_disconnection()
860 finish_wait(&sess->rtrs_waitq, &wait); in wait_for_rtrs_disconnection()
878 struct rnbd_clt_session *sess, *sn; in __find_and_get_sess() local
882 list_for_each_entry_safe(sess, sn, &sess_list, list) { in __find_and_get_sess()
883 if (strcmp(sessname, sess->sessname)) in __find_and_get_sess()
886 if (sess->rtrs_ready && IS_ERR_OR_NULL(sess->rtrs)) in __find_and_get_sess()
892 if (rnbd_clt_get_sess(sess)) { in __find_and_get_sess()
897 err = wait_for_rtrs_connection(sess); in __find_and_get_sess()
899 rnbd_clt_put_sess(sess); in __find_and_get_sess()
906 return sess; in __find_and_get_sess()
912 wait_for_rtrs_disconnection(sess); in __find_and_get_sess()
927 struct rnbd_clt_session *sess = NULL; in find_or_create_sess() local
930 sess = __find_and_get_sess(sessname); in find_or_create_sess()
931 if (!sess) { in find_or_create_sess()
932 sess = alloc_sess(sessname); in find_or_create_sess()
933 if (IS_ERR(sess)) { in find_or_create_sess()
935 return sess; in find_or_create_sess()
937 list_add(&sess->list, &sess_list); in find_or_create_sess()
942 return sess; in find_or_create_sess()
1013 struct rtrs_clt *rtrs = dev->sess->rtrs; in rnbd_client_xfer_request()
1075 struct rnbd_clt_session *sess = dev->sess; in rnbd_clt_dev_add_to_requeue() local
1081 cpu_q = get_cpu_ptr(sess->cpu_queues); in rnbd_clt_dev_add_to_requeue()
1088 need_set = !test_bit(cpu_q->cpu, sess->cpu_queues_bm); in rnbd_clt_dev_add_to_requeue()
1090 set_bit(cpu_q->cpu, sess->cpu_queues_bm); in rnbd_clt_dev_add_to_requeue()
1096 if (atomic_read(&sess->busy)) { in rnbd_clt_dev_add_to_requeue()
1104 clear_bit(cpu_q->cpu, sess->cpu_queues_bm); in rnbd_clt_dev_add_to_requeue()
1111 put_cpu_ptr(sess->cpu_queues); in rnbd_clt_dev_add_to_requeue()
1144 iu->permit = rnbd_get_permit(dev->sess, RTRS_IO_CON, in rnbd_queue_rq()
1162 rnbd_put_permit(dev->sess, iu->permit); in rnbd_queue_rq()
1175 rnbd_put_permit(dev->sess, iu->permit); in rnbd_queue_rq()
1185 cnt = rtrs_clt_rdma_cq_direct(dev->sess->rtrs, hctx->queue_num); in rnbd_rdma_poll()
1191 struct rnbd_clt_session *sess = set->driver_data; in rnbd_rdma_map_queues() local
1201 if (sess->nr_poll_queues) { in rnbd_rdma_map_queues()
1203 set->map[HCTX_TYPE_POLL].nr_queues = sess->nr_poll_queues; in rnbd_rdma_map_queues()
1208 sess->sessname, in rnbd_rdma_map_queues()
1214 sess->sessname, in rnbd_rdma_map_queues()
1229 static int setup_mq_tags(struct rnbd_clt_session *sess) in setup_mq_tags() argument
1231 struct blk_mq_tag_set *tag_set = &sess->tag_set; in setup_mq_tags()
1235 tag_set->queue_depth = sess->queue_depth; in setup_mq_tags()
1242 tag_set->nr_maps = sess->nr_poll_queues ? HCTX_MAX_TYPES : 2; in setup_mq_tags()
1247 tag_set->nr_hw_queues = num_online_cpus() + sess->nr_poll_queues; in setup_mq_tags()
1248 tag_set->driver_data = sess; in setup_mq_tags()
1258 struct rnbd_clt_session *sess; in find_and_get_or_create_sess() local
1264 sess = find_or_create_sess(sessname, &first); in find_and_get_or_create_sess()
1265 if (sess == ERR_PTR(-ENOMEM)) in find_and_get_or_create_sess()
1267 else if ((nr_poll_queues && !first) || (!nr_poll_queues && sess->nr_poll_queues)) { in find_and_get_or_create_sess()
1277 return sess; in find_and_get_or_create_sess()
1286 .priv = sess, in find_and_get_or_create_sess()
1292 sess->rtrs = rtrs_clt_open(&rtrs_ops, sessname, in find_and_get_or_create_sess()
1297 if (IS_ERR(sess->rtrs)) { in find_and_get_or_create_sess()
1298 err = PTR_ERR(sess->rtrs); in find_and_get_or_create_sess()
1302 err = rtrs_clt_query(sess->rtrs, &attrs); in find_and_get_or_create_sess()
1306 sess->max_io_size = attrs.max_io_size; in find_and_get_or_create_sess()
1307 sess->queue_depth = attrs.queue_depth; in find_and_get_or_create_sess()
1308 sess->nr_poll_queues = nr_poll_queues; in find_and_get_or_create_sess()
1309 sess->max_segments = attrs.max_segments; in find_and_get_or_create_sess()
1311 err = setup_mq_tags(sess); in find_and_get_or_create_sess()
1315 err = send_msg_sess_info(sess, RTRS_PERMIT_WAIT); in find_and_get_or_create_sess()
1319 wake_up_rtrs_waiters(sess); in find_and_get_or_create_sess()
1321 return sess; in find_and_get_or_create_sess()
1324 close_rtrs(sess); in find_and_get_or_create_sess()
1326 rnbd_clt_put_sess(sess); in find_and_get_or_create_sess()
1331 wake_up_rtrs_waiters(sess); in find_and_get_or_create_sess()
1382 blk_queue_io_opt(dev->queue, dev->sess->max_io_size); in setup_request_queue()
1422 dev->gd = blk_mq_alloc_disk(&dev->sess->tag_set, dev); in rnbd_client_setup_device()
1433 static struct rnbd_clt_dev *init_dev(struct rnbd_clt_session *sess, in init_dev() argument
1463 pathname, sess->sessname, ret); in init_dev()
1474 dev->sess = sess; in init_dev()
1485 WARN_ON(!rnbd_clt_get_sess(sess)); in init_dev()
1498 struct rnbd_clt_session *sess; in __exists_dev() local
1502 list_for_each_entry(sess, &sess_list, list) { in __exists_dev()
1503 if (sessname && strncmp(sess->sessname, sessname, in __exists_dev()
1504 sizeof(sess->sessname))) in __exists_dev()
1506 mutex_lock(&sess->lock); in __exists_dev()
1507 list_for_each_entry(dev, &sess->devs_list, list) { in __exists_dev()
1514 mutex_unlock(&sess->lock); in __exists_dev()
1536 struct rnbd_clt_session *sess = dev->sess; in insert_dev_if_not_exists_devpath() local
1539 found = __exists_dev(dev->pathname, sess->sessname); in insert_dev_if_not_exists_devpath()
1541 mutex_lock(&sess->lock); in insert_dev_if_not_exists_devpath()
1542 list_add_tail(&dev->list, &sess->devs_list); in insert_dev_if_not_exists_devpath()
1543 mutex_unlock(&sess->lock); in insert_dev_if_not_exists_devpath()
1552 struct rnbd_clt_session *sess = dev->sess; in delete_dev() local
1554 mutex_lock(&sess->lock); in delete_dev()
1556 mutex_unlock(&sess->lock); in delete_dev()
1566 struct rnbd_clt_session *sess; in rnbd_clt_map_device() local
1573 sess = find_and_get_or_create_sess(sessname, paths, path_cnt, port_nr, nr_poll_queues); in rnbd_clt_map_device()
1574 if (IS_ERR(sess)) in rnbd_clt_map_device()
1575 return ERR_CAST(sess); in rnbd_clt_map_device()
1577 dev = init_dev(sess, access_mode, pathname, nr_poll_queues); in rnbd_clt_map_device()
1580 pathname, sess->sessname, PTR_ERR(dev)); in rnbd_clt_map_device()
1597 sess->sessname, pathname); in rnbd_clt_map_device()
1617 rnbd_clt_put_sess(sess); in rnbd_clt_map_device()
1628 rnbd_clt_put_sess(sess); in rnbd_clt_map_device()
1655 struct rnbd_clt_session *sess = dev->sess; in rnbd_clt_unmap_device() local
1680 if (was_mapped && sess->rtrs) in rnbd_clt_unmap_device()
1733 struct rnbd_clt_session *sess, *sn; in rnbd_destroy_sessions() local
1754 list_for_each_entry_safe(sess, sn, &sess_list, list) { in rnbd_destroy_sessions()
1755 if (!rnbd_clt_get_sess(sess)) in rnbd_destroy_sessions()
1757 close_rtrs(sess); in rnbd_destroy_sessions()
1758 list_for_each_entry_safe(dev, tn, &sess->devs_list, list) { in rnbd_destroy_sessions()
1768 rnbd_clt_put_sess(sess); in rnbd_destroy_sessions()