|
@@ -691,7 +691,7 @@ int rxrpc_connect_call(struct rxrpc_call *call,
|
|
|
|
|
|
_enter("{%d,%lx},", call->debug_id, call->user_call_ID);
|
|
_enter("{%d,%lx},", call->debug_id, call->user_call_ID);
|
|
|
|
|
|
- rxrpc_discard_expired_client_conns(&rxnet->client_conn_reaper.work);
|
|
|
|
|
|
+ rxrpc_discard_expired_client_conns(&rxnet->client_conn_reaper);
|
|
rxrpc_cull_active_client_conns(rxnet);
|
|
rxrpc_cull_active_client_conns(rxnet);
|
|
|
|
|
|
ret = rxrpc_get_client_conn(call, cp, srx, gfp);
|
|
ret = rxrpc_get_client_conn(call, cp, srx, gfp);
|
|
@@ -756,6 +756,18 @@ void rxrpc_expose_client_call(struct rxrpc_call *call)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Set the reap timer.
|
|
|
|
+ */
|
|
|
|
+static void rxrpc_set_client_reap_timer(struct rxrpc_net *rxnet)
|
|
|
|
+{
|
|
|
|
+ unsigned long now = jiffies;
|
|
|
|
+ unsigned long reap_at = now + rxrpc_conn_idle_client_expiry;
|
|
|
|
+
|
|
|
|
+ if (rxnet->live)
|
|
|
|
+ timer_reduce(&rxnet->client_conn_reap_timer, reap_at);
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Disconnect a client call.
|
|
* Disconnect a client call.
|
|
*/
|
|
*/
|
|
@@ -896,9 +908,7 @@ idle_connection:
|
|
list_move_tail(&conn->cache_link, &rxnet->idle_client_conns);
|
|
list_move_tail(&conn->cache_link, &rxnet->idle_client_conns);
|
|
if (rxnet->idle_client_conns.next == &conn->cache_link &&
|
|
if (rxnet->idle_client_conns.next == &conn->cache_link &&
|
|
!rxnet->kill_all_client_conns)
|
|
!rxnet->kill_all_client_conns)
|
|
- queue_delayed_work(rxrpc_workqueue,
|
|
|
|
- &rxnet->client_conn_reaper,
|
|
|
|
- rxrpc_conn_idle_client_expiry);
|
|
|
|
|
|
+ rxrpc_set_client_reap_timer(rxnet);
|
|
} else {
|
|
} else {
|
|
trace_rxrpc_client(conn, channel, rxrpc_client_to_inactive);
|
|
trace_rxrpc_client(conn, channel, rxrpc_client_to_inactive);
|
|
conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE;
|
|
conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE;
|
|
@@ -1036,8 +1046,7 @@ void rxrpc_discard_expired_client_conns(struct work_struct *work)
|
|
{
|
|
{
|
|
struct rxrpc_connection *conn;
|
|
struct rxrpc_connection *conn;
|
|
struct rxrpc_net *rxnet =
|
|
struct rxrpc_net *rxnet =
|
|
- container_of(to_delayed_work(work),
|
|
|
|
- struct rxrpc_net, client_conn_reaper);
|
|
|
|
|
|
+ container_of(work, struct rxrpc_net, client_conn_reaper);
|
|
unsigned long expiry, conn_expires_at, now;
|
|
unsigned long expiry, conn_expires_at, now;
|
|
unsigned int nr_conns;
|
|
unsigned int nr_conns;
|
|
bool did_discard = false;
|
|
bool did_discard = false;
|
|
@@ -1116,9 +1125,8 @@ not_yet_expired:
|
|
*/
|
|
*/
|
|
_debug("not yet");
|
|
_debug("not yet");
|
|
if (!rxnet->kill_all_client_conns)
|
|
if (!rxnet->kill_all_client_conns)
|
|
- queue_delayed_work(rxrpc_workqueue,
|
|
|
|
- &rxnet->client_conn_reaper,
|
|
|
|
- conn_expires_at - now);
|
|
|
|
|
|
+ timer_reduce(&rxnet->client_conn_reap_timer,
|
|
|
|
+ conn_expires_at);
|
|
|
|
|
|
out:
|
|
out:
|
|
spin_unlock(&rxnet->client_conn_cache_lock);
|
|
spin_unlock(&rxnet->client_conn_cache_lock);
|
|
@@ -1138,9 +1146,9 @@ void rxrpc_destroy_all_client_connections(struct rxrpc_net *rxnet)
|
|
rxnet->kill_all_client_conns = true;
|
|
rxnet->kill_all_client_conns = true;
|
|
spin_unlock(&rxnet->client_conn_cache_lock);
|
|
spin_unlock(&rxnet->client_conn_cache_lock);
|
|
|
|
|
|
- cancel_delayed_work(&rxnet->client_conn_reaper);
|
|
|
|
|
|
+ del_timer_sync(&rxnet->client_conn_reap_timer);
|
|
|
|
|
|
- if (!queue_delayed_work(rxrpc_workqueue, &rxnet->client_conn_reaper, 0))
|
|
|
|
|
|
+ if (!rxrpc_queue_work(&rxnet->client_conn_reaper))
|
|
_debug("destroy: queue failed");
|
|
_debug("destroy: queue failed");
|
|
|
|
|
|
_leave("");
|
|
_leave("");
|