Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next...
[cascardo/linux.git] / net / rxrpc / call_object.c
index 0df9d1a..364b42d 100644 (file)
 #include <net/af_rxrpc.h>
 #include "ar-internal.h"
 
-/*
- * Maximum lifetime of a call (in jiffies).
- */
-unsigned int rxrpc_max_call_lifetime = 60 * HZ;
-
 const char *const rxrpc_call_states[NR__RXRPC_CALL_STATES] = {
        [RXRPC_CALL_UNINITIALISED]              = "Uninit  ",
        [RXRPC_CALL_CLIENT_AWAIT_CONN]          = "ClWtConn",
@@ -77,7 +72,7 @@ static void rxrpc_call_timer_expired(unsigned long _call)
        _enter("%d", call->debug_id);
 
        if (call->state < RXRPC_CALL_COMPLETE)
-               rxrpc_queue_call(call);
+               rxrpc_set_timer(call, rxrpc_timer_expired, ktime_get_real());
 }
 
 /*
@@ -158,6 +153,14 @@ struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
        call->rx_winsize = rxrpc_rx_window_size;
        call->tx_winsize = 16;
        call->rx_expect_next = 1;
+
+       if (RXRPC_TX_SMSS > 2190)
+               call->cong_cwnd = 2;
+       else if (RXRPC_TX_SMSS > 1095)
+               call->cong_cwnd = 3;
+       else
+               call->cong_cwnd = 4;
+       call->cong_ssthresh = RXRPC_RXTX_BUFF_SIZE - 1;
        return call;
 
 nomem_2:
@@ -174,6 +177,7 @@ static struct rxrpc_call *rxrpc_alloc_client_call(struct sockaddr_rxrpc *srx,
                                                  gfp_t gfp)
 {
        struct rxrpc_call *call;
+       ktime_t now;
 
        _enter("");
 
@@ -182,6 +186,10 @@ static struct rxrpc_call *rxrpc_alloc_client_call(struct sockaddr_rxrpc *srx,
                return ERR_PTR(-ENOMEM);
        call->state = RXRPC_CALL_CLIENT_AWAIT_CONN;
        call->service_id = srx->srx_service;
+       call->tx_phase = true;
+       now = ktime_get_real();
+       call->acks_latest_ts = now;
+       call->cong_tstamp = now;
 
        _leave(" = %p", call);
        return call;
@@ -192,14 +200,14 @@ static struct rxrpc_call *rxrpc_alloc_client_call(struct sockaddr_rxrpc *srx,
  */
 static void rxrpc_start_call_timer(struct rxrpc_call *call)
 {
-       unsigned long expire_at;
+       ktime_t now = ktime_get_real(), expire_at;
 
-       expire_at = jiffies + rxrpc_max_call_lifetime;
+       expire_at = ktime_add_ms(now, rxrpc_max_call_lifetime);
        call->expire_at = expire_at;
        call->ack_at = expire_at;
        call->resend_at = expire_at;
-       call->timer.expires = expire_at;
-       add_timer(&call->timer);
+       call->timer.expires = jiffies + LONG_MAX / 2;
+       rxrpc_set_timer(call, rxrpc_timer_begin, now);
 }
 
 /*
@@ -322,6 +330,7 @@ void rxrpc_incoming_call(struct rxrpc_sock *rx,
        call->state             = RXRPC_CALL_SERVER_ACCEPTING;
        if (sp->hdr.securityIndex > 0)
                call->state     = RXRPC_CALL_SERVER_SECURING;
+       call->cong_tstamp       = skb->tstamp;
 
        /* Set the channel for this call.  We don't get channel_lock as we're
         * only defending against the data_ready handler (which we're called
@@ -458,7 +467,9 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
                rxrpc_disconnect_call(call);
 
        for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) {
-               rxrpc_free_skb(call->rxtx_buffer[i]);
+               rxrpc_free_skb(call->rxtx_buffer[i],
+                              (call->tx_phase ? rxrpc_skb_tx_cleaned :
+                               rxrpc_skb_rx_cleaned));
                call->rxtx_buffer[i] = NULL;
        }
 
@@ -479,8 +490,6 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx)
                                  struct rxrpc_call, accept_link);
                list_del(&call->accept_link);
                rxrpc_abort_call("SKR", call, 0, RX_CALL_DEAD, ECONNRESET);
-               rxrpc_send_call_packet(call, RXRPC_PACKET_TYPE_ABORT);
-               rxrpc_release_call(rx, call);
                rxrpc_put_call(call, rxrpc_call_put);
        }
 
@@ -554,9 +563,11 @@ void rxrpc_cleanup_call(struct rxrpc_call *call)
 
        /* Clean up the Rx/Tx buffer */
        for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++)
-               rxrpc_free_skb(call->rxtx_buffer[i]);
+               rxrpc_free_skb(call->rxtx_buffer[i],
+                              (call->tx_phase ? rxrpc_skb_tx_cleaned :
+                               rxrpc_skb_rx_cleaned));
 
-       rxrpc_free_skb(call->tx_pending);
+       rxrpc_free_skb(call->tx_pending, rxrpc_skb_tx_cleaned);
 
        call_rcu(&call->rcu, rxrpc_rcu_destroy_call);
 }