Lines Matching defs:bundle

37 static void rxrpc_activate_bundle(struct rxrpc_bundle *bundle)
39 atomic_inc(&bundle->active);
71 * Allocate a connection bundle.
77 struct rxrpc_bundle *bundle;
79 bundle = kzalloc(sizeof(*bundle), gfp);
80 if (bundle) {
81 bundle->local = call->local;
82 bundle->peer = rxrpc_get_peer(call->peer, rxrpc_peer_get_bundle);
83 bundle->key = key_get(call->key);
84 bundle->security = call->security;
85 bundle->exclusive = test_bit(RXRPC_CALL_EXCLUSIVE, &call->flags);
86 bundle->upgrade = test_bit(RXRPC_CALL_UPGRADE, &call->flags);
87 bundle->service_id = call->dest_srx.srx_service;
88 bundle->security_level = call->security_level;
89 bundle->debug_id = atomic_inc_return(&rxrpc_bundle_id);
90 refcount_set(&bundle->ref, 1);
91 atomic_set(&bundle->active, 1);
92 INIT_LIST_HEAD(&bundle->waiting_calls);
93 trace_rxrpc_bundle(bundle->debug_id, 1, rxrpc_bundle_new);
95 write_lock(&bundle->local->rxnet->conn_lock);
96 list_add_tail(&bundle->proc_link, &bundle->local->rxnet->bundle_proc_list);
97 write_unlock(&bundle->local->rxnet->conn_lock);
99 return bundle;
102 struct rxrpc_bundle *rxrpc_get_bundle(struct rxrpc_bundle *bundle,
107 __refcount_inc(&bundle->ref, &r);
108 trace_rxrpc_bundle(bundle->debug_id, r + 1, why);
109 return bundle;
112 static void rxrpc_free_bundle(struct rxrpc_bundle *bundle)
114 trace_rxrpc_bundle(bundle->debug_id, refcount_read(&bundle->ref),
116 write_lock(&bundle->local->rxnet->conn_lock);
117 list_del(&bundle->proc_link);
118 write_unlock(&bundle->local->rxnet->conn_lock);
119 rxrpc_put_peer(bundle->peer, rxrpc_peer_put_bundle);
120 key_put(bundle->key);
121 kfree(bundle);
124 void rxrpc_put_bundle(struct rxrpc_bundle *bundle, enum rxrpc_bundle_trace why)
130 if (bundle) {
131 id = bundle->debug_id;
132 dead = __refcount_dec_and_test(&bundle->ref, &r);
135 rxrpc_free_bundle(bundle);
152 rxrpc_alloc_client_connection(struct rxrpc_bundle *bundle)
155 struct rxrpc_local *local = bundle->local;
176 conn->bundle = rxrpc_get_bundle(bundle, rxrpc_bundle_get_client_conn);
177 conn->local = rxrpc_get_local(bundle->local, rxrpc_local_get_client_conn);
178 conn->peer = rxrpc_get_peer(bundle->peer, rxrpc_peer_get_client_conn);
179 conn->key = key_get(bundle->key);
180 conn->security = bundle->security;
181 conn->exclusive = bundle->exclusive;
182 conn->upgrade = bundle->upgrade;
183 conn->orig_service_id = bundle->service_id;
184 conn->security_level = bundle->security_level;
247 * Look up the conn bundle that matches the connection parameters, adding it if
252 struct rxrpc_bundle *bundle, *candidate;
263 call->bundle = rxrpc_alloc_bundle(call, gfp);
264 return call->bundle ? 0 : -ENOMEM;
267 /* First, see if the bundle is already there. */
272 bundle = rb_entry(p, struct rxrpc_bundle, local_node);
275 diff = (cmp(bundle->peer, call->peer) ?:
276 cmp(bundle->key, call->key) ?:
277 cmp(bundle->security_level, call->security_level) ?:
278 cmp(bundle->upgrade, upgrade));
301 bundle = rb_entry(parent, struct rxrpc_bundle, local_node);
304 diff = (cmp(bundle->peer, call->peer) ?:
305 cmp(bundle->key, call->key) ?:
306 cmp(bundle->security_level, call->security_level) ?:
307 cmp(bundle->upgrade, upgrade));
317 _debug("new bundle");
320 call->bundle = rxrpc_get_bundle(candidate, rxrpc_bundle_get_client_call);
322 _leave(" = B=%u [new]", call->bundle->debug_id);
328 call->bundle = rxrpc_get_bundle(bundle, rxrpc_bundle_get_client_call);
329 rxrpc_activate_bundle(bundle);
331 _leave(" = B=%u [found]", call->bundle->debug_id);
336 * Allocate a new connection and add it into a bundle.
338 static bool rxrpc_add_conn_to_bundle(struct rxrpc_bundle *bundle,
345 old = bundle->conns[slot];
347 bundle->conns[slot] = NULL;
348 bundle->conn_ids[slot] = 0;
353 conn = rxrpc_alloc_client_connection(bundle);
355 bundle->alloc_error = PTR_ERR(conn);
359 rxrpc_activate_bundle(bundle);
361 bundle->conns[slot] = conn;
362 bundle->conn_ids[slot] = conn->debug_id;
364 set_bit(shift + i, &bundle->avail_chans);
369 * Add a connection to a bundle if there are no usable connections or we have
372 static bool rxrpc_bundle_has_space(struct rxrpc_bundle *bundle)
378 bundle->alloc_error = 0;
382 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) {
383 if (rxrpc_may_reuse_conn(bundle->conns[i]))
389 if (!usable && bundle->upgrade)
390 bundle->try_upgrade = true;
395 if (!bundle->avail_chans &&
396 !bundle->try_upgrade &&
397 usable < ARRAY_SIZE(bundle->conns))
404 return slot >= 0 ? rxrpc_add_conn_to_bundle(bundle, slot) : false;
416 struct rxrpc_bundle *bundle = conn->bundle;
417 struct rxrpc_call *call = list_entry(bundle->waiting_calls.next,
431 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans);
470 static void rxrpc_activate_channels(struct rxrpc_bundle *bundle)
478 if (bundle->try_upgrade)
483 while (!list_empty(&bundle->waiting_calls)) {
484 avail = bundle->avail_chans & mask;
488 clear_bit(channel, &bundle->avail_chans);
491 conn = bundle->conns[slot];
495 if (bundle->try_upgrade)
515 struct rxrpc_bundle *bundle = call->bundle;
518 list_move_tail(&call->wait_link, &bundle->waiting_calls);
521 if (rxrpc_bundle_has_space(bundle))
522 rxrpc_activate_channels(bundle);
570 void rxrpc_disconnect_client_call(struct rxrpc_bundle *bundle, struct rxrpc_call *call)
574 struct rxrpc_local *local = bundle->local;
618 bundle->try_upgrade = false;
620 rxrpc_activate_channels(bundle);
625 if (may_reuse && !list_empty(&bundle->waiting_calls)) {
647 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans);
666 * Remove a connection from a bundle.
670 struct rxrpc_bundle *bundle = conn->bundle;
680 if (bundle->conns[bindex] == conn) {
682 bundle->conns[bindex] = NULL;
683 bundle->conn_ids[bindex] = 0;
685 clear_bit(conn->bundle_shift + i, &bundle->avail_chans);
686 rxrpc_put_client_connection_id(bundle->local, conn);
687 rxrpc_deactivate_bundle(bundle);
693 * Drop the active count on a bundle.
695 void rxrpc_deactivate_bundle(struct rxrpc_bundle *bundle)
700 if (!bundle)
703 local = bundle->local;
704 if (atomic_dec_and_lock(&bundle->active, &local->client_bundles_lock)) {
705 if (!bundle->exclusive) {
706 _debug("erase bundle");
707 rb_erase(&bundle->local_node, &local->client_bundles);
713 rxrpc_put_bundle(bundle, rxrpc_bundle_put_discard);