Lines Matching refs:xps

24 typedef struct rpc_xprt *(*xprt_switch_find_xprt_t)(struct rpc_xprt_switch *xps,
31 static void xprt_switch_add_xprt_locked(struct rpc_xprt_switch *xps, in xprt_switch_add_xprt_locked() argument
36 list_add_tail_rcu(&xprt->xprt_switch, &xps->xps_xprt_list); in xprt_switch_add_xprt_locked()
38 if (xps->xps_nxprts == 0) in xprt_switch_add_xprt_locked()
39 xps->xps_net = xprt->xprt_net; in xprt_switch_add_xprt_locked()
40 xps->xps_nxprts++; in xprt_switch_add_xprt_locked()
41 xps->xps_nactive++; in xprt_switch_add_xprt_locked()
51 void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps, in rpc_xprt_switch_add_xprt() argument
56 spin_lock(&xps->xps_lock); in rpc_xprt_switch_add_xprt()
57 if (xps->xps_net == xprt->xprt_net || xps->xps_net == NULL) in rpc_xprt_switch_add_xprt()
58 xprt_switch_add_xprt_locked(xps, xprt); in rpc_xprt_switch_add_xprt()
59 spin_unlock(&xps->xps_lock); in rpc_xprt_switch_add_xprt()
60 rpc_sysfs_xprt_setup(xps, xprt, GFP_KERNEL); in rpc_xprt_switch_add_xprt()
63 static void xprt_switch_remove_xprt_locked(struct rpc_xprt_switch *xps, in xprt_switch_remove_xprt_locked() argument
69 xps->xps_nactive--; in xprt_switch_remove_xprt_locked()
70 xps->xps_nxprts--; in xprt_switch_remove_xprt_locked()
71 if (xps->xps_nxprts == 0) in xprt_switch_remove_xprt_locked()
72 xps->xps_net = NULL; in xprt_switch_remove_xprt_locked()
84 void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps, in rpc_xprt_switch_remove_xprt() argument
87 spin_lock(&xps->xps_lock); in rpc_xprt_switch_remove_xprt()
88 xprt_switch_remove_xprt_locked(xps, xprt); in rpc_xprt_switch_remove_xprt()
89 spin_unlock(&xps->xps_lock); in rpc_xprt_switch_remove_xprt()
100 static int xprt_switch_alloc_id(struct rpc_xprt_switch *xps, gfp_t gfp_flags) in xprt_switch_alloc_id() argument
108 xps->xps_id = id; in xprt_switch_alloc_id()
112 static void xprt_switch_free_id(struct rpc_xprt_switch *xps) in xprt_switch_free_id() argument
114 ida_simple_remove(&rpc_xprtswitch_ids, xps->xps_id); in xprt_switch_free_id()
128 struct rpc_xprt_switch *xps; in xprt_switch_alloc() local
130 xps = kmalloc(sizeof(*xps), gfp_flags); in xprt_switch_alloc()
131 if (xps != NULL) { in xprt_switch_alloc()
132 spin_lock_init(&xps->xps_lock); in xprt_switch_alloc()
133 kref_init(&xps->xps_kref); in xprt_switch_alloc()
134 xprt_switch_alloc_id(xps, gfp_flags); in xprt_switch_alloc()
135 xps->xps_nxprts = xps->xps_nactive = 0; in xprt_switch_alloc()
136 atomic_long_set(&xps->xps_queuelen, 0); in xprt_switch_alloc()
137 xps->xps_net = NULL; in xprt_switch_alloc()
138 INIT_LIST_HEAD(&xps->xps_xprt_list); in xprt_switch_alloc()
139 xps->xps_iter_ops = &rpc_xprt_iter_singular; in xprt_switch_alloc()
140 rpc_sysfs_xprt_switch_setup(xps, xprt, gfp_flags); in xprt_switch_alloc()
141 xprt_switch_add_xprt_locked(xps, xprt); in xprt_switch_alloc()
142 xps->xps_nunique_destaddr_xprts = 1; in xprt_switch_alloc()
143 rpc_sysfs_xprt_setup(xps, xprt, gfp_flags); in xprt_switch_alloc()
146 return xps; in xprt_switch_alloc()
149 static void xprt_switch_free_entries(struct rpc_xprt_switch *xps) in xprt_switch_free_entries() argument
151 spin_lock(&xps->xps_lock); in xprt_switch_free_entries()
152 while (!list_empty(&xps->xps_xprt_list)) { in xprt_switch_free_entries()
155 xprt = list_first_entry(&xps->xps_xprt_list, in xprt_switch_free_entries()
157 xprt_switch_remove_xprt_locked(xps, xprt); in xprt_switch_free_entries()
158 spin_unlock(&xps->xps_lock); in xprt_switch_free_entries()
160 spin_lock(&xps->xps_lock); in xprt_switch_free_entries()
162 spin_unlock(&xps->xps_lock); in xprt_switch_free_entries()
167 struct rpc_xprt_switch *xps = container_of(kref, in xprt_switch_free() local
170 xprt_switch_free_entries(xps); in xprt_switch_free()
171 rpc_sysfs_xprt_switch_destroy(xps); in xprt_switch_free()
172 xprt_switch_free_id(xps); in xprt_switch_free()
173 kfree_rcu(xps, xps_rcu); in xprt_switch_free()
182 struct rpc_xprt_switch *xprt_switch_get(struct rpc_xprt_switch *xps) in xprt_switch_get() argument
184 if (xps != NULL && kref_get_unless_zero(&xps->xps_kref)) in xprt_switch_get()
185 return xps; in xprt_switch_get()
195 void xprt_switch_put(struct rpc_xprt_switch *xps) in xprt_switch_put() argument
197 if (xps != NULL) in xprt_switch_put()
198 kref_put(&xps->xps_kref, xprt_switch_free); in xprt_switch_put()
207 void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps) in rpc_xprt_switch_set_roundrobin() argument
209 if (READ_ONCE(xps->xps_iter_ops) != &rpc_xprt_iter_roundrobin) in rpc_xprt_switch_set_roundrobin()
210 WRITE_ONCE(xps->xps_iter_ops, &rpc_xprt_iter_roundrobin); in rpc_xprt_switch_set_roundrobin()
254 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in xprt_iter_first_entry() local
256 if (xps == NULL) in xprt_iter_first_entry()
258 return xprt_switch_find_first_entry(&xps->xps_xprt_list); in xprt_iter_first_entry()
280 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in xprt_iter_current_entry() local
283 if (xps == NULL) in xprt_iter_current_entry()
285 head = &xps->xps_xprt_list; in xprt_iter_current_entry()
286 if (xpi->xpi_cursor == NULL || xps->xps_nxprts < 2) in xprt_iter_current_entry()
291 bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps, in rpc_xprt_switch_has_addr() argument
297 if (xps == NULL || sap == NULL) in rpc_xprt_switch_has_addr()
300 head = &xps->xps_xprt_list; in rpc_xprt_switch_has_addr()
329 struct rpc_xprt *xprt_switch_set_next_cursor(struct rpc_xprt_switch *xps, in xprt_switch_set_next_cursor() argument
336 pos = find_next(xps, old); in xprt_switch_set_next_cursor()
345 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in xprt_iter_next_entry_multiple() local
347 if (xps == NULL) in xprt_iter_next_entry_multiple()
349 return xprt_switch_set_next_cursor(xps, &xpi->xpi_cursor, find_next); in xprt_iter_next_entry_multiple()
365 struct rpc_xprt *xprt_switch_find_next_entry_roundrobin(struct rpc_xprt_switch *xps, in xprt_switch_find_next_entry_roundrobin() argument
368 struct list_head *head = &xps->xps_xprt_list; in xprt_switch_find_next_entry_roundrobin()
379 xps_queuelen = atomic_long_read(&xps->xps_queuelen); in xprt_switch_find_next_entry_roundrobin()
380 nactive = READ_ONCE(xps->xps_nactive); in xprt_switch_find_next_entry_roundrobin()
397 struct rpc_xprt *xprt_switch_find_next_entry_all(struct rpc_xprt_switch *xps, in xprt_switch_find_next_entry_all() argument
400 return xprt_switch_find_next_entry(&xps->xps_xprt_list, cur); in xprt_switch_find_next_entry_all()
426 struct rpc_xprt_switch *xps, in __xprt_iter_init() argument
429 rcu_assign_pointer(xpi->xpi_xpswitch, xprt_switch_get(xps)); in __xprt_iter_init()
444 struct rpc_xprt_switch *xps) in xprt_iter_init() argument
446 __xprt_iter_init(xpi, xps, NULL); in xprt_iter_init()
458 struct rpc_xprt_switch *xps) in xprt_iter_init_listall() argument
460 __xprt_iter_init(xpi, xps, &rpc_xprt_iter_listall); in xprt_iter_init_listall()