Lines Matching defs:xps

22 typedef struct rpc_xprt *(*xprt_switch_find_xprt_t)(struct rpc_xprt_switch *xps,
29 static void xprt_switch_add_xprt_locked(struct rpc_xprt_switch *xps,
34 list_add_tail_rcu(&xprt->xprt_switch, &xps->xps_xprt_list);
36 if (xps->xps_nxprts == 0)
37 xps->xps_net = xprt->xprt_net;
38 xps->xps_nxprts++;
39 xps->xps_nactive++;
44 * @xps: pointer to struct rpc_xprt_switch
47 * Adds xprt to the end of the list of struct rpc_xprt in xps.
49 void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps,
54 spin_lock(&xps->xps_lock);
55 if (xps->xps_net == xprt->xprt_net || xps->xps_net == NULL)
56 xprt_switch_add_xprt_locked(xps, xprt);
57 spin_unlock(&xps->xps_lock);
60 static void xprt_switch_remove_xprt_locked(struct rpc_xprt_switch *xps,
65 xps->xps_nactive--;
66 xps->xps_nxprts--;
67 if (xps->xps_nxprts == 0)
68 xps->xps_net = NULL;
75 * @xps: pointer to struct rpc_xprt_switch
78 * Removes xprt from the list of struct rpc_xprt in xps.
80 void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps,
83 spin_lock(&xps->xps_lock);
84 xprt_switch_remove_xprt_locked(xps, xprt);
85 spin_unlock(&xps->xps_lock);
100 struct rpc_xprt_switch *xps;
102 xps = kmalloc(sizeof(*xps), gfp_flags);
103 if (xps != NULL) {
104 spin_lock_init(&xps->xps_lock);
105 kref_init(&xps->xps_kref);
106 xps->xps_nxprts = xps->xps_nactive = 0;
107 atomic_long_set(&xps->xps_queuelen, 0);
108 xps->xps_net = NULL;
109 INIT_LIST_HEAD(&xps->xps_xprt_list);
110 xps->xps_iter_ops = &rpc_xprt_iter_singular;
111 xprt_switch_add_xprt_locked(xps, xprt);
114 return xps;
117 static void xprt_switch_free_entries(struct rpc_xprt_switch *xps)
119 spin_lock(&xps->xps_lock);
120 while (!list_empty(&xps->xps_xprt_list)) {
123 xprt = list_first_entry(&xps->xps_xprt_list,
125 xprt_switch_remove_xprt_locked(xps, xprt);
126 spin_unlock(&xps->xps_lock);
128 spin_lock(&xps->xps_lock);
130 spin_unlock(&xps->xps_lock);
135 struct rpc_xprt_switch *xps = container_of(kref,
138 xprt_switch_free_entries(xps);
139 kfree_rcu(xps, xps_rcu);
144 * @xps: pointer to struct rpc_xprt_switch
146 * Returns a reference to xps unless the refcount is already zero.
148 struct rpc_xprt_switch *xprt_switch_get(struct rpc_xprt_switch *xps)
150 if (xps != NULL && kref_get_unless_zero(&xps->xps_kref))
151 return xps;
157 * @xps: pointer to struct rpc_xprt_switch
159 * Release the reference to xps, and free it once the refcount is zero.
161 void xprt_switch_put(struct rpc_xprt_switch *xps)
163 if (xps != NULL)
164 kref_put(&xps->xps_kref, xprt_switch_free);
169 * @xps: pointer to struct rpc_xprt_switch
171 * Sets a round-robin default policy for iterators acting on xps.
173 void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps)
175 if (READ_ONCE(xps->xps_iter_ops) != &rpc_xprt_iter_roundrobin)
176 WRITE_ONCE(xps->xps_iter_ops, &rpc_xprt_iter_roundrobin);
219 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch);
221 if (xps == NULL)
223 return xprt_switch_find_first_entry(&xps->xps_xprt_list);
245 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch);
248 if (xps == NULL)
250 head = &xps->xps_xprt_list;
251 if (xpi->xpi_cursor == NULL || xps->xps_nxprts < 2)
257 bool __rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
263 if (xps == NULL || sap == NULL)
266 head = &xps->xps_xprt_list;
277 bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
283 res = __rpc_xprt_switch_has_addr(xps, sap);
307 struct rpc_xprt *xprt_switch_set_next_cursor(struct rpc_xprt_switch *xps,
314 pos = find_next(xps, old);
323 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch);
325 if (xps == NULL)
327 return xprt_switch_set_next_cursor(xps, &xpi->xpi_cursor, find_next);
343 struct rpc_xprt *xprt_switch_find_next_entry_roundrobin(struct rpc_xprt_switch *xps,
346 struct list_head *head = &xps->xps_xprt_list;
357 xps_queuelen = atomic_long_read(&xps->xps_queuelen);
358 nactive = READ_ONCE(xps->xps_nactive);
375 struct rpc_xprt *xprt_switch_find_next_entry_all(struct rpc_xprt_switch *xps,
378 return xprt_switch_find_next_entry(&xps->xps_xprt_list, cur);
404 struct rpc_xprt_switch *xps,
407 rcu_assign_pointer(xpi->xpi_xpswitch, xprt_switch_get(xps));
415 * @xps: pointer to rpc_xprt_switch
418 * as set in xps. This function is mainly intended for internal
422 struct rpc_xprt_switch *xps)
424 __xprt_iter_init(xpi, xps, NULL);
430 * @xps: pointer to rpc_xprt_switch
433 * of entries in xps.
436 struct rpc_xprt_switch *xps)
438 __xprt_iter_init(xpi, xps, &rpc_xprt_iter_listall);