Lines Matching defs: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,
37 list_add_tail_rcu(&xprt->xprt_switch, &xps->xps_xprt_list);
39 if (xps->xps_nxprts == 0)
40 xps->xps_net = xprt->xprt_net;
41 xps->xps_nxprts++;
42 xps->xps_nactive++;
47 * @xps: pointer to struct rpc_xprt_switch
50 * Adds xprt to the end of the list of struct rpc_xprt in xps.
52 void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps,
57 spin_lock(&xps->xps_lock);
58 if (xps->xps_net == xprt->xprt_net || xps->xps_net == NULL)
59 xprt_switch_add_xprt_locked(xps, xprt);
60 spin_unlock(&xps->xps_lock);
61 rpc_sysfs_xprt_setup(xps, xprt, GFP_KERNEL);
64 static void xprt_switch_remove_xprt_locked(struct rpc_xprt_switch *xps,
70 xps->xps_nactive--;
71 xps->xps_nxprts--;
72 if (xps->xps_nxprts == 0)
73 xps->xps_net = NULL;
80 * @xps: pointer to struct rpc_xprt_switch
84 * Removes xprt from the list of struct rpc_xprt in xps.
86 void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps,
89 spin_lock(&xps->xps_lock);
90 xprt_switch_remove_xprt_locked(xps, xprt, offline);
91 spin_unlock(&xps->xps_lock);
102 static int xprt_switch_alloc_id(struct rpc_xprt_switch *xps, gfp_t gfp_flags)
110 xps->xps_id = id;
114 static void xprt_switch_free_id(struct rpc_xprt_switch *xps)
116 ida_free(&rpc_xprtswitch_ids, xps->xps_id);
130 struct rpc_xprt_switch *xps;
132 xps = kmalloc(sizeof(*xps), gfp_flags);
133 if (xps != NULL) {
134 spin_lock_init(&xps->xps_lock);
135 kref_init(&xps->xps_kref);
136 xprt_switch_alloc_id(xps, gfp_flags);
137 xps->xps_nxprts = xps->xps_nactive = 0;
138 atomic_long_set(&xps->xps_queuelen, 0);
139 xps->xps_net = NULL;
140 INIT_LIST_HEAD(&xps->xps_xprt_list);
141 xps->xps_iter_ops = &rpc_xprt_iter_singular;
142 rpc_sysfs_xprt_switch_setup(xps, xprt, gfp_flags);
143 xprt_switch_add_xprt_locked(xps, xprt);
144 xps->xps_nunique_destaddr_xprts = 1;
145 rpc_sysfs_xprt_setup(xps, xprt, gfp_flags);
148 return xps;
151 static void xprt_switch_free_entries(struct rpc_xprt_switch *xps)
153 spin_lock(&xps->xps_lock);
154 while (!list_empty(&xps->xps_xprt_list)) {
157 xprt = list_first_entry(&xps->xps_xprt_list,
159 xprt_switch_remove_xprt_locked(xps, xprt, true);
160 spin_unlock(&xps->xps_lock);
162 spin_lock(&xps->xps_lock);
164 spin_unlock(&xps->xps_lock);
169 struct rpc_xprt_switch *xps = container_of(kref,
172 xprt_switch_free_entries(xps);
173 rpc_sysfs_xprt_switch_destroy(xps);
174 xprt_switch_free_id(xps);
175 kfree_rcu(xps, xps_rcu);
180 * @xps: pointer to struct rpc_xprt_switch
182 * Returns a reference to xps unless the refcount is already zero.
184 struct rpc_xprt_switch *xprt_switch_get(struct rpc_xprt_switch *xps)
186 if (xps != NULL && kref_get_unless_zero(&xps->xps_kref))
187 return xps;
193 * @xps: pointer to struct rpc_xprt_switch
195 * Release the reference to xps, and free it once the refcount is zero.
197 void xprt_switch_put(struct rpc_xprt_switch *xps)
199 if (xps != NULL)
200 kref_put(&xps->xps_kref, xprt_switch_free);
205 * @xps: pointer to struct rpc_xprt_switch
207 * Sets a round-robin default policy for iterators acting on xps.
209 void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps)
211 if (READ_ONCE(xps->xps_iter_ops) != &rpc_xprt_iter_roundrobin)
212 WRITE_ONCE(xps->xps_iter_ops, &rpc_xprt_iter_roundrobin);
268 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch);
270 if (xps == NULL)
272 return xprt_switch_find_first_entry(&xps->xps_xprt_list);
306 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch);
309 if (xps == NULL)
311 head = &xps->xps_xprt_list;
312 if (xpi->xpi_cursor == NULL || xps->xps_nxprts < 2)
340 bool __rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
346 if (xps == NULL || sap == NULL)
349 head = &xps->xps_xprt_list;
360 bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
366 res = __rpc_xprt_switch_has_addr(xps, sap);
395 struct rpc_xprt *xprt_switch_set_next_cursor(struct rpc_xprt_switch *xps,
402 pos = find_next(xps, old);
411 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch);
413 if (xps == NULL)
415 return xprt_switch_set_next_cursor(xps, &xpi->xpi_cursor, find_next);
431 struct rpc_xprt *xprt_switch_find_next_entry_roundrobin(struct rpc_xprt_switch *xps,
434 struct list_head *head = &xps->xps_xprt_list;
445 xps_queuelen = atomic_long_read(&xps->xps_queuelen);
446 nactive = READ_ONCE(xps->xps_nactive);
463 struct rpc_xprt *xprt_switch_find_next_entry_all(struct rpc_xprt_switch *xps,
466 return xprt_switch_find_next_entry(&xps->xps_xprt_list, cur, true);
470 struct rpc_xprt *xprt_switch_find_next_entry_offline(struct rpc_xprt_switch *xps,
473 return xprt_switch_find_next_entry(&xps->xps_xprt_list, cur, false);
505 struct rpc_xprt_switch *xps,
508 rcu_assign_pointer(xpi->xpi_xpswitch, xprt_switch_get(xps));
516 * @xps: pointer to rpc_xprt_switch
519 * as set in xps. This function is mainly intended for internal
523 struct rpc_xprt_switch *xps)
525 __xprt_iter_init(xpi, xps, NULL);
531 * @xps: pointer to rpc_xprt_switch
534 * of entries in xps.
537 struct rpc_xprt_switch *xps)
539 __xprt_iter_init(xpi, xps, &rpc_xprt_iter_listall);
543 struct rpc_xprt_switch *xps)
545 __xprt_iter_init(xpi, xps, &rpc_xprt_iter_listoffline);