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
92 dev->max_hw_sectors = sess->max_io_size / SECTOR_SIZE; in rnbd_clt_set_dev_attr()
185 rnbd_get_cpu_qlist(struct rnbd_clt_session *sess, int cpu) in rnbd_get_cpu_qlist() argument
190 bit = find_next_bit(sess->cpu_queues_bm, nr_cpu_ids, cpu); in rnbd_get_cpu_qlist()
192 return per_cpu_ptr(sess->cpu_queues, bit); in rnbd_get_cpu_qlist()
195 bit = find_next_bit(sess->cpu_queues_bm, cpu, 0); in rnbd_get_cpu_qlist()
197 return per_cpu_ptr(sess->cpu_queues, bit); in rnbd_get_cpu_qlist()
223 static bool rnbd_rerun_if_needed(struct rnbd_clt_session *sess) in rnbd_rerun_if_needed() argument
235 cpup = get_cpu_ptr(sess->cpu_rr); in rnbd_rerun_if_needed()
236 for (cpu_q = rnbd_get_cpu_qlist(sess, nxt_cpu(*cpup)); cpu_q; in rnbd_rerun_if_needed()
237 cpu_q = rnbd_get_cpu_qlist(sess, nxt_cpu(cpu_q->cpu))) { in rnbd_rerun_if_needed()
240 if (unlikely(!test_bit(cpu_q->cpu, sess->cpu_queues_bm))) in rnbd_rerun_if_needed()
252 clear_bit(cpu_q->cpu, sess->cpu_queues_bm); in rnbd_rerun_if_needed()
270 put_cpu_var(sess->cpu_rr); in rnbd_rerun_if_needed()
303 static void rnbd_rerun_all_if_idle(struct rnbd_clt_session *sess) in rnbd_rerun_all_if_idle() argument
308 requeued = rnbd_rerun_if_needed(sess); in rnbd_rerun_all_if_idle()
309 } while (atomic_read(&sess->busy) == 0 && requeued); in rnbd_rerun_all_if_idle()
312 static struct rtrs_permit *rnbd_get_permit(struct rnbd_clt_session *sess, in rnbd_get_permit() argument
318 permit = rtrs_clt_get_permit(sess->rtrs, con_type, in rnbd_get_permit()
327 atomic_inc(&sess->busy); in rnbd_get_permit()
332 static void rnbd_put_permit(struct rnbd_clt_session *sess, in rnbd_put_permit() argument
335 rtrs_clt_put_permit(sess->rtrs, permit); in rnbd_put_permit()
336 atomic_dec(&sess->busy); in rnbd_put_permit()
341 rnbd_rerun_all_if_idle(sess); in rnbd_put_permit()
344 static struct rnbd_iu *rnbd_get_iu(struct rnbd_clt_session *sess, in rnbd_get_iu() argument
351 permit = rnbd_get_permit(sess, con_type, in rnbd_get_iu()
373 static void rnbd_put_iu(struct rnbd_clt_session *sess, struct rnbd_iu *iu) in rnbd_put_iu() argument
376 rnbd_put_permit(sess, iu->permit); in rnbd_put_iu()
382 struct rnbd_clt_session *sess = dev->sess; in rnbd_softirq_done_fn() local
386 rnbd_put_permit(sess, iu->permit); in rnbd_softirq_done_fn()
457 rnbd_put_iu(dev->sess, iu); in msg_close_conf()
463 struct rnbd_clt_session *sess = dev->sess; in send_msg_close() local
472 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT); in send_msg_close()
485 err = send_usr_msg(sess->rtrs, WRITE, iu, &vec, 0, NULL, 0, in send_msg_close()
489 rnbd_put_iu(sess, iu); in send_msg_close()
494 rnbd_put_iu(sess, iu); in send_msg_close()
522 rnbd_put_iu(dev->sess, iu); in msg_open_conf()
530 struct rnbd_clt_session *sess = iu->sess; in msg_sess_info_conf() local
533 sess->ver = min_t(u8, rsp->ver, RNBD_PROTO_VER_MAJOR); in msg_sess_info_conf()
537 rnbd_put_iu(sess, iu); in msg_sess_info_conf()
538 rnbd_clt_put_sess(sess); in msg_sess_info_conf()
543 struct rnbd_clt_session *sess = dev->sess; in send_msg_open() local
557 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT); in send_msg_open()
573 err = send_usr_msg(sess->rtrs, READ, iu, in send_msg_open()
578 rnbd_put_iu(sess, iu); in send_msg_open()
584 rnbd_put_iu(sess, iu); in send_msg_open()
588 static int send_msg_sess_info(struct rnbd_clt_session *sess, bool wait) in send_msg_sess_info() argument
603 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT); in send_msg_sess_info()
610 iu->sess = sess; in send_msg_sess_info()
617 if (!rnbd_clt_get_sess(sess)) { in send_msg_sess_info()
627 err = send_usr_msg(sess->rtrs, READ, iu, in send_msg_sess_info()
631 rnbd_clt_put_sess(sess); in send_msg_sess_info()
633 rnbd_put_iu(sess, iu); in send_msg_sess_info()
639 rnbd_put_iu(sess, iu); in send_msg_sess_info()
643 static void set_dev_states_to_disconnected(struct rnbd_clt_session *sess) in set_dev_states_to_disconnected() argument
647 mutex_lock(&sess->lock); in set_dev_states_to_disconnected()
648 list_for_each_entry(dev, &sess->devs_list, list) { in set_dev_states_to_disconnected()
656 mutex_unlock(&sess->lock); in set_dev_states_to_disconnected()
659 static void remap_devs(struct rnbd_clt_session *sess) in remap_devs() argument
676 err = send_msg_sess_info(sess, NO_WAIT); in remap_devs()
678 pr_err("send_msg_sess_info(\"%s\"): %d\n", sess->sessname, err); in remap_devs()
682 err = rtrs_clt_query(sess->rtrs, &attrs); in remap_devs()
684 pr_err("rtrs_clt_query(\"%s\"): %d\n", sess->sessname, err); in remap_devs()
687 mutex_lock(&sess->lock); in remap_devs()
688 sess->max_io_size = attrs.max_io_size; in remap_devs()
690 list_for_each_entry(dev, &sess->devs_list, list) { in remap_devs()
710 mutex_unlock(&sess->lock); in remap_devs()
715 struct rnbd_clt_session *sess = priv; in rnbd_clt_link_ev() local
719 set_dev_states_to_disconnected(sess); in rnbd_clt_link_ev()
722 remap_devs(sess); in rnbd_clt_link_ev()
726 ev, sess->sessname); in rnbd_clt_link_ev()
744 static void destroy_mq_tags(struct rnbd_clt_session *sess) in destroy_mq_tags() argument
746 if (sess->tag_set.tags) in destroy_mq_tags()
747 blk_mq_free_tag_set(&sess->tag_set); in destroy_mq_tags()
750 static inline void wake_up_rtrs_waiters(struct rnbd_clt_session *sess) in wake_up_rtrs_waiters() argument
752 sess->rtrs_ready = true; in wake_up_rtrs_waiters()
753 wake_up_all(&sess->rtrs_waitq); in wake_up_rtrs_waiters()
756 static void close_rtrs(struct rnbd_clt_session *sess) in close_rtrs() argument
760 if (!IS_ERR_OR_NULL(sess->rtrs)) { in close_rtrs()
761 rtrs_clt_close(sess->rtrs); in close_rtrs()
762 sess->rtrs = NULL; in close_rtrs()
763 wake_up_rtrs_waiters(sess); in close_rtrs()
767 static void free_sess(struct rnbd_clt_session *sess) in free_sess() argument
769 WARN_ON(!list_empty(&sess->devs_list)); in free_sess()
773 close_rtrs(sess); in free_sess()
774 destroy_mq_tags(sess); in free_sess()
775 if (!list_empty(&sess->list)) { in free_sess()
777 list_del(&sess->list); in free_sess()
780 free_percpu(sess->cpu_queues); in free_sess()
781 free_percpu(sess->cpu_rr); in free_sess()
782 mutex_destroy(&sess->lock); in free_sess()
783 kfree(sess); in free_sess()
788 struct rnbd_clt_session *sess; in alloc_sess() local
791 sess = kzalloc_node(sizeof(*sess), GFP_KERNEL, NUMA_NO_NODE); in alloc_sess()
792 if (!sess) in alloc_sess()
794 strlcpy(sess->sessname, sessname, sizeof(sess->sessname)); in alloc_sess()
795 atomic_set(&sess->busy, 0); in alloc_sess()
796 mutex_init(&sess->lock); in alloc_sess()
797 INIT_LIST_HEAD(&sess->devs_list); in alloc_sess()
798 INIT_LIST_HEAD(&sess->list); in alloc_sess()
799 bitmap_zero(sess->cpu_queues_bm, NR_CPUS); in alloc_sess()
800 init_waitqueue_head(&sess->rtrs_waitq); in alloc_sess()
801 refcount_set(&sess->refcount, 1); in alloc_sess()
803 sess->cpu_queues = alloc_percpu(struct rnbd_cpu_qlist); in alloc_sess()
804 if (!sess->cpu_queues) { in alloc_sess()
808 rnbd_init_cpu_qlists(sess->cpu_queues); in alloc_sess()
815 sess->cpu_rr = alloc_percpu(int); in alloc_sess()
816 if (!sess->cpu_rr) { in alloc_sess()
821 * per_cpu_ptr(sess->cpu_rr, cpu) = cpu; in alloc_sess()
823 return sess; in alloc_sess()
826 free_sess(sess); in alloc_sess()
831 static int wait_for_rtrs_connection(struct rnbd_clt_session *sess) in wait_for_rtrs_connection() argument
833 wait_event(sess->rtrs_waitq, sess->rtrs_ready); in wait_for_rtrs_connection()
834 if (IS_ERR_OR_NULL(sess->rtrs)) in wait_for_rtrs_connection()
840 static void wait_for_rtrs_disconnection(struct rnbd_clt_session *sess) in wait_for_rtrs_disconnection() argument
846 prepare_to_wait(&sess->rtrs_waitq, &wait, TASK_UNINTERRUPTIBLE); in wait_for_rtrs_disconnection()
847 if (IS_ERR_OR_NULL(sess->rtrs)) { in wait_for_rtrs_disconnection()
848 finish_wait(&sess->rtrs_waitq, &wait); in wait_for_rtrs_disconnection()
866 struct rnbd_clt_session *sess, *sn; in __find_and_get_sess() local
870 list_for_each_entry_safe(sess, sn, &sess_list, list) { in __find_and_get_sess()
871 if (strcmp(sessname, sess->sessname)) in __find_and_get_sess()
874 if (sess->rtrs_ready && IS_ERR_OR_NULL(sess->rtrs)) in __find_and_get_sess()
880 if (rnbd_clt_get_sess(sess)) { in __find_and_get_sess()
885 err = wait_for_rtrs_connection(sess); in __find_and_get_sess()
887 rnbd_clt_put_sess(sess); in __find_and_get_sess()
894 return sess; in __find_and_get_sess()
900 wait_for_rtrs_disconnection(sess); in __find_and_get_sess()
914 struct rnbd_clt_session *sess = NULL; in find_or_create_sess() local
917 sess = __find_and_get_sess(sessname); in find_or_create_sess()
918 if (!sess) { in find_or_create_sess()
919 sess = alloc_sess(sessname); in find_or_create_sess()
920 if (IS_ERR(sess)) { in find_or_create_sess()
922 return sess; in find_or_create_sess()
924 list_add(&sess->list, &sess_list); in find_or_create_sess()
930 return sess; in find_or_create_sess()
1001 struct rtrs_clt *rtrs = dev->sess->rtrs; in rnbd_client_xfer_request()
1064 struct rnbd_clt_session *sess = dev->sess; in rnbd_clt_dev_add_to_requeue() local
1070 cpu_q = get_cpu_ptr(sess->cpu_queues); in rnbd_clt_dev_add_to_requeue()
1077 need_set = !test_bit(cpu_q->cpu, sess->cpu_queues_bm); in rnbd_clt_dev_add_to_requeue()
1079 set_bit(cpu_q->cpu, sess->cpu_queues_bm); in rnbd_clt_dev_add_to_requeue()
1085 if (likely(atomic_read(&sess->busy))) { in rnbd_clt_dev_add_to_requeue()
1093 clear_bit(cpu_q->cpu, sess->cpu_queues_bm); in rnbd_clt_dev_add_to_requeue()
1100 put_cpu_ptr(sess->cpu_queues); in rnbd_clt_dev_add_to_requeue()
1132 iu->permit = rnbd_get_permit(dev->sess, RTRS_IO_CON, in rnbd_queue_rq()
1145 rnbd_put_permit(dev->sess, iu->permit); in rnbd_queue_rq()
1149 rnbd_put_permit(dev->sess, iu->permit); in rnbd_queue_rq()
1168 static int setup_mq_tags(struct rnbd_clt_session *sess) in setup_mq_tags() argument
1170 struct blk_mq_tag_set *tag_set = &sess->tag_set; in setup_mq_tags()
1174 tag_set->queue_depth = sess->queue_depth; in setup_mq_tags()
1189 struct rnbd_clt_session *sess; in find_and_get_or_create_sess() local
1195 sess = find_or_create_sess(sessname, &first); in find_and_get_or_create_sess()
1196 if (sess == ERR_PTR(-ENOMEM)) in find_and_get_or_create_sess()
1199 return sess; in find_and_get_or_create_sess()
1202 .priv = sess, in find_and_get_or_create_sess()
1208 sess->rtrs = rtrs_clt_open(&rtrs_ops, sessname, in find_and_get_or_create_sess()
1214 if (IS_ERR(sess->rtrs)) { in find_and_get_or_create_sess()
1215 err = PTR_ERR(sess->rtrs); in find_and_get_or_create_sess()
1219 err = rtrs_clt_query(sess->rtrs, &attrs); in find_and_get_or_create_sess()
1223 sess->max_io_size = attrs.max_io_size; in find_and_get_or_create_sess()
1224 sess->queue_depth = attrs.queue_depth; in find_and_get_or_create_sess()
1226 err = setup_mq_tags(sess); in find_and_get_or_create_sess()
1230 err = send_msg_sess_info(sess, WAIT); in find_and_get_or_create_sess()
1234 wake_up_rtrs_waiters(sess); in find_and_get_or_create_sess()
1236 return sess; in find_and_get_or_create_sess()
1239 close_rtrs(sess); in find_and_get_or_create_sess()
1241 rnbd_clt_put_sess(sess); in find_and_get_or_create_sess()
1246 wake_up_rtrs_waiters(sess); in find_and_get_or_create_sess()
1274 dev->queue = blk_mq_init_queue(&dev->sess->tag_set); in setup_mq_dev()
1309 blk_queue_io_opt(dev->queue, dev->sess->max_io_size); in setup_request_queue()
1342 static int rnbd_client_setup_device(struct rnbd_clt_session *sess, in rnbd_client_setup_device() argument
1366 static struct rnbd_clt_dev *init_dev(struct rnbd_clt_session *sess, in init_dev() argument
1390 pathname, sess->sessname, ret); in init_dev()
1401 dev->sess = sess; in init_dev()
1411 WARN_ON(!rnbd_clt_get_sess(sess)); in init_dev()
1424 struct rnbd_clt_session *sess; in __exists_dev() local
1428 list_for_each_entry(sess, &sess_list, list) { in __exists_dev()
1429 mutex_lock(&sess->lock); in __exists_dev()
1430 list_for_each_entry(dev, &sess->devs_list, list) { in __exists_dev()
1437 mutex_unlock(&sess->lock); in __exists_dev()
1457 struct rnbd_clt_session *sess, in insert_dev_if_not_exists_devpath() argument
1465 mutex_lock(&sess->lock); in insert_dev_if_not_exists_devpath()
1466 list_add_tail(&dev->list, &sess->devs_list); in insert_dev_if_not_exists_devpath()
1467 mutex_unlock(&sess->lock); in insert_dev_if_not_exists_devpath()
1476 struct rnbd_clt_session *sess = dev->sess; in delete_dev() local
1478 mutex_lock(&sess->lock); in delete_dev()
1480 mutex_unlock(&sess->lock); in delete_dev()
1489 struct rnbd_clt_session *sess; in rnbd_clt_map_device() local
1496 sess = find_and_get_or_create_sess(sessname, paths, path_cnt, port_nr); in rnbd_clt_map_device()
1497 if (IS_ERR(sess)) in rnbd_clt_map_device()
1498 return ERR_CAST(sess); in rnbd_clt_map_device()
1500 dev = init_dev(sess, access_mode, pathname); in rnbd_clt_map_device()
1503 pathname, sess->sessname, PTR_ERR(dev)); in rnbd_clt_map_device()
1507 if (insert_dev_if_not_exists_devpath(pathname, sess, dev)) { in rnbd_clt_map_device()
1520 sess->sessname, pathname); in rnbd_clt_map_device()
1521 ret = rnbd_client_setup_device(sess, dev, dev->clt_device_id); in rnbd_clt_map_device()
1542 rnbd_clt_put_sess(sess); in rnbd_clt_map_device()
1553 rnbd_clt_put_sess(sess); in rnbd_clt_map_device()
1581 struct rnbd_clt_session *sess = dev->sess; in rnbd_clt_unmap_device() local
1606 if (was_mapped && sess->rtrs) in rnbd_clt_unmap_device()
1659 struct rnbd_clt_session *sess, *sn; in rnbd_destroy_sessions() local
1681 list_for_each_entry_safe(sess, sn, &sess_list, list) { in rnbd_destroy_sessions()
1682 if (!rnbd_clt_get_sess(sess)) in rnbd_destroy_sessions()
1684 close_rtrs(sess); in rnbd_destroy_sessions()
1685 list_for_each_entry_safe(dev, tn, &sess->devs_list, list) { in rnbd_destroy_sessions()
1695 rnbd_clt_put_sess(sess); in rnbd_destroy_sessions()