Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rps: optimize rps_get_cpu()

optimize rps_get_cpu().

don't initialize ports when we can get the ports. one memory access
for ports than two.

Signed-off-by: Changli Gao <xiaosuo@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Changli Gao and committed by
David S. Miller
8c52d509 bf73130d

+11 -13
+11 -13
net/core/dev.c
··· 2229 2229 int cpu = -1; 2230 2230 u8 ip_proto; 2231 2231 u16 tcpu; 2232 - u32 addr1, addr2, ports, ihl; 2232 + u32 addr1, addr2, ihl; 2233 + union { 2234 + u32 v32; 2235 + u16 v16[2]; 2236 + } ports; 2233 2237 2234 2238 if (skb_rx_queue_recorded(skb)) { 2235 2239 u16 index = skb_get_rx_queue(skb); ··· 2279 2275 default: 2280 2276 goto done; 2281 2277 } 2282 - ports = 0; 2283 2278 switch (ip_proto) { 2284 2279 case IPPROTO_TCP: 2285 2280 case IPPROTO_UDP: ··· 2288 2285 case IPPROTO_SCTP: 2289 2286 case IPPROTO_UDPLITE: 2290 2287 if (pskb_may_pull(skb, (ihl * 4) + 4)) { 2291 - __be16 *hports = (__be16 *) (skb->data + (ihl * 4)); 2292 - u32 sport, dport; 2293 - 2294 - sport = (__force u16) hports[0]; 2295 - dport = (__force u16) hports[1]; 2296 - if (dport < sport) 2297 - swap(sport, dport); 2298 - ports = (sport << 16) + dport; 2288 + ports.v32 = * (__force u32 *) (skb->data + (ihl * 4)); 2289 + if (ports.v16[1] < ports.v16[0]) 2290 + swap(ports.v16[0], ports.v16[1]); 2291 + break; 2299 2292 } 2300 - break; 2301 - 2302 2293 default: 2294 + ports.v32 = 0; 2303 2295 break; 2304 2296 } 2305 2297 2306 2298 /* get a consistent hash (same value on both flow directions) */ 2307 2299 if (addr2 < addr1) 2308 2300 swap(addr1, addr2); 2309 - skb->rxhash = jhash_3words(addr1, addr2, ports, hashrnd); 2301 + skb->rxhash = jhash_3words(addr1, addr2, ports.v32, hashrnd); 2310 2302 if (!skb->rxhash) 2311 2303 skb->rxhash = 1; 2312 2304