diff options
-rw-r--r-- | arch/alpha/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/avr32/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/cris/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/frv/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/ia64/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/m32r/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/mips/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/mn10300/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/parisc/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/s390/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/sparc/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/xtensa/include/uapi/asm/socket.h | 2 | ||||
-rw-r--r-- | include/net/sock.h | 12 | ||||
-rw-r--r-- | include/uapi/asm-generic/socket.h | 2 | ||||
-rw-r--r-- | net/core/sock.c | 5 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 1 | ||||
-rw-r--r-- | net/ipv4/udp.c | 1 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 1 | ||||
-rw-r--r-- | net/ipv6/udp.c | 1 | ||||
-rw-r--r-- | net/sctp/ulpqueue.c | 5 |
21 files changed, 52 insertions, 2 deletions
diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h index 3de1394bcab8..e2fe0700b3b4 100644 --- a/arch/alpha/include/uapi/asm/socket.h +++ b/arch/alpha/include/uapi/asm/socket.h | |||
@@ -87,4 +87,6 @@ | |||
87 | 87 | ||
88 | #define SO_BPF_EXTENSIONS 48 | 88 | #define SO_BPF_EXTENSIONS 48 |
89 | 89 | ||
90 | #define SO_INCOMING_CPU 49 | ||
91 | |||
90 | #endif /* _UAPI_ASM_SOCKET_H */ | 92 | #endif /* _UAPI_ASM_SOCKET_H */ |
diff --git a/arch/avr32/include/uapi/asm/socket.h b/arch/avr32/include/uapi/asm/socket.h index 6e6cd159924b..92121b0f5b98 100644 --- a/arch/avr32/include/uapi/asm/socket.h +++ b/arch/avr32/include/uapi/asm/socket.h | |||
@@ -80,4 +80,6 @@ | |||
80 | 80 | ||
81 | #define SO_BPF_EXTENSIONS 48 | 81 | #define SO_BPF_EXTENSIONS 48 |
82 | 82 | ||
83 | #define SO_INCOMING_CPU 49 | ||
84 | |||
83 | #endif /* _UAPI__ASM_AVR32_SOCKET_H */ | 85 | #endif /* _UAPI__ASM_AVR32_SOCKET_H */ |
diff --git a/arch/cris/include/uapi/asm/socket.h b/arch/cris/include/uapi/asm/socket.h index ed94e5ed0a23..60f60f5b9b35 100644 --- a/arch/cris/include/uapi/asm/socket.h +++ b/arch/cris/include/uapi/asm/socket.h | |||
@@ -82,6 +82,8 @@ | |||
82 | 82 | ||
83 | #define SO_BPF_EXTENSIONS 48 | 83 | #define SO_BPF_EXTENSIONS 48 |
84 | 84 | ||
85 | #define SO_INCOMING_CPU 49 | ||
86 | |||
85 | #endif /* _ASM_SOCKET_H */ | 87 | #endif /* _ASM_SOCKET_H */ |
86 | 88 | ||
87 | 89 | ||
diff --git a/arch/frv/include/uapi/asm/socket.h b/arch/frv/include/uapi/asm/socket.h index ca2c6e6f31c6..2c6890209ea6 100644 --- a/arch/frv/include/uapi/asm/socket.h +++ b/arch/frv/include/uapi/asm/socket.h | |||
@@ -80,5 +80,7 @@ | |||
80 | 80 | ||
81 | #define SO_BPF_EXTENSIONS 48 | 81 | #define SO_BPF_EXTENSIONS 48 |
82 | 82 | ||
83 | #define SO_INCOMING_CPU 49 | ||
84 | |||
83 | #endif /* _ASM_SOCKET_H */ | 85 | #endif /* _ASM_SOCKET_H */ |
84 | 86 | ||
diff --git a/arch/ia64/include/uapi/asm/socket.h b/arch/ia64/include/uapi/asm/socket.h index a1b49bac7951..09a93fb566f6 100644 --- a/arch/ia64/include/uapi/asm/socket.h +++ b/arch/ia64/include/uapi/asm/socket.h | |||
@@ -89,4 +89,6 @@ | |||
89 | 89 | ||
90 | #define SO_BPF_EXTENSIONS 48 | 90 | #define SO_BPF_EXTENSIONS 48 |
91 | 91 | ||
92 | #define SO_INCOMING_CPU 49 | ||
93 | |||
92 | #endif /* _ASM_IA64_SOCKET_H */ | 94 | #endif /* _ASM_IA64_SOCKET_H */ |
diff --git a/arch/m32r/include/uapi/asm/socket.h b/arch/m32r/include/uapi/asm/socket.h index 6c9a24b3aefa..e8589819c274 100644 --- a/arch/m32r/include/uapi/asm/socket.h +++ b/arch/m32r/include/uapi/asm/socket.h | |||
@@ -80,4 +80,6 @@ | |||
80 | 80 | ||
81 | #define SO_BPF_EXTENSIONS 48 | 81 | #define SO_BPF_EXTENSIONS 48 |
82 | 82 | ||
83 | #define SO_INCOMING_CPU 49 | ||
84 | |||
83 | #endif /* _ASM_M32R_SOCKET_H */ | 85 | #endif /* _ASM_M32R_SOCKET_H */ |
diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h index a14baa218c76..2e9ee8c55a10 100644 --- a/arch/mips/include/uapi/asm/socket.h +++ b/arch/mips/include/uapi/asm/socket.h | |||
@@ -98,4 +98,6 @@ | |||
98 | 98 | ||
99 | #define SO_BPF_EXTENSIONS 48 | 99 | #define SO_BPF_EXTENSIONS 48 |
100 | 100 | ||
101 | #define SO_INCOMING_CPU 49 | ||
102 | |||
101 | #endif /* _UAPI_ASM_SOCKET_H */ | 103 | #endif /* _UAPI_ASM_SOCKET_H */ |
diff --git a/arch/mn10300/include/uapi/asm/socket.h b/arch/mn10300/include/uapi/asm/socket.h index 6aa3ce1854aa..f3492e8c9f70 100644 --- a/arch/mn10300/include/uapi/asm/socket.h +++ b/arch/mn10300/include/uapi/asm/socket.h | |||
@@ -80,4 +80,6 @@ | |||
80 | 80 | ||
81 | #define SO_BPF_EXTENSIONS 48 | 81 | #define SO_BPF_EXTENSIONS 48 |
82 | 82 | ||
83 | #define SO_INCOMING_CPU 49 | ||
84 | |||
83 | #endif /* _ASM_SOCKET_H */ | 85 | #endif /* _ASM_SOCKET_H */ |
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h index fe35ceacf0e7..7984a1cab3da 100644 --- a/arch/parisc/include/uapi/asm/socket.h +++ b/arch/parisc/include/uapi/asm/socket.h | |||
@@ -79,4 +79,6 @@ | |||
79 | 79 | ||
80 | #define SO_BPF_EXTENSIONS 0x4029 | 80 | #define SO_BPF_EXTENSIONS 0x4029 |
81 | 81 | ||
82 | #define SO_INCOMING_CPU 0x402A | ||
83 | |||
82 | #endif /* _UAPI_ASM_SOCKET_H */ | 84 | #endif /* _UAPI_ASM_SOCKET_H */ |
diff --git a/arch/powerpc/include/uapi/asm/socket.h b/arch/powerpc/include/uapi/asm/socket.h index a9c3e2e18c05..3474e4ef166d 100644 --- a/arch/powerpc/include/uapi/asm/socket.h +++ b/arch/powerpc/include/uapi/asm/socket.h | |||
@@ -87,4 +87,6 @@ | |||
87 | 87 | ||
88 | #define SO_BPF_EXTENSIONS 48 | 88 | #define SO_BPF_EXTENSIONS 48 |
89 | 89 | ||
90 | #define SO_INCOMING_CPU 49 | ||
91 | |||
90 | #endif /* _ASM_POWERPC_SOCKET_H */ | 92 | #endif /* _ASM_POWERPC_SOCKET_H */ |
diff --git a/arch/s390/include/uapi/asm/socket.h b/arch/s390/include/uapi/asm/socket.h index e031332096d7..8457636c33e1 100644 --- a/arch/s390/include/uapi/asm/socket.h +++ b/arch/s390/include/uapi/asm/socket.h | |||
@@ -86,4 +86,6 @@ | |||
86 | 86 | ||
87 | #define SO_BPF_EXTENSIONS 48 | 87 | #define SO_BPF_EXTENSIONS 48 |
88 | 88 | ||
89 | #define SO_INCOMING_CPU 49 | ||
90 | |||
89 | #endif /* _ASM_SOCKET_H */ | 91 | #endif /* _ASM_SOCKET_H */ |
diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h index 54d9608681b6..4a8003a94163 100644 --- a/arch/sparc/include/uapi/asm/socket.h +++ b/arch/sparc/include/uapi/asm/socket.h | |||
@@ -76,6 +76,8 @@ | |||
76 | 76 | ||
77 | #define SO_BPF_EXTENSIONS 0x0032 | 77 | #define SO_BPF_EXTENSIONS 0x0032 |
78 | 78 | ||
79 | #define SO_INCOMING_CPU 0x0033 | ||
80 | |||
79 | /* Security levels - as per NRL IPv6 - don't actually do anything */ | 81 | /* Security levels - as per NRL IPv6 - don't actually do anything */ |
80 | #define SO_SECURITY_AUTHENTICATION 0x5001 | 82 | #define SO_SECURITY_AUTHENTICATION 0x5001 |
81 | #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 | 83 | #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 |
diff --git a/arch/xtensa/include/uapi/asm/socket.h b/arch/xtensa/include/uapi/asm/socket.h index 39acec0cf0b1..c46f6a696849 100644 --- a/arch/xtensa/include/uapi/asm/socket.h +++ b/arch/xtensa/include/uapi/asm/socket.h | |||
@@ -91,4 +91,6 @@ | |||
91 | 91 | ||
92 | #define SO_BPF_EXTENSIONS 48 | 92 | #define SO_BPF_EXTENSIONS 48 |
93 | 93 | ||
94 | #define SO_INCOMING_CPU 49 | ||
95 | |||
94 | #endif /* _XTENSA_SOCKET_H */ | 96 | #endif /* _XTENSA_SOCKET_H */ |
diff --git a/include/net/sock.h b/include/net/sock.h index 6767d75ecb17..7789b59c0c40 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -273,6 +273,7 @@ struct cg_proto; | |||
273 | * @sk_rcvtimeo: %SO_RCVTIMEO setting | 273 | * @sk_rcvtimeo: %SO_RCVTIMEO setting |
274 | * @sk_sndtimeo: %SO_SNDTIMEO setting | 274 | * @sk_sndtimeo: %SO_SNDTIMEO setting |
275 | * @sk_rxhash: flow hash received from netif layer | 275 | * @sk_rxhash: flow hash received from netif layer |
276 | * @sk_incoming_cpu: record cpu processing incoming packets | ||
276 | * @sk_txhash: computed flow hash for use on transmit | 277 | * @sk_txhash: computed flow hash for use on transmit |
277 | * @sk_filter: socket filtering instructions | 278 | * @sk_filter: socket filtering instructions |
278 | * @sk_protinfo: private area, net family specific, when not using slab | 279 | * @sk_protinfo: private area, net family specific, when not using slab |
@@ -350,6 +351,12 @@ struct sock { | |||
350 | #ifdef CONFIG_RPS | 351 | #ifdef CONFIG_RPS |
351 | __u32 sk_rxhash; | 352 | __u32 sk_rxhash; |
352 | #endif | 353 | #endif |
354 | u16 sk_incoming_cpu; | ||
355 | /* 16bit hole | ||
356 | * Warned : sk_incoming_cpu can be set from softirq, | ||
357 | * Do not use this hole without fully understanding possible issues. | ||
358 | */ | ||
359 | |||
353 | __u32 sk_txhash; | 360 | __u32 sk_txhash; |
354 | #ifdef CONFIG_NET_RX_BUSY_POLL | 361 | #ifdef CONFIG_NET_RX_BUSY_POLL |
355 | unsigned int sk_napi_id; | 362 | unsigned int sk_napi_id; |
@@ -833,6 +840,11 @@ static inline int sk_backlog_rcv(struct sock *sk, struct sk_buff *skb) | |||
833 | return sk->sk_backlog_rcv(sk, skb); | 840 | return sk->sk_backlog_rcv(sk, skb); |
834 | } | 841 | } |
835 | 842 | ||
843 | static inline void sk_incoming_cpu_update(struct sock *sk) | ||
844 | { | ||
845 | sk->sk_incoming_cpu = raw_smp_processor_id(); | ||
846 | } | ||
847 | |||
836 | static inline void sock_rps_record_flow_hash(__u32 hash) | 848 | static inline void sock_rps_record_flow_hash(__u32 hash) |
837 | { | 849 | { |
838 | #ifdef CONFIG_RPS | 850 | #ifdef CONFIG_RPS |
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h index ea0796bdcf88..f541ccefd4ac 100644 --- a/include/uapi/asm-generic/socket.h +++ b/include/uapi/asm-generic/socket.h | |||
@@ -82,4 +82,6 @@ | |||
82 | 82 | ||
83 | #define SO_BPF_EXTENSIONS 48 | 83 | #define SO_BPF_EXTENSIONS 48 |
84 | 84 | ||
85 | #define SO_INCOMING_CPU 49 | ||
86 | |||
85 | #endif /* __ASM_GENERIC_SOCKET_H */ | 87 | #endif /* __ASM_GENERIC_SOCKET_H */ |
diff --git a/net/core/sock.c b/net/core/sock.c index ac56dd06c306..0725cf0cb685 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1213,6 +1213,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
1213 | v.val = sk->sk_max_pacing_rate; | 1213 | v.val = sk->sk_max_pacing_rate; |
1214 | break; | 1214 | break; |
1215 | 1215 | ||
1216 | case SO_INCOMING_CPU: | ||
1217 | v.val = sk->sk_incoming_cpu; | ||
1218 | break; | ||
1219 | |||
1216 | default: | 1220 | default: |
1217 | return -ENOPROTOOPT; | 1221 | return -ENOPROTOOPT; |
1218 | } | 1222 | } |
@@ -1517,6 +1521,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) | |||
1517 | 1521 | ||
1518 | newsk->sk_err = 0; | 1522 | newsk->sk_err = 0; |
1519 | newsk->sk_priority = 0; | 1523 | newsk->sk_priority = 0; |
1524 | newsk->sk_incoming_cpu = raw_smp_processor_id(); | ||
1520 | /* | 1525 | /* |
1521 | * Before updating sk_refcnt, we must commit prior changes to memory | 1526 | * Before updating sk_refcnt, we must commit prior changes to memory |
1522 | * (Documentation/RCU/rculist_nulls.txt for details) | 1527 | * (Documentation/RCU/rculist_nulls.txt for details) |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 8893598a4124..2c6a955fd5c3 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -1663,6 +1663,7 @@ process: | |||
1663 | if (sk_filter(sk, skb)) | 1663 | if (sk_filter(sk, skb)) |
1664 | goto discard_and_relse; | 1664 | goto discard_and_relse; |
1665 | 1665 | ||
1666 | sk_incoming_cpu_update(sk); | ||
1666 | skb->dev = NULL; | 1667 | skb->dev = NULL; |
1667 | 1668 | ||
1668 | bh_lock_sock_nested(sk); | 1669 | bh_lock_sock_nested(sk); |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 5d0fdca8e965..d13751685f44 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -1445,6 +1445,7 @@ static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
1445 | if (inet_sk(sk)->inet_daddr) { | 1445 | if (inet_sk(sk)->inet_daddr) { |
1446 | sock_rps_save_rxhash(sk, skb); | 1446 | sock_rps_save_rxhash(sk, skb); |
1447 | sk_mark_napi_id(sk, skb); | 1447 | sk_mark_napi_id(sk, skb); |
1448 | sk_incoming_cpu_update(sk); | ||
1448 | } | 1449 | } |
1449 | 1450 | ||
1450 | rc = sock_queue_rcv_skb(sk, skb); | 1451 | rc = sock_queue_rcv_skb(sk, skb); |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index fd8e50b380e7..1985b4933a6b 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1456,6 +1456,7 @@ process: | |||
1456 | if (sk_filter(sk, skb)) | 1456 | if (sk_filter(sk, skb)) |
1457 | goto discard_and_relse; | 1457 | goto discard_and_relse; |
1458 | 1458 | ||
1459 | sk_incoming_cpu_update(sk); | ||
1459 | skb->dev = NULL; | 1460 | skb->dev = NULL; |
1460 | 1461 | ||
1461 | bh_lock_sock_nested(sk); | 1462 | bh_lock_sock_nested(sk); |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index b756355e9739..d1fe36274906 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -577,6 +577,7 @@ static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
577 | if (!ipv6_addr_any(&sk->sk_v6_daddr)) { | 577 | if (!ipv6_addr_any(&sk->sk_v6_daddr)) { |
578 | sock_rps_save_rxhash(sk, skb); | 578 | sock_rps_save_rxhash(sk, skb); |
579 | sk_mark_napi_id(sk, skb); | 579 | sk_mark_napi_id(sk, skb); |
580 | sk_incoming_cpu_update(sk); | ||
580 | } | 581 | } |
581 | 582 | ||
582 | rc = sock_queue_rcv_skb(sk, skb); | 583 | rc = sock_queue_rcv_skb(sk, skb); |
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index d49dc2ed30ad..ce469d648ffb 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c | |||
@@ -205,9 +205,10 @@ int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) | |||
205 | if (sock_flag(sk, SOCK_DEAD) || (sk->sk_shutdown & RCV_SHUTDOWN)) | 205 | if (sock_flag(sk, SOCK_DEAD) || (sk->sk_shutdown & RCV_SHUTDOWN)) |
206 | goto out_free; | 206 | goto out_free; |
207 | 207 | ||
208 | if (!sctp_ulpevent_is_notification(event)) | 208 | if (!sctp_ulpevent_is_notification(event)) { |
209 | sk_mark_napi_id(sk, skb); | 209 | sk_mark_napi_id(sk, skb); |
210 | 210 | sk_incoming_cpu_update(sk); | |
211 | } | ||
211 | /* Check if the user wishes to receive this event. */ | 212 | /* Check if the user wishes to receive this event. */ |
212 | if (!sctp_ulpevent_is_enabled(event, &sctp_sk(sk)->subscribe)) | 213 | if (!sctp_ulpevent_is_enabled(event, &sctp_sk(sk)->subscribe)) |
213 | goto out_free; | 214 | goto out_free; |