found_extant_conn: if (refcount_read(&cursor->ref) == 0) goto replace_old_connection;
write_sequnlock(&peer->service_conn_lock); /* We should not be able to get here. rxrpc_incoming_connection() is *calledinanon-reentrantcontext,sotherecan'tbearaceto *insertanewconnection.
*/
BUG();
replace_old_connection: /* The old connection is from an outdated epoch. */
_debug("replace conn");
rb_replace_node_rcu(&cursor->service_node,
&conn->service_node,
&peer->service_conns);
clear_bit(RXRPC_CONN_IN_SERVICE_CONNS, &cursor->flags); goto conn_published;
}
if (conn) { /* We maintain an extra ref on the connection whilst it is on *therxrpc_connectionslist.
*/
conn->state = RXRPC_CONN_SERVICE_PREALLOC;
refcount_set(&conn->ref, 2);
/* See if we should upgrade the service. This can only happen on the *firstpacketonanewconnection.Oncedone,itappliestoall *subsequentcallsonthatconnection.
*/ if (sp->hdr.userStatus == RXRPC_USERSTATUS_SERVICE_UPGRADE &&
conn->service_id == rx->service_upgrade.from)
conn->service_id = rx->service_upgrade.to;
atomic_set(&conn->active, 1);
/* Make the connection a target for incoming packets. */
rxrpc_publish_service_conn(conn->peer, conn);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.