Lines Matching refs:bundle
43 static void rxrpc_deactivate_bundle(struct rxrpc_bundle *bundle);
121 struct rxrpc_bundle *bundle; in rxrpc_alloc_bundle() local
123 bundle = kzalloc(sizeof(*bundle), gfp); in rxrpc_alloc_bundle()
124 if (bundle) { in rxrpc_alloc_bundle()
125 bundle->params = *cp; in rxrpc_alloc_bundle()
126 rxrpc_get_peer(bundle->params.peer); in rxrpc_alloc_bundle()
127 refcount_set(&bundle->ref, 1); in rxrpc_alloc_bundle()
128 atomic_set(&bundle->active, 1); in rxrpc_alloc_bundle()
129 spin_lock_init(&bundle->channel_lock); in rxrpc_alloc_bundle()
130 INIT_LIST_HEAD(&bundle->waiting_calls); in rxrpc_alloc_bundle()
132 return bundle; in rxrpc_alloc_bundle()
135 struct rxrpc_bundle *rxrpc_get_bundle(struct rxrpc_bundle *bundle) in rxrpc_get_bundle() argument
137 refcount_inc(&bundle->ref); in rxrpc_get_bundle()
138 return bundle; in rxrpc_get_bundle()
141 static void rxrpc_free_bundle(struct rxrpc_bundle *bundle) in rxrpc_free_bundle() argument
143 rxrpc_put_peer(bundle->params.peer); in rxrpc_free_bundle()
144 kfree(bundle); in rxrpc_free_bundle()
147 void rxrpc_put_bundle(struct rxrpc_bundle *bundle) in rxrpc_put_bundle() argument
149 unsigned int d = bundle->debug_id; in rxrpc_put_bundle()
153 dead = __refcount_dec_and_test(&bundle->ref, &r); in rxrpc_put_bundle()
157 rxrpc_free_bundle(bundle); in rxrpc_put_bundle()
164 rxrpc_alloc_client_connection(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_alloc_client_connection() argument
167 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_alloc_client_connection()
179 conn->bundle = bundle; in rxrpc_alloc_client_connection()
180 conn->params = bundle->params; in rxrpc_alloc_client_connection()
202 rxrpc_get_bundle(bundle); in rxrpc_alloc_client_connection()
276 struct rxrpc_bundle *bundle, *candidate; in rxrpc_look_up_bundle() local
292 bundle = rb_entry(p, struct rxrpc_bundle, local_node); in rxrpc_look_up_bundle()
294 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
321 bundle = rb_entry(parent, struct rxrpc_bundle, local_node); in rxrpc_look_up_bundle()
323 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
349 rxrpc_get_bundle(bundle); in rxrpc_look_up_bundle()
350 atomic_inc(&bundle->active); in rxrpc_look_up_bundle()
352 _leave(" = %u [found]", bundle->debug_id); in rxrpc_look_up_bundle()
353 return bundle; in rxrpc_look_up_bundle()
368 struct rxrpc_bundle *bundle; in rxrpc_prep_call() local
385 bundle = rxrpc_look_up_bundle(cp, gfp); in rxrpc_prep_call()
386 if (!bundle) in rxrpc_prep_call()
392 spin_lock(&bundle->channel_lock); in rxrpc_prep_call()
393 list_add_tail(&call->chan_wait_link, &bundle->waiting_calls); in rxrpc_prep_call()
394 spin_unlock(&bundle->channel_lock); in rxrpc_prep_call()
396 _leave(" = [B=%x]", bundle->debug_id); in rxrpc_prep_call()
397 return bundle; in rxrpc_prep_call()
407 static void rxrpc_add_conn_to_bundle(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_add_conn_to_bundle() argument
408 __releases(bundle->channel_lock) in rxrpc_add_conn_to_bundle()
416 conflict = bundle->alloc_conn; in rxrpc_add_conn_to_bundle()
418 bundle->alloc_conn = true; in rxrpc_add_conn_to_bundle()
419 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
425 candidate = rxrpc_alloc_client_connection(bundle, gfp); in rxrpc_add_conn_to_bundle()
427 spin_lock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
428 bundle->alloc_conn = false; in rxrpc_add_conn_to_bundle()
431 bundle->alloc_error = PTR_ERR(candidate); in rxrpc_add_conn_to_bundle()
432 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
437 bundle->alloc_error = 0; in rxrpc_add_conn_to_bundle()
439 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) { in rxrpc_add_conn_to_bundle()
443 old = bundle->conns[i]; in rxrpc_add_conn_to_bundle()
448 atomic_inc(&bundle->active); in rxrpc_add_conn_to_bundle()
449 bundle->conns[i] = candidate; in rxrpc_add_conn_to_bundle()
451 set_bit(shift + j, &bundle->avail_chans); in rxrpc_add_conn_to_bundle()
459 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
475 static void rxrpc_maybe_add_conn(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_maybe_add_conn() argument
482 spin_lock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
486 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_maybe_add_conn()
487 if (rxrpc_may_reuse_conn(bundle->conns[i])) in rxrpc_maybe_add_conn()
490 if (!usable && !list_empty(&bundle->waiting_calls)) { in rxrpc_maybe_add_conn()
491 call = list_first_entry(&bundle->waiting_calls, in rxrpc_maybe_add_conn()
494 bundle->try_upgrade = true; in rxrpc_maybe_add_conn()
500 if (!bundle->avail_chans && in rxrpc_maybe_add_conn()
501 !bundle->try_upgrade && in rxrpc_maybe_add_conn()
502 !list_empty(&bundle->waiting_calls) && in rxrpc_maybe_add_conn()
503 usable < ARRAY_SIZE(bundle->conns)) in rxrpc_maybe_add_conn()
506 spin_unlock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
511 return rxrpc_add_conn_to_bundle(bundle, gfp); in rxrpc_maybe_add_conn()
523 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_activate_one_channel() local
524 struct rxrpc_call *call = list_entry(bundle->waiting_calls.next, in rxrpc_activate_one_channel()
536 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); in rxrpc_activate_one_channel()
577 static void rxrpc_unidle_conn(struct rxrpc_bundle *bundle, struct rxrpc_connection *conn) in rxrpc_unidle_conn() argument
579 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_unidle_conn()
599 static void rxrpc_activate_channels_locked(struct rxrpc_bundle *bundle) in rxrpc_activate_channels_locked() argument
605 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
610 while (!list_empty(&bundle->waiting_calls)) { in rxrpc_activate_channels_locked()
611 avail = bundle->avail_chans & mask; in rxrpc_activate_channels_locked()
615 clear_bit(channel, &bundle->avail_chans); in rxrpc_activate_channels_locked()
618 conn = bundle->conns[slot]; in rxrpc_activate_channels_locked()
622 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
624 rxrpc_unidle_conn(bundle, conn); in rxrpc_activate_channels_locked()
635 static void rxrpc_activate_channels(struct rxrpc_bundle *bundle) in rxrpc_activate_channels() argument
637 _enter("B=%x", bundle->debug_id); in rxrpc_activate_channels()
641 if (!bundle->avail_chans) in rxrpc_activate_channels()
644 spin_lock(&bundle->channel_lock); in rxrpc_activate_channels()
645 rxrpc_activate_channels_locked(bundle); in rxrpc_activate_channels()
646 spin_unlock(&bundle->channel_lock); in rxrpc_activate_channels()
653 static int rxrpc_wait_for_channel(struct rxrpc_bundle *bundle, in rxrpc_wait_for_channel() argument
662 rxrpc_maybe_add_conn(bundle, gfp); in rxrpc_wait_for_channel()
663 rxrpc_activate_channels(bundle); in rxrpc_wait_for_channel()
664 ret = bundle->alloc_error ?: -EAGAIN; in rxrpc_wait_for_channel()
670 rxrpc_maybe_add_conn(bundle, gfp); in rxrpc_wait_for_channel()
671 rxrpc_activate_channels(bundle); in rxrpc_wait_for_channel()
672 ret = bundle->alloc_error; in rxrpc_wait_for_channel()
714 struct rxrpc_bundle *bundle; in rxrpc_connect_call() local
722 bundle = rxrpc_prep_call(rx, call, cp, srx, gfp); in rxrpc_connect_call()
723 if (IS_ERR(bundle)) { in rxrpc_connect_call()
724 ret = PTR_ERR(bundle); in rxrpc_connect_call()
729 ret = rxrpc_wait_for_channel(bundle, call, gfp); in rxrpc_connect_call()
739 rxrpc_deactivate_bundle(bundle); in rxrpc_connect_call()
740 rxrpc_put_bundle(bundle); in rxrpc_connect_call()
746 spin_lock(&bundle->channel_lock); in rxrpc_connect_call()
748 spin_unlock(&bundle->channel_lock); in rxrpc_connect_call()
757 rxrpc_disconnect_client_call(bundle, call); in rxrpc_connect_call()
801 void rxrpc_disconnect_client_call(struct rxrpc_bundle *bundle, struct rxrpc_call *call) in rxrpc_disconnect_client_call() argument
805 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_disconnect_client_call()
812 spin_lock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
833 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
854 bundle->try_upgrade = false; in rxrpc_disconnect_client_call()
856 rxrpc_activate_channels_locked(bundle); in rxrpc_disconnect_client_call()
862 if (may_reuse && !list_empty(&bundle->waiting_calls)) { in rxrpc_disconnect_client_call()
884 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans); in rxrpc_disconnect_client_call()
904 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
914 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_unbundle_conn() local
924 spin_lock(&bundle->channel_lock); in rxrpc_unbundle_conn()
926 if (bundle->conns[bindex] == conn) { in rxrpc_unbundle_conn()
928 bundle->conns[bindex] = NULL; in rxrpc_unbundle_conn()
930 clear_bit(conn->bundle_shift + i, &bundle->avail_chans); in rxrpc_unbundle_conn()
933 spin_unlock(&bundle->channel_lock); in rxrpc_unbundle_conn()
936 rxrpc_deactivate_bundle(bundle); in rxrpc_unbundle_conn()
944 static void rxrpc_deactivate_bundle(struct rxrpc_bundle *bundle) in rxrpc_deactivate_bundle() argument
946 struct rxrpc_local *local = bundle->params.local; in rxrpc_deactivate_bundle()
949 if (atomic_dec_and_lock(&bundle->active, &local->client_bundles_lock)) { in rxrpc_deactivate_bundle()
950 if (!bundle->params.exclusive) { in rxrpc_deactivate_bundle()
952 rb_erase(&bundle->local_node, &local->client_bundles); in rxrpc_deactivate_bundle()
958 rxrpc_put_bundle(bundle); in rxrpc_deactivate_bundle()