Lines Matching refs:xps

24 typedef struct rpc_xprt *(*xprt_switch_find_xprt_t)(struct rpc_xprt_switch *xps,
32 static void xprt_switch_add_xprt_locked(struct rpc_xprt_switch *xps, in xprt_switch_add_xprt_locked() argument
37 list_add_tail_rcu(&xprt->xprt_switch, &xps->xps_xprt_list); in xprt_switch_add_xprt_locked()
39 if (xps->xps_nxprts == 0) in xprt_switch_add_xprt_locked()
40 xps->xps_net = xprt->xprt_net; in xprt_switch_add_xprt_locked()
41 xps->xps_nxprts++; in xprt_switch_add_xprt_locked()
42 xps->xps_nactive++; in xprt_switch_add_xprt_locked()
52 void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps, in rpc_xprt_switch_add_xprt() argument
57 spin_lock(&xps->xps_lock); in rpc_xprt_switch_add_xprt()
58 if (xps->xps_net == xprt->xprt_net || xps->xps_net == NULL) in rpc_xprt_switch_add_xprt()
59 xprt_switch_add_xprt_locked(xps, xprt); in rpc_xprt_switch_add_xprt()
60 spin_unlock(&xps->xps_lock); in rpc_xprt_switch_add_xprt()
61 rpc_sysfs_xprt_setup(xps, xprt, GFP_KERNEL); in rpc_xprt_switch_add_xprt()
64 static void xprt_switch_remove_xprt_locked(struct rpc_xprt_switch *xps, in xprt_switch_remove_xprt_locked() argument
70 xps->xps_nactive--; in xprt_switch_remove_xprt_locked()
71 xps->xps_nxprts--; in xprt_switch_remove_xprt_locked()
72 if (xps->xps_nxprts == 0) in xprt_switch_remove_xprt_locked()
73 xps->xps_net = NULL; in xprt_switch_remove_xprt_locked()
86 void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps, in rpc_xprt_switch_remove_xprt() argument
89 spin_lock(&xps->xps_lock); in rpc_xprt_switch_remove_xprt()
90 xprt_switch_remove_xprt_locked(xps, xprt, offline); in rpc_xprt_switch_remove_xprt()
91 spin_unlock(&xps->xps_lock); in rpc_xprt_switch_remove_xprt()
102 static int xprt_switch_alloc_id(struct rpc_xprt_switch *xps, gfp_t gfp_flags) in xprt_switch_alloc_id() argument
110 xps->xps_id = id; in xprt_switch_alloc_id()
114 static void xprt_switch_free_id(struct rpc_xprt_switch *xps) in xprt_switch_free_id() argument
116 ida_free(&rpc_xprtswitch_ids, xps->xps_id); in xprt_switch_free_id()
130 struct rpc_xprt_switch *xps; in xprt_switch_alloc() local
132 xps = kmalloc(sizeof(*xps), gfp_flags); in xprt_switch_alloc()
133 if (xps != NULL) { in xprt_switch_alloc()
134 spin_lock_init(&xps->xps_lock); in xprt_switch_alloc()
135 kref_init(&xps->xps_kref); in xprt_switch_alloc()
136 xprt_switch_alloc_id(xps, gfp_flags); in xprt_switch_alloc()
137 xps->xps_nxprts = xps->xps_nactive = 0; in xprt_switch_alloc()
138 atomic_long_set(&xps->xps_queuelen, 0); in xprt_switch_alloc()
139 xps->xps_net = NULL; in xprt_switch_alloc()
140 INIT_LIST_HEAD(&xps->xps_xprt_list); in xprt_switch_alloc()
141 xps->xps_iter_ops = &rpc_xprt_iter_singular; in xprt_switch_alloc()
142 rpc_sysfs_xprt_switch_setup(xps, xprt, gfp_flags); in xprt_switch_alloc()
143 xprt_switch_add_xprt_locked(xps, xprt); in xprt_switch_alloc()
144 xps->xps_nunique_destaddr_xprts = 1; in xprt_switch_alloc()
145 rpc_sysfs_xprt_setup(xps, xprt, gfp_flags); in xprt_switch_alloc()
148 return xps; in xprt_switch_alloc()
151 static void xprt_switch_free_entries(struct rpc_xprt_switch *xps) in xprt_switch_free_entries() argument
153 spin_lock(&xps->xps_lock); in xprt_switch_free_entries()
154 while (!list_empty(&xps->xps_xprt_list)) { in xprt_switch_free_entries()
157 xprt = list_first_entry(&xps->xps_xprt_list, in xprt_switch_free_entries()
159 xprt_switch_remove_xprt_locked(xps, xprt, true); in xprt_switch_free_entries()
160 spin_unlock(&xps->xps_lock); in xprt_switch_free_entries()
162 spin_lock(&xps->xps_lock); in xprt_switch_free_entries()
164 spin_unlock(&xps->xps_lock); in xprt_switch_free_entries()
169 struct rpc_xprt_switch *xps = container_of(kref, in xprt_switch_free() local
172 xprt_switch_free_entries(xps); in xprt_switch_free()
173 rpc_sysfs_xprt_switch_destroy(xps); in xprt_switch_free()
174 xprt_switch_free_id(xps); in xprt_switch_free()
175 kfree_rcu(xps, xps_rcu); in xprt_switch_free()
184 struct rpc_xprt_switch *xprt_switch_get(struct rpc_xprt_switch *xps) in xprt_switch_get() argument
186 if (xps != NULL && kref_get_unless_zero(&xps->xps_kref)) in xprt_switch_get()
187 return xps; in xprt_switch_get()
197 void xprt_switch_put(struct rpc_xprt_switch *xps) in xprt_switch_put() argument
199 if (xps != NULL) in xprt_switch_put()
200 kref_put(&xps->xps_kref, xprt_switch_free); in xprt_switch_put()
209 void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps) in rpc_xprt_switch_set_roundrobin() argument
211 if (READ_ONCE(xps->xps_iter_ops) != &rpc_xprt_iter_roundrobin) in rpc_xprt_switch_set_roundrobin()
212 WRITE_ONCE(xps->xps_iter_ops, &rpc_xprt_iter_roundrobin); in rpc_xprt_switch_set_roundrobin()
268 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in xprt_iter_first_entry() local
270 if (xps == NULL) in xprt_iter_first_entry()
272 return xprt_switch_find_first_entry(&xps->xps_xprt_list); in xprt_iter_first_entry()
306 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in _xprt_iter_current_entry() local
309 if (xps == NULL) in _xprt_iter_current_entry()
311 head = &xps->xps_xprt_list; in _xprt_iter_current_entry()
312 if (xpi->xpi_cursor == NULL || xps->xps_nxprts < 2) in _xprt_iter_current_entry()
339 bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps, in rpc_xprt_switch_has_addr() argument
345 if (xps == NULL || sap == NULL) in rpc_xprt_switch_has_addr()
348 head = &xps->xps_xprt_list; in rpc_xprt_switch_has_addr()
382 struct rpc_xprt *xprt_switch_set_next_cursor(struct rpc_xprt_switch *xps, in xprt_switch_set_next_cursor() argument
389 pos = find_next(xps, old); in xprt_switch_set_next_cursor()
398 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in xprt_iter_next_entry_multiple() local
400 if (xps == NULL) in xprt_iter_next_entry_multiple()
402 return xprt_switch_set_next_cursor(xps, &xpi->xpi_cursor, find_next); in xprt_iter_next_entry_multiple()
418 struct rpc_xprt *xprt_switch_find_next_entry_roundrobin(struct rpc_xprt_switch *xps, in xprt_switch_find_next_entry_roundrobin() argument
421 struct list_head *head = &xps->xps_xprt_list; in xprt_switch_find_next_entry_roundrobin()
432 xps_queuelen = atomic_long_read(&xps->xps_queuelen); in xprt_switch_find_next_entry_roundrobin()
433 nactive = READ_ONCE(xps->xps_nactive); in xprt_switch_find_next_entry_roundrobin()
450 struct rpc_xprt *xprt_switch_find_next_entry_all(struct rpc_xprt_switch *xps, in xprt_switch_find_next_entry_all() argument
453 return xprt_switch_find_next_entry(&xps->xps_xprt_list, cur, true); in xprt_switch_find_next_entry_all()
457 struct rpc_xprt *xprt_switch_find_next_entry_offline(struct rpc_xprt_switch *xps, in xprt_switch_find_next_entry_offline() argument
460 return xprt_switch_find_next_entry(&xps->xps_xprt_list, cur, false); in xprt_switch_find_next_entry_offline()
492 struct rpc_xprt_switch *xps, in __xprt_iter_init() argument
495 rcu_assign_pointer(xpi->xpi_xpswitch, xprt_switch_get(xps)); in __xprt_iter_init()
510 struct rpc_xprt_switch *xps) in xprt_iter_init() argument
512 __xprt_iter_init(xpi, xps, NULL); in xprt_iter_init()
524 struct rpc_xprt_switch *xps) in xprt_iter_init_listall() argument
526 __xprt_iter_init(xpi, xps, &rpc_xprt_iter_listall); in xprt_iter_init_listall()
530 struct rpc_xprt_switch *xps) in xprt_iter_init_listoffline() argument
532 __xprt_iter_init(xpi, xps, &rpc_xprt_iter_listoffline); in xprt_iter_init_listoffline()