Lines Matching refs:xps

29 static void xprt_switch_add_xprt_locked(struct rpc_xprt_switch *xps,  in xprt_switch_add_xprt_locked()  argument
34 list_add_tail_rcu(&xprt->xprt_switch, &xps->xps_xprt_list); in xprt_switch_add_xprt_locked()
36 if (xps->xps_nxprts == 0) in xprt_switch_add_xprt_locked()
37 xps->xps_net = xprt->xprt_net; in xprt_switch_add_xprt_locked()
38 xps->xps_nxprts++; in xprt_switch_add_xprt_locked()
48 void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps, in rpc_xprt_switch_add_xprt() argument
53 spin_lock(&xps->xps_lock); in rpc_xprt_switch_add_xprt()
54 if ((xps->xps_net == xprt->xprt_net || xps->xps_net == NULL) && in rpc_xprt_switch_add_xprt()
55 !rpc_xprt_switch_has_addr(xps, (struct sockaddr *)&xprt->addr)) in rpc_xprt_switch_add_xprt()
56 xprt_switch_add_xprt_locked(xps, xprt); in rpc_xprt_switch_add_xprt()
57 spin_unlock(&xps->xps_lock); in rpc_xprt_switch_add_xprt()
60 static void xprt_switch_remove_xprt_locked(struct rpc_xprt_switch *xps, in xprt_switch_remove_xprt_locked() argument
65 xps->xps_nxprts--; in xprt_switch_remove_xprt_locked()
66 if (xps->xps_nxprts == 0) in xprt_switch_remove_xprt_locked()
67 xps->xps_net = NULL; in xprt_switch_remove_xprt_locked()
79 void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps, in rpc_xprt_switch_remove_xprt() argument
82 spin_lock(&xps->xps_lock); in rpc_xprt_switch_remove_xprt()
83 xprt_switch_remove_xprt_locked(xps, xprt); in rpc_xprt_switch_remove_xprt()
84 spin_unlock(&xps->xps_lock); in rpc_xprt_switch_remove_xprt()
99 struct rpc_xprt_switch *xps; in xprt_switch_alloc() local
101 xps = kmalloc(sizeof(*xps), gfp_flags); in xprt_switch_alloc()
102 if (xps != NULL) { in xprt_switch_alloc()
103 spin_lock_init(&xps->xps_lock); in xprt_switch_alloc()
104 kref_init(&xps->xps_kref); in xprt_switch_alloc()
105 xps->xps_nxprts = 0; in xprt_switch_alloc()
106 INIT_LIST_HEAD(&xps->xps_xprt_list); in xprt_switch_alloc()
107 xps->xps_iter_ops = &rpc_xprt_iter_singular; in xprt_switch_alloc()
108 xprt_switch_add_xprt_locked(xps, xprt); in xprt_switch_alloc()
111 return xps; in xprt_switch_alloc()
114 static void xprt_switch_free_entries(struct rpc_xprt_switch *xps) in xprt_switch_free_entries() argument
116 spin_lock(&xps->xps_lock); in xprt_switch_free_entries()
117 while (!list_empty(&xps->xps_xprt_list)) { in xprt_switch_free_entries()
120 xprt = list_first_entry(&xps->xps_xprt_list, in xprt_switch_free_entries()
122 xprt_switch_remove_xprt_locked(xps, xprt); in xprt_switch_free_entries()
123 spin_unlock(&xps->xps_lock); in xprt_switch_free_entries()
125 spin_lock(&xps->xps_lock); in xprt_switch_free_entries()
127 spin_unlock(&xps->xps_lock); in xprt_switch_free_entries()
132 struct rpc_xprt_switch *xps = container_of(kref, in xprt_switch_free() local
135 xprt_switch_free_entries(xps); in xprt_switch_free()
136 kfree_rcu(xps, xps_rcu); in xprt_switch_free()
145 struct rpc_xprt_switch *xprt_switch_get(struct rpc_xprt_switch *xps) in xprt_switch_get() argument
147 if (xps != NULL && kref_get_unless_zero(&xps->xps_kref)) in xprt_switch_get()
148 return xps; in xprt_switch_get()
158 void xprt_switch_put(struct rpc_xprt_switch *xps) in xprt_switch_put() argument
160 if (xps != NULL) in xprt_switch_put()
161 kref_put(&xps->xps_kref, xprt_switch_free); in xprt_switch_put()
170 void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps) in rpc_xprt_switch_set_roundrobin() argument
172 if (READ_ONCE(xps->xps_iter_ops) != &rpc_xprt_iter_roundrobin) in rpc_xprt_switch_set_roundrobin()
173 WRITE_ONCE(xps->xps_iter_ops, &rpc_xprt_iter_roundrobin); in rpc_xprt_switch_set_roundrobin()
204 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in xprt_iter_first_entry() local
206 if (xps == NULL) in xprt_iter_first_entry()
208 return xprt_switch_find_first_entry(&xps->xps_xprt_list); in xprt_iter_first_entry()
227 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in xprt_iter_current_entry() local
230 if (xps == NULL) in xprt_iter_current_entry()
232 head = &xps->xps_xprt_list; in xprt_iter_current_entry()
233 if (xpi->xpi_cursor == NULL || xps->xps_nxprts < 2) in xprt_iter_current_entry()
238 bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps, in rpc_xprt_switch_has_addr() argument
244 if (xps == NULL || sap == NULL) in rpc_xprt_switch_has_addr()
247 head = &xps->xps_xprt_list; in rpc_xprt_switch_has_addr()
296 struct rpc_xprt_switch *xps = rcu_dereference(xpi->xpi_xpswitch); in xprt_iter_next_entry_multiple() local
298 if (xps == NULL) in xprt_iter_next_entry_multiple()
300 return xprt_switch_set_next_cursor(&xps->xps_xprt_list, in xprt_iter_next_entry_multiple()
346 struct rpc_xprt_switch *xps, in __xprt_iter_init() argument
349 rcu_assign_pointer(xpi->xpi_xpswitch, xprt_switch_get(xps)); in __xprt_iter_init()
364 struct rpc_xprt_switch *xps) in xprt_iter_init() argument
366 __xprt_iter_init(xpi, xps, NULL); in xprt_iter_init()
378 struct rpc_xprt_switch *xps) in xprt_iter_init_listall() argument
380 __xprt_iter_init(xpi, xps, &rpc_xprt_iter_listall); in xprt_iter_init_listall()