Lines Matching refs:bundle
119 struct rxrpc_bundle *bundle; in rxrpc_alloc_bundle() local
121 bundle = kzalloc(sizeof(*bundle), gfp); in rxrpc_alloc_bundle()
122 if (bundle) { in rxrpc_alloc_bundle()
123 bundle->params = *cp; in rxrpc_alloc_bundle()
124 rxrpc_get_peer(bundle->params.peer); in rxrpc_alloc_bundle()
125 atomic_set(&bundle->usage, 1); in rxrpc_alloc_bundle()
126 spin_lock_init(&bundle->channel_lock); in rxrpc_alloc_bundle()
127 INIT_LIST_HEAD(&bundle->waiting_calls); in rxrpc_alloc_bundle()
129 return bundle; in rxrpc_alloc_bundle()
132 struct rxrpc_bundle *rxrpc_get_bundle(struct rxrpc_bundle *bundle) in rxrpc_get_bundle() argument
134 atomic_inc(&bundle->usage); in rxrpc_get_bundle()
135 return bundle; in rxrpc_get_bundle()
138 static void rxrpc_free_bundle(struct rxrpc_bundle *bundle) in rxrpc_free_bundle() argument
140 rxrpc_put_peer(bundle->params.peer); in rxrpc_free_bundle()
141 kfree(bundle); in rxrpc_free_bundle()
144 void rxrpc_put_bundle(struct rxrpc_bundle *bundle) in rxrpc_put_bundle() argument
146 unsigned int d = bundle->debug_id; in rxrpc_put_bundle()
147 unsigned int u = atomic_dec_return(&bundle->usage); in rxrpc_put_bundle()
151 rxrpc_free_bundle(bundle); in rxrpc_put_bundle()
158 rxrpc_alloc_client_connection(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_alloc_client_connection() argument
161 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_alloc_client_connection()
173 conn->bundle = bundle; in rxrpc_alloc_client_connection()
174 conn->params = bundle->params; in rxrpc_alloc_client_connection()
192 rxrpc_get_bundle(bundle); in rxrpc_alloc_client_connection()
264 struct rxrpc_bundle *bundle, *candidate; in rxrpc_look_up_bundle() local
280 bundle = rb_entry(p, struct rxrpc_bundle, local_node); in rxrpc_look_up_bundle()
282 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
309 bundle = rb_entry(parent, struct rxrpc_bundle, local_node); in rxrpc_look_up_bundle()
311 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
337 rxrpc_get_bundle(bundle); in rxrpc_look_up_bundle()
339 _leave(" = %u [found]", bundle->debug_id); in rxrpc_look_up_bundle()
340 return bundle; in rxrpc_look_up_bundle()
355 struct rxrpc_bundle *bundle; in rxrpc_prep_call() local
372 bundle = rxrpc_look_up_bundle(cp, gfp); in rxrpc_prep_call()
373 if (!bundle) in rxrpc_prep_call()
379 spin_lock(&bundle->channel_lock); in rxrpc_prep_call()
380 list_add_tail(&call->chan_wait_link, &bundle->waiting_calls); in rxrpc_prep_call()
381 spin_unlock(&bundle->channel_lock); in rxrpc_prep_call()
383 _leave(" = [B=%x]", bundle->debug_id); in rxrpc_prep_call()
384 return bundle; in rxrpc_prep_call()
394 static void rxrpc_add_conn_to_bundle(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_add_conn_to_bundle() argument
395 __releases(bundle->channel_lock) in rxrpc_add_conn_to_bundle()
403 conflict = bundle->alloc_conn; in rxrpc_add_conn_to_bundle()
405 bundle->alloc_conn = true; in rxrpc_add_conn_to_bundle()
406 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
412 candidate = rxrpc_alloc_client_connection(bundle, gfp); in rxrpc_add_conn_to_bundle()
414 spin_lock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
415 bundle->alloc_conn = false; in rxrpc_add_conn_to_bundle()
418 bundle->alloc_error = PTR_ERR(candidate); in rxrpc_add_conn_to_bundle()
419 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
424 bundle->alloc_error = 0; in rxrpc_add_conn_to_bundle()
426 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) { in rxrpc_add_conn_to_bundle()
430 old = bundle->conns[i]; in rxrpc_add_conn_to_bundle()
435 bundle->conns[i] = candidate; in rxrpc_add_conn_to_bundle()
437 set_bit(shift + j, &bundle->avail_chans); in rxrpc_add_conn_to_bundle()
445 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
461 static void rxrpc_maybe_add_conn(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_maybe_add_conn() argument
468 spin_lock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
472 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_maybe_add_conn()
473 if (rxrpc_may_reuse_conn(bundle->conns[i])) in rxrpc_maybe_add_conn()
476 if (!usable && !list_empty(&bundle->waiting_calls)) { in rxrpc_maybe_add_conn()
477 call = list_first_entry(&bundle->waiting_calls, in rxrpc_maybe_add_conn()
480 bundle->try_upgrade = true; in rxrpc_maybe_add_conn()
486 if (!bundle->avail_chans && in rxrpc_maybe_add_conn()
487 !bundle->try_upgrade && in rxrpc_maybe_add_conn()
488 !list_empty(&bundle->waiting_calls) && in rxrpc_maybe_add_conn()
489 usable < ARRAY_SIZE(bundle->conns)) in rxrpc_maybe_add_conn()
492 spin_unlock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
497 return rxrpc_add_conn_to_bundle(bundle, gfp); in rxrpc_maybe_add_conn()
509 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_activate_one_channel() local
510 struct rxrpc_call *call = list_entry(bundle->waiting_calls.next, in rxrpc_activate_one_channel()
522 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); in rxrpc_activate_one_channel()
563 static void rxrpc_unidle_conn(struct rxrpc_bundle *bundle, struct rxrpc_connection *conn) in rxrpc_unidle_conn() argument
565 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_unidle_conn()
585 static void rxrpc_activate_channels_locked(struct rxrpc_bundle *bundle) in rxrpc_activate_channels_locked() argument
591 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
596 while (!list_empty(&bundle->waiting_calls)) { in rxrpc_activate_channels_locked()
597 avail = bundle->avail_chans & mask; in rxrpc_activate_channels_locked()
601 clear_bit(channel, &bundle->avail_chans); in rxrpc_activate_channels_locked()
604 conn = bundle->conns[slot]; in rxrpc_activate_channels_locked()
608 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
610 rxrpc_unidle_conn(bundle, conn); in rxrpc_activate_channels_locked()
621 static void rxrpc_activate_channels(struct rxrpc_bundle *bundle) in rxrpc_activate_channels() argument
623 _enter("B=%x", bundle->debug_id); in rxrpc_activate_channels()
627 if (!bundle->avail_chans) in rxrpc_activate_channels()
630 spin_lock(&bundle->channel_lock); in rxrpc_activate_channels()
631 rxrpc_activate_channels_locked(bundle); in rxrpc_activate_channels()
632 spin_unlock(&bundle->channel_lock); in rxrpc_activate_channels()
639 static int rxrpc_wait_for_channel(struct rxrpc_bundle *bundle, in rxrpc_wait_for_channel() argument
648 rxrpc_maybe_add_conn(bundle, gfp); in rxrpc_wait_for_channel()
649 rxrpc_activate_channels(bundle); in rxrpc_wait_for_channel()
650 ret = bundle->alloc_error ?: -EAGAIN; in rxrpc_wait_for_channel()
656 rxrpc_maybe_add_conn(bundle, gfp); in rxrpc_wait_for_channel()
657 rxrpc_activate_channels(bundle); in rxrpc_wait_for_channel()
658 ret = bundle->alloc_error; in rxrpc_wait_for_channel()
700 struct rxrpc_bundle *bundle; in rxrpc_connect_call() local
708 bundle = rxrpc_prep_call(rx, call, cp, srx, gfp); in rxrpc_connect_call()
709 if (IS_ERR(bundle)) { in rxrpc_connect_call()
710 ret = PTR_ERR(bundle); in rxrpc_connect_call()
715 ret = rxrpc_wait_for_channel(bundle, call, gfp); in rxrpc_connect_call()
725 rxrpc_put_bundle(bundle); in rxrpc_connect_call()
731 spin_lock(&bundle->channel_lock); in rxrpc_connect_call()
733 spin_unlock(&bundle->channel_lock); in rxrpc_connect_call()
742 rxrpc_disconnect_client_call(bundle, call); in rxrpc_connect_call()
786 void rxrpc_disconnect_client_call(struct rxrpc_bundle *bundle, struct rxrpc_call *call) in rxrpc_disconnect_client_call() argument
790 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_disconnect_client_call()
797 spin_lock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
818 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
839 bundle->try_upgrade = false; in rxrpc_disconnect_client_call()
841 rxrpc_activate_channels_locked(bundle); in rxrpc_disconnect_client_call()
847 if (may_reuse && !list_empty(&bundle->waiting_calls)) { in rxrpc_disconnect_client_call()
869 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans); in rxrpc_disconnect_client_call()
889 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
899 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_unbundle_conn() local
900 struct rxrpc_local *local = bundle->params.local; in rxrpc_unbundle_conn()
910 spin_lock(&bundle->channel_lock); in rxrpc_unbundle_conn()
912 if (bundle->conns[bindex] == conn) { in rxrpc_unbundle_conn()
914 bundle->conns[bindex] = NULL; in rxrpc_unbundle_conn()
916 clear_bit(conn->bundle_shift + i, &bundle->avail_chans); in rxrpc_unbundle_conn()
919 spin_unlock(&bundle->channel_lock); in rxrpc_unbundle_conn()
922 if (!bundle->avail_chans) { in rxrpc_unbundle_conn()
926 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_unbundle_conn()
927 if (bundle->conns[i]) in rxrpc_unbundle_conn()
929 if (i == ARRAY_SIZE(bundle->conns) && !bundle->params.exclusive) { in rxrpc_unbundle_conn()
931 rb_erase(&bundle->local_node, &local->client_bundles); in rxrpc_unbundle_conn()
937 rxrpc_put_bundle(bundle); in rxrpc_unbundle_conn()