Lines Matching refs:bundle

37 	struct rxrpc_conn_bundle *bundle;  in rxrpc_alloc_bundle()  local
41 bundle = kzalloc(sizeof(struct rxrpc_conn_bundle), gfp); in rxrpc_alloc_bundle()
42 if (bundle) { in rxrpc_alloc_bundle()
43 INIT_LIST_HEAD(&bundle->unused_conns); in rxrpc_alloc_bundle()
44 INIT_LIST_HEAD(&bundle->avail_conns); in rxrpc_alloc_bundle()
45 INIT_LIST_HEAD(&bundle->busy_conns); in rxrpc_alloc_bundle()
46 init_waitqueue_head(&bundle->chanwait); in rxrpc_alloc_bundle()
47 atomic_set(&bundle->usage, 1); in rxrpc_alloc_bundle()
50 _leave(" = %p", bundle); in rxrpc_alloc_bundle()
51 return bundle; in rxrpc_alloc_bundle()
59 int rxrpc_cmp_bundle(const struct rxrpc_conn_bundle *bundle, in rxrpc_cmp_bundle() argument
62 return (bundle->service_id - service_id) ?: in rxrpc_cmp_bundle()
63 ((unsigned long) bundle->key - (unsigned long) key); in rxrpc_cmp_bundle()
75 struct rxrpc_conn_bundle *bundle, *candidate; in rxrpc_get_bundle() local
81 if (rx->trans == trans && rx->bundle) { in rxrpc_get_bundle()
82 atomic_inc(&rx->bundle->usage); in rxrpc_get_bundle()
83 return rx->bundle; in rxrpc_get_bundle()
92 bundle = rb_entry(p, struct rxrpc_conn_bundle, node); in rxrpc_get_bundle()
94 if (rxrpc_cmp_bundle(bundle, key, service_id) < 0) in rxrpc_get_bundle()
96 else if (rxrpc_cmp_bundle(bundle, key, service_id) > 0) in rxrpc_get_bundle()
121 bundle = rb_entry(parent, struct rxrpc_conn_bundle, node); in rxrpc_get_bundle()
123 if (rxrpc_cmp_bundle(bundle, key, service_id) < 0) in rxrpc_get_bundle()
125 else if (rxrpc_cmp_bundle(bundle, key, service_id) > 0) in rxrpc_get_bundle()
132 bundle = candidate; in rxrpc_get_bundle()
135 rb_link_node(&bundle->node, parent, pp); in rxrpc_get_bundle()
136 rb_insert_color(&bundle->node, &trans->bundles); in rxrpc_get_bundle()
139 if (!rx->bundle && rx->sk.sk_state == RXRPC_CLIENT_CONNECTED) { in rxrpc_get_bundle()
140 atomic_inc(&bundle->usage); in rxrpc_get_bundle()
141 rx->bundle = bundle; in rxrpc_get_bundle()
143 _leave(" = %p [new]", bundle); in rxrpc_get_bundle()
144 return bundle; in rxrpc_get_bundle()
148 atomic_inc(&bundle->usage); in rxrpc_get_bundle()
151 if (!rx->bundle && rx->sk.sk_state == RXRPC_CLIENT_CONNECTED) { in rxrpc_get_bundle()
152 atomic_inc(&bundle->usage); in rxrpc_get_bundle()
153 rx->bundle = bundle; in rxrpc_get_bundle()
155 _leave(" = %p [extant %d]", bundle, atomic_read(&bundle->usage)); in rxrpc_get_bundle()
156 return bundle; in rxrpc_get_bundle()
160 atomic_inc(&bundle->usage); in rxrpc_get_bundle()
164 if (!rx->bundle && rx->sk.sk_state == RXRPC_CLIENT_CONNECTED) { in rxrpc_get_bundle()
165 atomic_inc(&bundle->usage); in rxrpc_get_bundle()
166 rx->bundle = bundle; in rxrpc_get_bundle()
168 _leave(" = %p [second %d]", bundle, atomic_read(&bundle->usage)); in rxrpc_get_bundle()
169 return bundle; in rxrpc_get_bundle()
176 struct rxrpc_conn_bundle *bundle) in rxrpc_put_bundle() argument
178 _enter("%p,%p{%d}",trans, bundle, atomic_read(&bundle->usage)); in rxrpc_put_bundle()
180 if (atomic_dec_and_lock(&bundle->usage, &trans->client_lock)) { in rxrpc_put_bundle()
182 rb_erase(&bundle->node, &trans->bundles); in rxrpc_put_bundle()
184 ASSERT(list_empty(&bundle->unused_conns)); in rxrpc_put_bundle()
185 ASSERT(list_empty(&bundle->avail_conns)); in rxrpc_put_bundle()
186 ASSERT(list_empty(&bundle->busy_conns)); in rxrpc_put_bundle()
187 ASSERTCMP(bundle->num_conns, ==, 0); in rxrpc_put_bundle()
188 key_put(bundle->key); in rxrpc_put_bundle()
189 kfree(bundle); in rxrpc_put_bundle()
357 conn->bundle = NULL; in rxrpc_connect_exclusive()
431 struct rxrpc_conn_bundle *bundle, in rxrpc_connect_call() argument
443 return rxrpc_connect_exclusive(rx, trans, bundle->service_id, in rxrpc_connect_call()
449 if (!list_empty(&bundle->avail_conns)) { in rxrpc_connect_call()
451 conn = list_entry(bundle->avail_conns.next, in rxrpc_connect_call()
456 bundle->num_conns--; in rxrpc_connect_call()
461 &bundle->busy_conns); in rxrpc_connect_call()
471 if (!list_empty(&bundle->unused_conns)) { in rxrpc_connect_call()
473 conn = list_entry(bundle->unused_conns.next, in rxrpc_connect_call()
478 bundle->num_conns--; in rxrpc_connect_call()
488 list_move(&conn->bundle_link, &bundle->avail_conns); in rxrpc_connect_call()
493 _debug("get new conn [%d]", bundle->num_conns); in rxrpc_connect_call()
500 if (bundle->num_conns >= 20) { in rxrpc_connect_call()
508 add_wait_queue(&bundle->chanwait, &myself); in rxrpc_connect_call()
511 if (bundle->num_conns < 20 || in rxrpc_connect_call()
512 !list_empty(&bundle->unused_conns) || in rxrpc_connect_call()
513 !list_empty(&bundle->avail_conns)) in rxrpc_connect_call()
519 remove_wait_queue(&bundle->chanwait, &myself); in rxrpc_connect_call()
534 candidate->bundle = bundle; in rxrpc_connect_call()
535 candidate->service_id = bundle->service_id; in rxrpc_connect_call()
543 candidate->key = key_get(bundle->key); in rxrpc_connect_call()
559 list_add(&candidate->bundle_link, &bundle->unused_conns); in rxrpc_connect_call()
560 bundle->num_conns++; in rxrpc_connect_call()
561 atomic_inc(&bundle->usage); in rxrpc_connect_call()
611 remove_wait_queue(&bundle->chanwait, &myself); in rxrpc_connect_call()
831 if (conn->bundle) in rxrpc_destroy_connection()
832 rxrpc_put_bundle(conn->trans, conn->bundle); in rxrpc_destroy_connection()
881 if (conn->bundle) { in rxrpc_connection_reaper()
883 conn->bundle->num_conns--; in rxrpc_connection_reaper()