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()
188 rxrpc_get_bundle(bundle); in rxrpc_alloc_client_connection()
260 struct rxrpc_bundle *bundle, *candidate; in rxrpc_look_up_bundle() local
276 bundle = rb_entry(p, struct rxrpc_bundle, local_node); in rxrpc_look_up_bundle()
278 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
305 bundle = rb_entry(parent, struct rxrpc_bundle, local_node); in rxrpc_look_up_bundle()
307 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
333 rxrpc_get_bundle(bundle); in rxrpc_look_up_bundle()
335 _leave(" = %u [found]", bundle->debug_id); in rxrpc_look_up_bundle()
336 return bundle; in rxrpc_look_up_bundle()
351 struct rxrpc_bundle *bundle; in rxrpc_prep_call() local
368 bundle = rxrpc_look_up_bundle(cp, gfp); in rxrpc_prep_call()
369 if (!bundle) in rxrpc_prep_call()
375 spin_lock(&bundle->channel_lock); in rxrpc_prep_call()
376 list_add_tail(&call->chan_wait_link, &bundle->waiting_calls); in rxrpc_prep_call()
377 spin_unlock(&bundle->channel_lock); in rxrpc_prep_call()
379 _leave(" = [B=%x]", bundle->debug_id); in rxrpc_prep_call()
380 return bundle; in rxrpc_prep_call()
390 static void rxrpc_add_conn_to_bundle(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_add_conn_to_bundle() argument
391 __releases(bundle->channel_lock) in rxrpc_add_conn_to_bundle()
399 conflict = bundle->alloc_conn; in rxrpc_add_conn_to_bundle()
401 bundle->alloc_conn = true; in rxrpc_add_conn_to_bundle()
402 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
408 candidate = rxrpc_alloc_client_connection(bundle, gfp); in rxrpc_add_conn_to_bundle()
410 spin_lock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
411 bundle->alloc_conn = false; in rxrpc_add_conn_to_bundle()
414 bundle->alloc_error = PTR_ERR(candidate); in rxrpc_add_conn_to_bundle()
415 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
420 bundle->alloc_error = 0; in rxrpc_add_conn_to_bundle()
422 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) { in rxrpc_add_conn_to_bundle()
426 old = bundle->conns[i]; in rxrpc_add_conn_to_bundle()
431 bundle->conns[i] = candidate; in rxrpc_add_conn_to_bundle()
433 set_bit(shift + j, &bundle->avail_chans); in rxrpc_add_conn_to_bundle()
441 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
457 static void rxrpc_maybe_add_conn(struct rxrpc_bundle *bundle, gfp_t gfp) in rxrpc_maybe_add_conn() argument
464 spin_lock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
468 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_maybe_add_conn()
469 if (rxrpc_may_reuse_conn(bundle->conns[i])) in rxrpc_maybe_add_conn()
472 if (!usable && !list_empty(&bundle->waiting_calls)) { in rxrpc_maybe_add_conn()
473 call = list_first_entry(&bundle->waiting_calls, in rxrpc_maybe_add_conn()
476 bundle->try_upgrade = true; in rxrpc_maybe_add_conn()
482 if (!bundle->avail_chans && in rxrpc_maybe_add_conn()
483 !bundle->try_upgrade && in rxrpc_maybe_add_conn()
484 !list_empty(&bundle->waiting_calls) && in rxrpc_maybe_add_conn()
485 usable < ARRAY_SIZE(bundle->conns)) in rxrpc_maybe_add_conn()
488 spin_unlock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
493 return rxrpc_add_conn_to_bundle(bundle, gfp); in rxrpc_maybe_add_conn()
505 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_activate_one_channel() local
506 struct rxrpc_call *call = list_entry(bundle->waiting_calls.next, in rxrpc_activate_one_channel()
518 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); in rxrpc_activate_one_channel()
559 static void rxrpc_unidle_conn(struct rxrpc_bundle *bundle, struct rxrpc_connection *conn) in rxrpc_unidle_conn() argument
561 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_unidle_conn()
581 static void rxrpc_activate_channels_locked(struct rxrpc_bundle *bundle) in rxrpc_activate_channels_locked() argument
587 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
592 while (!list_empty(&bundle->waiting_calls)) { in rxrpc_activate_channels_locked()
593 avail = bundle->avail_chans & mask; in rxrpc_activate_channels_locked()
597 clear_bit(channel, &bundle->avail_chans); in rxrpc_activate_channels_locked()
600 conn = bundle->conns[slot]; in rxrpc_activate_channels_locked()
604 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
606 rxrpc_unidle_conn(bundle, conn); in rxrpc_activate_channels_locked()
617 static void rxrpc_activate_channels(struct rxrpc_bundle *bundle) in rxrpc_activate_channels() argument
619 _enter("B=%x", bundle->debug_id); in rxrpc_activate_channels()
623 if (!bundle->avail_chans) in rxrpc_activate_channels()
626 spin_lock(&bundle->channel_lock); in rxrpc_activate_channels()
627 rxrpc_activate_channels_locked(bundle); in rxrpc_activate_channels()
628 spin_unlock(&bundle->channel_lock); in rxrpc_activate_channels()
635 static int rxrpc_wait_for_channel(struct rxrpc_bundle *bundle, in rxrpc_wait_for_channel() argument
644 rxrpc_maybe_add_conn(bundle, gfp); in rxrpc_wait_for_channel()
645 rxrpc_activate_channels(bundle); in rxrpc_wait_for_channel()
646 ret = bundle->alloc_error ?: -EAGAIN; in rxrpc_wait_for_channel()
652 rxrpc_maybe_add_conn(bundle, gfp); in rxrpc_wait_for_channel()
653 rxrpc_activate_channels(bundle); in rxrpc_wait_for_channel()
654 ret = bundle->alloc_error; in rxrpc_wait_for_channel()
696 struct rxrpc_bundle *bundle; in rxrpc_connect_call() local
704 bundle = rxrpc_prep_call(rx, call, cp, srx, gfp); in rxrpc_connect_call()
705 if (IS_ERR(bundle)) { in rxrpc_connect_call()
706 ret = PTR_ERR(bundle); in rxrpc_connect_call()
711 ret = rxrpc_wait_for_channel(bundle, call, gfp); in rxrpc_connect_call()
721 rxrpc_put_bundle(bundle); in rxrpc_connect_call()
727 spin_lock(&bundle->channel_lock); in rxrpc_connect_call()
729 spin_unlock(&bundle->channel_lock); in rxrpc_connect_call()
738 rxrpc_disconnect_client_call(bundle, call); in rxrpc_connect_call()
782 void rxrpc_disconnect_client_call(struct rxrpc_bundle *bundle, struct rxrpc_call *call) in rxrpc_disconnect_client_call() argument
786 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_disconnect_client_call()
793 spin_lock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
814 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
835 bundle->try_upgrade = false; in rxrpc_disconnect_client_call()
837 rxrpc_activate_channels_locked(bundle); in rxrpc_disconnect_client_call()
843 if (may_reuse && !list_empty(&bundle->waiting_calls)) { in rxrpc_disconnect_client_call()
865 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans); in rxrpc_disconnect_client_call()
885 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
895 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_unbundle_conn() local
896 struct rxrpc_local *local = bundle->params.local; in rxrpc_unbundle_conn()
906 spin_lock(&bundle->channel_lock); in rxrpc_unbundle_conn()
908 if (bundle->conns[bindex] == conn) { in rxrpc_unbundle_conn()
910 bundle->conns[bindex] = NULL; in rxrpc_unbundle_conn()
912 clear_bit(conn->bundle_shift + i, &bundle->avail_chans); in rxrpc_unbundle_conn()
915 spin_unlock(&bundle->channel_lock); in rxrpc_unbundle_conn()
918 if (!bundle->avail_chans) { in rxrpc_unbundle_conn()
922 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_unbundle_conn()
923 if (bundle->conns[i]) in rxrpc_unbundle_conn()
925 if (i == ARRAY_SIZE(bundle->conns) && !bundle->params.exclusive) { in rxrpc_unbundle_conn()
927 rb_erase(&bundle->local_node, &local->client_bundles); in rxrpc_unbundle_conn()
933 rxrpc_put_bundle(bundle); in rxrpc_unbundle_conn()