Lines Matching refs:sess

36 static inline bool rnbd_clt_get_sess(struct rnbd_clt_session *sess)
38 return refcount_inc_not_zero(&sess->refcount);
41 static void free_sess(struct rnbd_clt_session *sess);
43 static void rnbd_clt_put_sess(struct rnbd_clt_session *sess)
47 if (refcount_dec_and_test(&sess->refcount))
48 free_sess(sess);
61 rnbd_clt_put_sess(dev->sess);
152 * @sess: Session to find a queue for
161 rnbd_get_cpu_qlist(struct rnbd_clt_session *sess, int cpu)
166 bit = find_next_bit(sess->cpu_queues_bm, nr_cpu_ids, cpu);
168 return per_cpu_ptr(sess->cpu_queues, bit);
171 bit = find_first_bit(sess->cpu_queues_bm, cpu);
173 return per_cpu_ptr(sess->cpu_queues, bit);
186 * @sess: Session to rerun a queue on
199 static bool rnbd_rerun_if_needed(struct rnbd_clt_session *sess)
211 cpup = get_cpu_ptr(sess->cpu_rr);
212 for (cpu_q = rnbd_get_cpu_qlist(sess, nxt_cpu(*cpup)); cpu_q;
213 cpu_q = rnbd_get_cpu_qlist(sess, nxt_cpu(cpu_q->cpu))) {
216 if (!test_bit(cpu_q->cpu, sess->cpu_queues_bm))
228 clear_bit(cpu_q->cpu, sess->cpu_queues_bm);
246 put_cpu_ptr(sess->cpu_rr);
258 * @sess: Session to rerun the queues on
274 * one who observes sess->busy == 0) must wake up all remaining queues.
279 static void rnbd_rerun_all_if_idle(struct rnbd_clt_session *sess)
284 requeued = rnbd_rerun_if_needed(sess);
285 } while (atomic_read(&sess->busy) == 0 && requeued);
288 static struct rtrs_permit *rnbd_get_permit(struct rnbd_clt_session *sess,
294 permit = rtrs_clt_get_permit(sess->rtrs, con_type, wait);
301 atomic_inc(&sess->busy);
306 static void rnbd_put_permit(struct rnbd_clt_session *sess,
309 rtrs_clt_put_permit(sess->rtrs, permit);
310 atomic_dec(&sess->busy);
315 rnbd_rerun_all_if_idle(sess);
318 static struct rnbd_iu *rnbd_get_iu(struct rnbd_clt_session *sess,
329 permit = rnbd_get_permit(sess, con_type, wait);
349 rnbd_put_permit(sess, permit);
357 static void rnbd_put_iu(struct rnbd_clt_session *sess, struct rnbd_iu *iu)
361 rnbd_put_permit(sess, iu->permit);
369 struct rnbd_clt_session *sess = dev->sess;
374 rnbd_put_permit(sess, iu->permit);
440 rnbd_put_iu(dev->sess, iu);
447 struct rnbd_clt_session *sess = dev->sess;
456 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT);
467 err = send_usr_msg(sess->rtrs, WRITE, iu, &vec, 0, NULL, 0,
471 rnbd_put_iu(sess, iu);
476 rnbd_put_iu(sess, iu);
511 rnbd_put_iu(dev->sess, iu);
519 struct rnbd_clt_session *sess = iu->sess;
522 sess->ver = min_t(u8, rsp->ver, RNBD_PROTO_VER_MAJOR);
526 rnbd_put_iu(sess, iu);
527 rnbd_clt_put_sess(sess);
532 struct rnbd_clt_session *sess = dev->sess;
546 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT);
562 err = send_usr_msg(sess->rtrs, READ, iu,
567 rnbd_put_iu(sess, iu);
573 rnbd_put_iu(sess, iu);
577 static int send_msg_sess_info(struct rnbd_clt_session *sess, enum wait_type wait)
592 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT);
599 iu->sess = sess;
605 if (!rnbd_clt_get_sess(sess)) {
615 err = send_usr_msg(sess->rtrs, READ, iu,
619 rnbd_clt_put_sess(sess);
621 rnbd_put_iu(sess, iu);
626 rnbd_put_iu(sess, iu);
630 static void set_dev_states_to_disconnected(struct rnbd_clt_session *sess)
635 mutex_lock(&sess->lock);
636 list_for_each_entry(dev, &sess->devs_list, list) {
647 mutex_unlock(&sess->lock);
650 static void remap_devs(struct rnbd_clt_session *sess)
667 err = send_msg_sess_info(sess, RTRS_PERMIT_NOWAIT);
669 pr_err("send_msg_sess_info(\"%s\"): %d\n", sess->sessname, err);
673 err = rtrs_clt_query(sess->rtrs, &attrs);
675 pr_err("rtrs_clt_query(\"%s\"): %d\n", sess->sessname, err);
678 mutex_lock(&sess->lock);
679 sess->max_io_size = attrs.max_io_size;
681 list_for_each_entry(dev, &sess->devs_list, list) {
701 mutex_unlock(&sess->lock);
706 struct rnbd_clt_session *sess = priv;
710 set_dev_states_to_disconnected(sess);
713 remap_devs(sess);
717 ev, sess->sessname);
735 static void destroy_mq_tags(struct rnbd_clt_session *sess)
737 if (sess->tag_set.tags)
738 blk_mq_free_tag_set(&sess->tag_set);
741 static inline void wake_up_rtrs_waiters(struct rnbd_clt_session *sess)
743 sess->rtrs_ready = true;
744 wake_up_all(&sess->rtrs_waitq);
747 static void close_rtrs(struct rnbd_clt_session *sess)
751 if (!IS_ERR_OR_NULL(sess->rtrs)) {
752 rtrs_clt_close(sess->rtrs);
753 sess->rtrs = NULL;
754 wake_up_rtrs_waiters(sess);
758 static void free_sess(struct rnbd_clt_session *sess)
760 WARN_ON(!list_empty(&sess->devs_list));
764 close_rtrs(sess);
765 destroy_mq_tags(sess);
766 if (!list_empty(&sess->list)) {
768 list_del(&sess->list);
771 free_percpu(sess->cpu_queues);
772 free_percpu(sess->cpu_rr);
773 mutex_destroy(&sess->lock);
774 kfree(sess);
779 struct rnbd_clt_session *sess;
782 sess = kzalloc_node(sizeof(*sess), GFP_KERNEL, NUMA_NO_NODE);
783 if (!sess)
785 strscpy(sess->sessname, sessname, sizeof(sess->sessname));
786 atomic_set(&sess->busy, 0);
787 mutex_init(&sess->lock);
788 INIT_LIST_HEAD(&sess->devs_list);
789 INIT_LIST_HEAD(&sess->list);
790 bitmap_zero(sess->cpu_queues_bm, num_possible_cpus());
791 init_waitqueue_head(&sess->rtrs_waitq);
792 refcount_set(&sess->refcount, 1);
794 sess->cpu_queues = alloc_percpu(struct rnbd_cpu_qlist);
795 if (!sess->cpu_queues) {
799 rnbd_init_cpu_qlists(sess->cpu_queues);
806 sess->cpu_rr = alloc_percpu(int);
807 if (!sess->cpu_rr) {
812 * per_cpu_ptr(sess->cpu_rr, cpu) = cpu;
814 return sess;
817 free_sess(sess);
822 static int wait_for_rtrs_connection(struct rnbd_clt_session *sess)
824 wait_event(sess->rtrs_waitq, sess->rtrs_ready);
825 if (IS_ERR_OR_NULL(sess->rtrs))
831 static void wait_for_rtrs_disconnection(struct rnbd_clt_session *sess)
837 prepare_to_wait(&sess->rtrs_waitq, &wait, TASK_UNINTERRUPTIBLE);
838 if (IS_ERR_OR_NULL(sess->rtrs)) {
839 finish_wait(&sess->rtrs_waitq, &wait);
857 struct rnbd_clt_session *sess, *sn;
861 list_for_each_entry_safe(sess, sn, &sess_list, list) {
862 if (strcmp(sessname, sess->sessname))
865 if (sess->rtrs_ready && IS_ERR_OR_NULL(sess->rtrs))
871 if (rnbd_clt_get_sess(sess)) {
876 err = wait_for_rtrs_connection(sess);
878 rnbd_clt_put_sess(sess);
885 return sess;
891 wait_for_rtrs_disconnection(sess);
906 struct rnbd_clt_session *sess = NULL;
909 sess = __find_and_get_sess(sessname);
910 if (!sess) {
911 sess = alloc_sess(sessname);
912 if (IS_ERR(sess)) {
914 return sess;
916 list_add(&sess->list, &sess_list);
921 return sess;
992 struct rtrs_clt_sess *rtrs = dev->sess->rtrs;
1054 struct rnbd_clt_session *sess = dev->sess;
1060 cpu_q = get_cpu_ptr(sess->cpu_queues);
1067 need_set = !test_bit(cpu_q->cpu, sess->cpu_queues_bm);
1069 set_bit(cpu_q->cpu, sess->cpu_queues_bm);
1075 if (atomic_read(&sess->busy)) {
1083 clear_bit(cpu_q->cpu, sess->cpu_queues_bm);
1090 put_cpu_ptr(sess->cpu_queues);
1123 iu->permit = rnbd_get_permit(dev->sess, RTRS_IO_CON,
1141 rnbd_put_permit(dev->sess, iu->permit);
1154 rnbd_put_permit(dev->sess, iu->permit);
1163 return rtrs_clt_rdma_cq_direct(dev->sess->rtrs, hctx->queue_num);
1168 struct rnbd_clt_session *sess = set->driver_data;
1178 if (sess->nr_poll_queues) {
1180 set->map[HCTX_TYPE_POLL].nr_queues = sess->nr_poll_queues;
1185 sess->sessname,
1191 sess->sessname,
1204 static int setup_mq_tags(struct rnbd_clt_session *sess)
1206 struct blk_mq_tag_set *tag_set = &sess->tag_set;
1210 tag_set->queue_depth = sess->queue_depth;
1217 tag_set->nr_maps = sess->nr_poll_queues ? HCTX_MAX_TYPES : 2;
1222 tag_set->nr_hw_queues = num_online_cpus() + sess->nr_poll_queues;
1223 tag_set->driver_data = sess;
1233 struct rnbd_clt_session *sess;
1239 sess = find_or_create_sess(sessname, &first);
1240 if (sess == ERR_PTR(-ENOMEM)) {
1242 } else if ((nr_poll_queues && !first) || (!nr_poll_queues && sess->nr_poll_queues)) {
1252 return sess;
1261 .priv = sess,
1267 sess->rtrs = rtrs_clt_open(&rtrs_ops, sessname,
1272 if (IS_ERR(sess->rtrs)) {
1273 err = PTR_ERR(sess->rtrs);
1277 err = rtrs_clt_query(sess->rtrs, &attrs);
1281 sess->max_io_size = attrs.max_io_size;
1282 sess->queue_depth = attrs.queue_depth;
1283 sess->nr_poll_queues = nr_poll_queues;
1284 sess->max_segments = attrs.max_segments;
1286 err = setup_mq_tags(sess);
1290 err = send_msg_sess_info(sess, RTRS_PERMIT_WAIT);
1294 wake_up_rtrs_waiters(sess);
1296 return sess;
1299 close_rtrs(sess);
1301 rnbd_clt_put_sess(sess);
1306 wake_up_rtrs_waiters(sess);
1340 dev->sess->max_io_size / SECTOR_SIZE);
1359 blk_queue_max_segments(dev->queue, dev->sess->max_segments);
1360 blk_queue_io_opt(dev->queue, dev->sess->max_io_size);
1409 dev->gd = blk_mq_alloc_disk(&dev->sess->tag_set, dev);
1419 static struct rnbd_clt_dev *init_dev(struct rnbd_clt_session *sess,
1447 pathname, sess->sessname, ret);
1458 dev->sess = sess;
1469 WARN_ON(!rnbd_clt_get_sess(sess));
1482 struct rnbd_clt_session *sess;
1486 list_for_each_entry(sess, &sess_list, list) {
1487 if (sessname && strncmp(sess->sessname, sessname,
1488 sizeof(sess->sessname)))
1490 mutex_lock(&sess->lock);
1491 list_for_each_entry(dev, &sess->devs_list, list) {
1498 mutex_unlock(&sess->lock);
1520 struct rnbd_clt_session *sess = dev->sess;
1523 found = __exists_dev(dev->pathname, sess->sessname);
1525 mutex_lock(&sess->lock);
1526 list_add_tail(&dev->list, &sess->devs_list);
1527 mutex_unlock(&sess->lock);
1536 struct rnbd_clt_session *sess = dev->sess;
1538 mutex_lock(&sess->lock);
1540 mutex_unlock(&sess->lock);
1550 struct rnbd_clt_session *sess;
1564 sess = find_and_get_or_create_sess(sessname, paths, path_cnt, port_nr, nr_poll_queues);
1565 if (IS_ERR(sess))
1566 return ERR_CAST(sess);
1568 dev = init_dev(sess, access_mode, pathname, nr_poll_queues);
1571 pathname, sess->sessname, PTR_ERR(dev));
1586 iu = rnbd_get_iu(sess, RTRS_ADMIN_CON, RTRS_PERMIT_WAIT);
1601 ret = send_usr_msg(sess->rtrs, READ, iu,
1606 rnbd_put_iu(sess, iu);
1618 sess->sessname, pathname);
1637 sess->max_segments, sess->max_io_size / SECTOR_SIZE,
1643 rnbd_put_iu(sess, iu);
1644 rnbd_clt_put_sess(sess);
1652 rnbd_put_iu(sess, iu);
1658 rnbd_clt_put_sess(sess);
1685 struct rnbd_clt_session *sess = dev->sess;
1710 if (was_mapped && sess->rtrs)
1763 struct rnbd_clt_session *sess, *sn;
1784 list_for_each_entry_safe(sess, sn, &sess_list, list) {
1785 if (!rnbd_clt_get_sess(sess))
1787 close_rtrs(sess);
1788 list_for_each_entry_safe(dev, tn, &sess->devs_list, list) {
1798 rnbd_clt_put_sess(sess);