#define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _UAPI_ASM_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _UAPI__ASM_AVR32_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _ASM_SOCKET_H */
 
 
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _ASM_SOCKET_H */
 
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _ASM_IA64_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _ASM_M32R_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _UAPI_ASM_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _ASM_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      0x4029
 
+#define SO_INCOMING_CPU                0x402A
+
 #endif /* _UAPI_ASM_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _ASM_POWERPC_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _ASM_SOCKET_H */
 
 
 #define SO_BPF_EXTENSIONS      0x0032
 
+#define SO_INCOMING_CPU                0x0033
+
 /* Security levels - as per NRL IPv6 - don't actually do anything */
 #define SO_SECURITY_AUTHENTICATION             0x5001
 #define SO_SECURITY_ENCRYPTION_TRANSPORT       0x5002
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* _XTENSA_SOCKET_H */
 
   *    @sk_rcvtimeo: %SO_RCVTIMEO setting
   *    @sk_sndtimeo: %SO_SNDTIMEO setting
   *    @sk_rxhash: flow hash received from netif layer
+  *    @sk_incoming_cpu: record cpu processing incoming packets
   *    @sk_txhash: computed flow hash for use on transmit
   *    @sk_filter: socket filtering instructions
   *    @sk_protinfo: private area, net family specific, when not using slab
 #ifdef CONFIG_RPS
        __u32                   sk_rxhash;
 #endif
+       u16                     sk_incoming_cpu;
+       /* 16bit hole
+        * Warned : sk_incoming_cpu can be set from softirq,
+        * Do not use this hole without fully understanding possible issues.
+        */
+
        __u32                   sk_txhash;
 #ifdef CONFIG_NET_RX_BUSY_POLL
        unsigned int            sk_napi_id;
        return sk->sk_backlog_rcv(sk, skb);
 }
 
+static inline void sk_incoming_cpu_update(struct sock *sk)
+{
+       sk->sk_incoming_cpu = raw_smp_processor_id();
+}
+
 static inline void sock_rps_record_flow_hash(__u32 hash)
 {
 #ifdef CONFIG_RPS
 
 
 #define SO_BPF_EXTENSIONS      48
 
+#define SO_INCOMING_CPU                49
+
 #endif /* __ASM_GENERIC_SOCKET_H */
 
                v.val = sk->sk_max_pacing_rate;
                break;
 
+       case SO_INCOMING_CPU:
+               v.val = sk->sk_incoming_cpu;
+               break;
+
        default:
                return -ENOPROTOOPT;
        }
 
                newsk->sk_err      = 0;
                newsk->sk_priority = 0;
+               newsk->sk_incoming_cpu = raw_smp_processor_id();
                /*
                 * Before updating sk_refcnt, we must commit prior changes to memory
                 * (Documentation/RCU/rculist_nulls.txt for details)
 
        if (sk_filter(sk, skb))
                goto discard_and_relse;
 
+       sk_incoming_cpu_update(sk);
        skb->dev = NULL;
 
        bh_lock_sock_nested(sk);
 
        if (inet_sk(sk)->inet_daddr) {
                sock_rps_save_rxhash(sk, skb);
                sk_mark_napi_id(sk, skb);
+               sk_incoming_cpu_update(sk);
        }
 
        rc = sock_queue_rcv_skb(sk, skb);
 
        if (sk_filter(sk, skb))
                goto discard_and_relse;
 
+       sk_incoming_cpu_update(sk);
        skb->dev = NULL;
 
        bh_lock_sock_nested(sk);
 
        if (!ipv6_addr_any(&sk->sk_v6_daddr)) {
                sock_rps_save_rxhash(sk, skb);
                sk_mark_napi_id(sk, skb);
+               sk_incoming_cpu_update(sk);
        }
 
        rc = sock_queue_rcv_skb(sk, skb);
 
        if (sock_flag(sk, SOCK_DEAD) || (sk->sk_shutdown & RCV_SHUTDOWN))
                goto out_free;
 
-       if (!sctp_ulpevent_is_notification(event))
+       if (!sctp_ulpevent_is_notification(event)) {
                sk_mark_napi_id(sk, skb);
-
+               sk_incoming_cpu_update(sk);
+       }
        /* Check if the user wishes to receive this event.  */
        if (!sctp_ulpevent_is_enabled(event, &sctp_sk(sk)->subscribe))
                goto out_free;