sctp: add support for RPS and RFS
authorMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Tue, 12 Apr 2016 21:11:31 +0000 (18:11 -0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 15 Apr 2016 01:40:24 +0000 (21:40 -0400)
This patch adds what's missing to properly support RPS and RFS on SCTP,
as some of it is already implemented in common calls.

Having support for RPS and RFS allows better scaling specially because
not all NICs support hashing SCTP headers.

Save the hash right when we dequeue a skb from inqueue so we do it only
once per skb instead of per chunk. New sockets will then inherit the
hash through sctp_copy_sock().

Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sctp/inqueue.c
net/sctp/socket.c

index 7e8a16c..b335ffc 100644 (file)
@@ -163,6 +163,9 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
                chunk->singleton = 1;
                ch = (sctp_chunkhdr_t *) chunk->skb->data;
                chunk->data_accepted = 0;
+
+               if (chunk->asoc)
+                       sock_rps_save_rxhash(chunk->asoc->base.sk, chunk->skb);
        }
 
        chunk->chunk_hdr = ch;
index 878d28e..36697f8 100644 (file)
@@ -6430,6 +6430,8 @@ unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
 
        poll_wait(file, sk_sleep(sk), wait);
 
+       sock_rps_record_flow(sk);
+
        /* A TCP-style listening socket becomes readable when the accept queue
         * is not empty.
         */
@@ -7186,6 +7188,7 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
        newsk->sk_lingertime = sk->sk_lingertime;
        newsk->sk_rcvtimeo = sk->sk_rcvtimeo;
        newsk->sk_sndtimeo = sk->sk_sndtimeo;
+       newsk->sk_rxhash = sk->sk_rxhash;
 
        newinet = inet_sk(newsk);