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 void rxrpc_put_bundle(struct rxrpc_bundle *bundle) in rxrpc_put_bundle() argument
140 unsigned int d = bundle->debug_id; in rxrpc_put_bundle()
141 unsigned int u = atomic_dec_return(&bundle->usage); in rxrpc_put_bundle()
145 rxrpc_put_peer(bundle->params.peer); in rxrpc_put_bundle()
146 kfree(bundle); in rxrpc_put_bundle()
154 rxrpc_alloc_client_connection(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_alloc_client_connection() argument
157 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_alloc_client_connection()
169 conn->bundle = bundle; in rxrpc_alloc_client_connection()
170 conn->params = bundle->params; in rxrpc_alloc_client_connection()
192 rxrpc_get_bundle(bundle); in rxrpc_alloc_client_connection()
266 struct rxrpc_bundle *bundle, *candidate; in rxrpc_look_up_bundle() local
282 bundle = rb_entry(p, struct rxrpc_bundle, local_node); in rxrpc_look_up_bundle()
284 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
311 bundle = rb_entry(parent, struct rxrpc_bundle, local_node); in rxrpc_look_up_bundle()
313 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
339 rxrpc_get_bundle(bundle); in rxrpc_look_up_bundle()
341 _leave(" = %u [found]", bundle->debug_id); in rxrpc_look_up_bundle()
342 return bundle; in rxrpc_look_up_bundle()
357 struct rxrpc_bundle *bundle; in rxrpc_prep_call() local
374 bundle = rxrpc_look_up_bundle(cp, gfp); in rxrpc_prep_call()
375 if (!bundle) in rxrpc_prep_call()
381 spin_lock(&bundle->channel_lock); in rxrpc_prep_call()
382 list_add_tail(&call->chan_wait_link, &bundle->waiting_calls); in rxrpc_prep_call()
383 spin_unlock(&bundle->channel_lock); in rxrpc_prep_call()
385 _leave(" = [B=%x]", bundle->debug_id); in rxrpc_prep_call()
386 return bundle; in rxrpc_prep_call()
396 static void rxrpc_add_conn_to_bundle(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_add_conn_to_bundle() argument
397 __releases(bundle->channel_lock) in rxrpc_add_conn_to_bundle()
405 conflict = bundle->alloc_conn; in rxrpc_add_conn_to_bundle()
407 bundle->alloc_conn = true; in rxrpc_add_conn_to_bundle()
408 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
414 candidate = rxrpc_alloc_client_connection(bundle, gfp); in rxrpc_add_conn_to_bundle()
416 spin_lock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
417 bundle->alloc_conn = false; in rxrpc_add_conn_to_bundle()
420 bundle->alloc_error = PTR_ERR(candidate); in rxrpc_add_conn_to_bundle()
421 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
426 bundle->alloc_error = 0; in rxrpc_add_conn_to_bundle()
428 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) { in rxrpc_add_conn_to_bundle()
432 old = bundle->conns[i]; in rxrpc_add_conn_to_bundle()
437 bundle->conns[i] = candidate; in rxrpc_add_conn_to_bundle()
439 set_bit(shift + j, &bundle->avail_chans); in rxrpc_add_conn_to_bundle()
447 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
463 static void rxrpc_maybe_add_conn(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_maybe_add_conn() argument
470 spin_lock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
474 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_maybe_add_conn()
475 if (rxrpc_may_reuse_conn(bundle->conns[i])) in rxrpc_maybe_add_conn()
478 if (!usable && !list_empty(&bundle->waiting_calls)) { in rxrpc_maybe_add_conn()
479 call = list_first_entry(&bundle->waiting_calls, in rxrpc_maybe_add_conn()
482 bundle->try_upgrade = true; in rxrpc_maybe_add_conn()
488 if (!bundle->avail_chans && in rxrpc_maybe_add_conn()
489 !bundle->try_upgrade && in rxrpc_maybe_add_conn()
490 !list_empty(&bundle->waiting_calls) && in rxrpc_maybe_add_conn()
491 usable < ARRAY_SIZE(bundle->conns)) in rxrpc_maybe_add_conn()
494 spin_unlock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
499 return rxrpc_add_conn_to_bundle(bundle, gfp); in rxrpc_maybe_add_conn()
511 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_activate_one_channel() local
512 struct rxrpc_call *call = list_entry(bundle->waiting_calls.next, in rxrpc_activate_one_channel()
524 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); in rxrpc_activate_one_channel()
565 static void rxrpc_unidle_conn(struct rxrpc_bundle *bundle, struct rxrpc_connection *conn) in rxrpc_unidle_conn() argument
567 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_unidle_conn()
587 static void rxrpc_activate_channels_locked(struct rxrpc_bundle *bundle) in rxrpc_activate_channels_locked() argument
593 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
598 while (!list_empty(&bundle->waiting_calls)) { in rxrpc_activate_channels_locked()
599 avail = bundle->avail_chans & mask; in rxrpc_activate_channels_locked()
603 clear_bit(channel, &bundle->avail_chans); in rxrpc_activate_channels_locked()
606 conn = bundle->conns[slot]; in rxrpc_activate_channels_locked()
610 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
612 rxrpc_unidle_conn(bundle, conn); in rxrpc_activate_channels_locked()
623 static void rxrpc_activate_channels(struct rxrpc_bundle *bundle) in rxrpc_activate_channels() argument
625 _enter("B=%x", bundle->debug_id); in rxrpc_activate_channels()
629 if (!bundle->avail_chans) in rxrpc_activate_channels()
632 spin_lock(&bundle->channel_lock); in rxrpc_activate_channels()
633 rxrpc_activate_channels_locked(bundle); in rxrpc_activate_channels()
634 spin_unlock(&bundle->channel_lock); in rxrpc_activate_channels()
641 static int rxrpc_wait_for_channel(struct rxrpc_bundle *bundle, in rxrpc_wait_for_channel() argument
650 rxrpc_maybe_add_conn(bundle, gfp); in rxrpc_wait_for_channel()
651 rxrpc_activate_channels(bundle); in rxrpc_wait_for_channel()
652 ret = bundle->alloc_error ?: -EAGAIN; in rxrpc_wait_for_channel()
658 rxrpc_maybe_add_conn(bundle, gfp); in rxrpc_wait_for_channel()
659 rxrpc_activate_channels(bundle); in rxrpc_wait_for_channel()
660 ret = bundle->alloc_error; in rxrpc_wait_for_channel()
702 struct rxrpc_bundle *bundle; in rxrpc_connect_call() local
710 bundle = rxrpc_prep_call(rx, call, cp, srx, gfp); in rxrpc_connect_call()
711 if (IS_ERR(bundle)) { in rxrpc_connect_call()
712 ret = PTR_ERR(bundle); in rxrpc_connect_call()
717 ret = rxrpc_wait_for_channel(bundle, call, gfp); in rxrpc_connect_call()
727 rxrpc_put_bundle(bundle); in rxrpc_connect_call()
733 spin_lock(&bundle->channel_lock); in rxrpc_connect_call()
735 spin_unlock(&bundle->channel_lock); in rxrpc_connect_call()
744 rxrpc_disconnect_client_call(bundle, call); in rxrpc_connect_call()
788 void rxrpc_disconnect_client_call(struct rxrpc_bundle *bundle, struct rxrpc_call *call) in rxrpc_disconnect_client_call() argument
792 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_disconnect_client_call()
799 spin_lock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
820 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
841 bundle->try_upgrade = false; in rxrpc_disconnect_client_call()
843 rxrpc_activate_channels_locked(bundle); in rxrpc_disconnect_client_call()
849 if (may_reuse && !list_empty(&bundle->waiting_calls)) { in rxrpc_disconnect_client_call()
871 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans); in rxrpc_disconnect_client_call()
891 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
901 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_unbundle_conn() local
902 struct rxrpc_local *local = bundle->params.local; in rxrpc_unbundle_conn()
912 spin_lock(&bundle->channel_lock); in rxrpc_unbundle_conn()
914 if (bundle->conns[bindex] == conn) { in rxrpc_unbundle_conn()
916 bundle->conns[bindex] = NULL; in rxrpc_unbundle_conn()
918 clear_bit(conn->bundle_shift + i, &bundle->avail_chans); in rxrpc_unbundle_conn()
921 spin_unlock(&bundle->channel_lock); in rxrpc_unbundle_conn()
924 if (!bundle->avail_chans) { in rxrpc_unbundle_conn()
928 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_unbundle_conn()
929 if (bundle->conns[i]) in rxrpc_unbundle_conn()
931 if (i == ARRAY_SIZE(bundle->conns) && !bundle->params.exclusive) { in rxrpc_unbundle_conn()
933 rb_erase(&bundle->local_node, &local->client_bundles); in rxrpc_unbundle_conn()
939 rxrpc_put_bundle(bundle); in rxrpc_unbundle_conn()