diff options
| -rw-r--r-- | Documentation/devicetree/bindings/net/ethernet.txt | 2 | ||||
| -rw-r--r-- | arch/x86/net/bpf_jit_comp32.c | 236 | ||||
| -rw-r--r-- | drivers/isdn/gigaset/bas-gigaset.c | 9 | ||||
| -rw-r--r-- | drivers/net/ethernet/amazon/ena/ena_com.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/amazon/ena/ena_ethtool.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/amazon/ena/ena_netdev.c | 28 | ||||
| -rw-r--r-- | drivers/net/ethernet/cadence/macb_main.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 15 | ||||
| -rw-r--r-- | drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/freescale/ucc_geth_ethtool.c | 8 | ||||
| -rw-r--r-- | drivers/net/hyperv/netvsc.c | 15 | ||||
| -rw-r--r-- | drivers/net/phy/phy_device.c | 11 | ||||
| -rw-r--r-- | include/net/arp.h | 8 | ||||
| -rw-r--r-- | include/net/ipv6_frag.h | 1 | ||||
| -rw-r--r-- | net/core/neighbour.c | 11 | ||||
| -rw-r--r-- | net/dsa/dsa.c | 7 | ||||
| -rw-r--r-- | net/ipv4/ipmr_base.c | 3 | ||||
| -rw-r--r-- | net/ipv6/sit.c | 2 | ||||
| -rw-r--r-- | net/l2tp/l2tp_core.c | 3 | ||||
| -rw-r--r-- | net/rds/tcp.c | 2 | ||||
| -rw-r--r-- | net/sched/cls_cgroup.c | 2 | ||||
| -rw-r--r-- | net/sched/cls_matchall.c | 3 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/verifier/jit.c | 19 |
23 files changed, 293 insertions, 115 deletions
diff --git a/Documentation/devicetree/bindings/net/ethernet.txt b/Documentation/devicetree/bindings/net/ethernet.txt index 699244428a28..e88c3641d613 100644 --- a/Documentation/devicetree/bindings/net/ethernet.txt +++ b/Documentation/devicetree/bindings/net/ethernet.txt | |||
| @@ -38,7 +38,7 @@ Documentation/devicetree/bindings/phy/phy-bindings.txt. | |||
| 38 | * "smii" | 38 | * "smii" |
| 39 | * "xgmii" | 39 | * "xgmii" |
| 40 | * "trgmii" | 40 | * "trgmii" |
| 41 | * "2000base-x", | 41 | * "1000base-x", |
| 42 | * "2500base-x", | 42 | * "2500base-x", |
| 43 | * "rxaui" | 43 | * "rxaui" |
| 44 | * "xaui" | 44 | * "xaui" |
diff --git a/arch/x86/net/bpf_jit_comp32.c b/arch/x86/net/bpf_jit_comp32.c index 0d9cdffce6ac..b29e82f190c7 100644 --- a/arch/x86/net/bpf_jit_comp32.c +++ b/arch/x86/net/bpf_jit_comp32.c | |||
| @@ -117,6 +117,8 @@ static bool is_simm32(s64 value) | |||
| 117 | #define IA32_JLE 0x7E | 117 | #define IA32_JLE 0x7E |
| 118 | #define IA32_JG 0x7F | 118 | #define IA32_JG 0x7F |
| 119 | 119 | ||
| 120 | #define COND_JMP_OPCODE_INVALID (0xFF) | ||
| 121 | |||
| 120 | /* | 122 | /* |
| 121 | * Map eBPF registers to IA32 32bit registers or stack scratch space. | 123 | * Map eBPF registers to IA32 32bit registers or stack scratch space. |
| 122 | * | 124 | * |
| @@ -698,19 +700,12 @@ static inline void emit_ia32_neg64(const u8 dst[], bool dstk, u8 **pprog) | |||
| 698 | STACK_VAR(dst_hi)); | 700 | STACK_VAR(dst_hi)); |
| 699 | } | 701 | } |
| 700 | 702 | ||
| 701 | /* xor ecx,ecx */ | 703 | /* neg dreg_lo */ |
| 702 | EMIT2(0x31, add_2reg(0xC0, IA32_ECX, IA32_ECX)); | 704 | EMIT2(0xF7, add_1reg(0xD8, dreg_lo)); |
| 703 | /* sub dreg_lo,ecx */ | 705 | /* adc dreg_hi,0x0 */ |
| 704 | EMIT2(0x2B, add_2reg(0xC0, dreg_lo, IA32_ECX)); | 706 | EMIT3(0x83, add_1reg(0xD0, dreg_hi), 0x00); |
| 705 | /* mov dreg_lo,ecx */ | 707 | /* neg dreg_hi */ |
| 706 | EMIT2(0x89, add_2reg(0xC0, dreg_lo, IA32_ECX)); | 708 | EMIT2(0xF7, add_1reg(0xD8, dreg_hi)); |
| 707 | |||
| 708 | /* xor ecx,ecx */ | ||
| 709 | EMIT2(0x31, add_2reg(0xC0, IA32_ECX, IA32_ECX)); | ||
| 710 | /* sbb dreg_hi,ecx */ | ||
| 711 | EMIT2(0x19, add_2reg(0xC0, dreg_hi, IA32_ECX)); | ||
| 712 | /* mov dreg_hi,ecx */ | ||
| 713 | EMIT2(0x89, add_2reg(0xC0, dreg_hi, IA32_ECX)); | ||
| 714 | 709 | ||
| 715 | if (dstk) { | 710 | if (dstk) { |
| 716 | /* mov dword ptr [ebp+off],dreg_lo */ | 711 | /* mov dword ptr [ebp+off],dreg_lo */ |
| @@ -1613,6 +1608,75 @@ static inline void emit_push_r64(const u8 src[], u8 **pprog) | |||
| 1613 | *pprog = prog; | 1608 | *pprog = prog; |
| 1614 | } | 1609 | } |
| 1615 | 1610 | ||
| 1611 | static u8 get_cond_jmp_opcode(const u8 op, bool is_cmp_lo) | ||
| 1612 | { | ||
| 1613 | u8 jmp_cond; | ||
| 1614 | |||
| 1615 | /* Convert BPF opcode to x86 */ | ||
| 1616 | switch (op) { | ||
| 1617 | case BPF_JEQ: | ||
| 1618 | jmp_cond = IA32_JE; | ||
| 1619 | break; | ||
| 1620 | case BPF_JSET: | ||
| 1621 | case BPF_JNE: | ||
| 1622 | jmp_cond = IA32_JNE; | ||
| 1623 | break; | ||
| 1624 | case BPF_JGT: | ||
| 1625 | /* GT is unsigned '>', JA in x86 */ | ||
| 1626 | jmp_cond = IA32_JA; | ||
| 1627 | break; | ||
| 1628 | case BPF_JLT: | ||
| 1629 | /* LT is unsigned '<', JB in x86 */ | ||
| 1630 | jmp_cond = IA32_JB; | ||
| 1631 | break; | ||
| 1632 | case BPF_JGE: | ||
| 1633 | /* GE is unsigned '>=', JAE in x86 */ | ||
| 1634 | jmp_cond = IA32_JAE; | ||
| 1635 | break; | ||
| 1636 | case BPF_JLE: | ||
| 1637 | /* LE is unsigned '<=', JBE in x86 */ | ||
| 1638 | jmp_cond = IA32_JBE; | ||
| 1639 | break; | ||
| 1640 | case BPF_JSGT: | ||
| 1641 | if (!is_cmp_lo) | ||
| 1642 | /* Signed '>', GT in x86 */ | ||
| 1643 | jmp_cond = IA32_JG; | ||
| 1644 | else | ||
| 1645 | /* GT is unsigned '>', JA in x86 */ | ||
| 1646 | jmp_cond = IA32_JA; | ||
| 1647 | break; | ||
| 1648 | case BPF_JSLT: | ||
| 1649 | if (!is_cmp_lo) | ||
| 1650 | /* Signed '<', LT in x86 */ | ||
| 1651 | jmp_cond = IA32_JL; | ||
| 1652 | else | ||
| 1653 | /* LT is unsigned '<', JB in x86 */ | ||
| 1654 | jmp_cond = IA32_JB; | ||
| 1655 | break; | ||
| 1656 | case BPF_JSGE: | ||
| 1657 | if (!is_cmp_lo) | ||
| 1658 | /* Signed '>=', GE in x86 */ | ||
| 1659 | jmp_cond = IA32_JGE; | ||
| 1660 | else | ||
| 1661 | /* GE is unsigned '>=', JAE in x86 */ | ||
| 1662 | jmp_cond = IA32_JAE; | ||
| 1663 | break; | ||
| 1664 | case BPF_JSLE: | ||
| 1665 | if (!is_cmp_lo) | ||
| 1666 | /* Signed '<=', LE in x86 */ | ||
| 1667 | jmp_cond = IA32_JLE; | ||
| 1668 | else | ||
| 1669 | /* LE is unsigned '<=', JBE in x86 */ | ||
| 1670 | jmp_cond = IA32_JBE; | ||
| 1671 | break; | ||
| 1672 | default: /* to silence GCC warning */ | ||
| 1673 | jmp_cond = COND_JMP_OPCODE_INVALID; | ||
| 1674 | break; | ||
| 1675 | } | ||
| 1676 | |||
| 1677 | return jmp_cond; | ||
| 1678 | } | ||
| 1679 | |||
| 1616 | static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, | 1680 | static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, |
| 1617 | int oldproglen, struct jit_context *ctx) | 1681 | int oldproglen, struct jit_context *ctx) |
| 1618 | { | 1682 | { |
| @@ -2069,10 +2133,6 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, | |||
| 2069 | case BPF_JMP | BPF_JLT | BPF_X: | 2133 | case BPF_JMP | BPF_JLT | BPF_X: |
| 2070 | case BPF_JMP | BPF_JGE | BPF_X: | 2134 | case BPF_JMP | BPF_JGE | BPF_X: |
| 2071 | case BPF_JMP | BPF_JLE | BPF_X: | 2135 | case BPF_JMP | BPF_JLE | BPF_X: |
| 2072 | case BPF_JMP | BPF_JSGT | BPF_X: | ||
| 2073 | case BPF_JMP | BPF_JSLE | BPF_X: | ||
| 2074 | case BPF_JMP | BPF_JSLT | BPF_X: | ||
| 2075 | case BPF_JMP | BPF_JSGE | BPF_X: | ||
| 2076 | case BPF_JMP32 | BPF_JEQ | BPF_X: | 2136 | case BPF_JMP32 | BPF_JEQ | BPF_X: |
| 2077 | case BPF_JMP32 | BPF_JNE | BPF_X: | 2137 | case BPF_JMP32 | BPF_JNE | BPF_X: |
| 2078 | case BPF_JMP32 | BPF_JGT | BPF_X: | 2138 | case BPF_JMP32 | BPF_JGT | BPF_X: |
| @@ -2118,6 +2178,40 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, | |||
| 2118 | EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo)); | 2178 | EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo)); |
| 2119 | goto emit_cond_jmp; | 2179 | goto emit_cond_jmp; |
| 2120 | } | 2180 | } |
| 2181 | case BPF_JMP | BPF_JSGT | BPF_X: | ||
| 2182 | case BPF_JMP | BPF_JSLE | BPF_X: | ||
| 2183 | case BPF_JMP | BPF_JSLT | BPF_X: | ||
| 2184 | case BPF_JMP | BPF_JSGE | BPF_X: { | ||
| 2185 | u8 dreg_lo = dstk ? IA32_EAX : dst_lo; | ||
| 2186 | u8 dreg_hi = dstk ? IA32_EDX : dst_hi; | ||
| 2187 | u8 sreg_lo = sstk ? IA32_ECX : src_lo; | ||
| 2188 | u8 sreg_hi = sstk ? IA32_EBX : src_hi; | ||
| 2189 | |||
| 2190 | if (dstk) { | ||
| 2191 | EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), | ||
| 2192 | STACK_VAR(dst_lo)); | ||
| 2193 | EMIT3(0x8B, | ||
| 2194 | add_2reg(0x40, IA32_EBP, | ||
| 2195 | IA32_EDX), | ||
| 2196 | STACK_VAR(dst_hi)); | ||
| 2197 | } | ||
| 2198 | |||
| 2199 | if (sstk) { | ||
| 2200 | EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX), | ||
| 2201 | STACK_VAR(src_lo)); | ||
| 2202 | EMIT3(0x8B, | ||
| 2203 | add_2reg(0x40, IA32_EBP, | ||
| 2204 | IA32_EBX), | ||
| 2205 | STACK_VAR(src_hi)); | ||
| 2206 | } | ||
| 2207 | |||
| 2208 | /* cmp dreg_hi,sreg_hi */ | ||
| 2209 | EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi)); | ||
| 2210 | EMIT2(IA32_JNE, 10); | ||
| 2211 | /* cmp dreg_lo,sreg_lo */ | ||
| 2212 | EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo)); | ||
| 2213 | goto emit_cond_jmp_signed; | ||
| 2214 | } | ||
| 2121 | case BPF_JMP | BPF_JSET | BPF_X: | 2215 | case BPF_JMP | BPF_JSET | BPF_X: |
| 2122 | case BPF_JMP32 | BPF_JSET | BPF_X: { | 2216 | case BPF_JMP32 | BPF_JSET | BPF_X: { |
| 2123 | bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP; | 2217 | bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP; |
| @@ -2194,10 +2288,6 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, | |||
| 2194 | case BPF_JMP | BPF_JLT | BPF_K: | 2288 | case BPF_JMP | BPF_JLT | BPF_K: |
| 2195 | case BPF_JMP | BPF_JGE | BPF_K: | 2289 | case BPF_JMP | BPF_JGE | BPF_K: |
| 2196 | case BPF_JMP | BPF_JLE | BPF_K: | 2290 | case BPF_JMP | BPF_JLE | BPF_K: |
| 2197 | case BPF_JMP | BPF_JSGT | BPF_K: | ||
| 2198 | case BPF_JMP | BPF_JSLE | BPF_K: | ||
| 2199 | case BPF_JMP | BPF_JSLT | BPF_K: | ||
| 2200 | case BPF_JMP | BPF_JSGE | BPF_K: | ||
| 2201 | case BPF_JMP32 | BPF_JEQ | BPF_K: | 2291 | case BPF_JMP32 | BPF_JEQ | BPF_K: |
| 2202 | case BPF_JMP32 | BPF_JNE | BPF_K: | 2292 | case BPF_JMP32 | BPF_JNE | BPF_K: |
| 2203 | case BPF_JMP32 | BPF_JGT | BPF_K: | 2293 | case BPF_JMP32 | BPF_JGT | BPF_K: |
| @@ -2238,50 +2328,9 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, | |||
| 2238 | /* cmp dreg_lo,sreg_lo */ | 2328 | /* cmp dreg_lo,sreg_lo */ |
| 2239 | EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo)); | 2329 | EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo)); |
| 2240 | 2330 | ||
| 2241 | emit_cond_jmp: /* Convert BPF opcode to x86 */ | 2331 | emit_cond_jmp: jmp_cond = get_cond_jmp_opcode(BPF_OP(code), false); |
| 2242 | switch (BPF_OP(code)) { | 2332 | if (jmp_cond == COND_JMP_OPCODE_INVALID) |
| 2243 | case BPF_JEQ: | ||
| 2244 | jmp_cond = IA32_JE; | ||
| 2245 | break; | ||
| 2246 | case BPF_JSET: | ||
| 2247 | case BPF_JNE: | ||
| 2248 | jmp_cond = IA32_JNE; | ||
| 2249 | break; | ||
| 2250 | case BPF_JGT: | ||
| 2251 | /* GT is unsigned '>', JA in x86 */ | ||
| 2252 | jmp_cond = IA32_JA; | ||
| 2253 | break; | ||
| 2254 | case BPF_JLT: | ||
| 2255 | /* LT is unsigned '<', JB in x86 */ | ||
| 2256 | jmp_cond = IA32_JB; | ||
| 2257 | break; | ||
| 2258 | case BPF_JGE: | ||
| 2259 | /* GE is unsigned '>=', JAE in x86 */ | ||
| 2260 | jmp_cond = IA32_JAE; | ||
| 2261 | break; | ||
| 2262 | case BPF_JLE: | ||
| 2263 | /* LE is unsigned '<=', JBE in x86 */ | ||
| 2264 | jmp_cond = IA32_JBE; | ||
| 2265 | break; | ||
| 2266 | case BPF_JSGT: | ||
| 2267 | /* Signed '>', GT in x86 */ | ||
| 2268 | jmp_cond = IA32_JG; | ||
| 2269 | break; | ||
| 2270 | case BPF_JSLT: | ||
| 2271 | /* Signed '<', LT in x86 */ | ||
| 2272 | jmp_cond = IA32_JL; | ||
| 2273 | break; | ||
| 2274 | case BPF_JSGE: | ||
| 2275 | /* Signed '>=', GE in x86 */ | ||
| 2276 | jmp_cond = IA32_JGE; | ||
| 2277 | break; | ||
| 2278 | case BPF_JSLE: | ||
| 2279 | /* Signed '<=', LE in x86 */ | ||
| 2280 | jmp_cond = IA32_JLE; | ||
| 2281 | break; | ||
| 2282 | default: /* to silence GCC warning */ | ||
| 2283 | return -EFAULT; | 2333 | return -EFAULT; |
| 2284 | } | ||
| 2285 | jmp_offset = addrs[i + insn->off] - addrs[i]; | 2334 | jmp_offset = addrs[i + insn->off] - addrs[i]; |
| 2286 | if (is_imm8(jmp_offset)) { | 2335 | if (is_imm8(jmp_offset)) { |
| 2287 | EMIT2(jmp_cond, jmp_offset); | 2336 | EMIT2(jmp_cond, jmp_offset); |
| @@ -2291,7 +2340,66 @@ emit_cond_jmp: /* Convert BPF opcode to x86 */ | |||
| 2291 | pr_err("cond_jmp gen bug %llx\n", jmp_offset); | 2340 | pr_err("cond_jmp gen bug %llx\n", jmp_offset); |
| 2292 | return -EFAULT; | 2341 | return -EFAULT; |
| 2293 | } | 2342 | } |
| 2343 | break; | ||
| 2344 | } | ||
| 2345 | case BPF_JMP | BPF_JSGT | BPF_K: | ||
| 2346 | case BPF_JMP | BPF_JSLE | BPF_K: | ||
| 2347 | case BPF_JMP | BPF_JSLT | BPF_K: | ||
| 2348 | case BPF_JMP | BPF_JSGE | BPF_K: { | ||
| 2349 | u8 dreg_lo = dstk ? IA32_EAX : dst_lo; | ||
| 2350 | u8 dreg_hi = dstk ? IA32_EDX : dst_hi; | ||
| 2351 | u8 sreg_lo = IA32_ECX; | ||
| 2352 | u8 sreg_hi = IA32_EBX; | ||
| 2353 | u32 hi; | ||
| 2294 | 2354 | ||
| 2355 | if (dstk) { | ||
| 2356 | EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), | ||
| 2357 | STACK_VAR(dst_lo)); | ||
| 2358 | EMIT3(0x8B, | ||
| 2359 | add_2reg(0x40, IA32_EBP, | ||
| 2360 | IA32_EDX), | ||
| 2361 | STACK_VAR(dst_hi)); | ||
| 2362 | } | ||
| 2363 | |||
| 2364 | /* mov ecx,imm32 */ | ||
| 2365 | EMIT2_off32(0xC7, add_1reg(0xC0, IA32_ECX), imm32); | ||
| 2366 | hi = imm32 & (1 << 31) ? (u32)~0 : 0; | ||
| 2367 | /* mov ebx,imm32 */ | ||
| 2368 | EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EBX), hi); | ||
| 2369 | /* cmp dreg_hi,sreg_hi */ | ||
| 2370 | EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi)); | ||
| 2371 | EMIT2(IA32_JNE, 10); | ||
| 2372 | /* cmp dreg_lo,sreg_lo */ | ||
| 2373 | EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo)); | ||
| 2374 | |||
| 2375 | /* | ||
| 2376 | * For simplicity of branch offset computation, | ||
| 2377 | * let's use fixed jump coding here. | ||
| 2378 | */ | ||
| 2379 | emit_cond_jmp_signed: /* Check the condition for low 32-bit comparison */ | ||
| 2380 | jmp_cond = get_cond_jmp_opcode(BPF_OP(code), true); | ||
| 2381 | if (jmp_cond == COND_JMP_OPCODE_INVALID) | ||
| 2382 | return -EFAULT; | ||
| 2383 | jmp_offset = addrs[i + insn->off] - addrs[i] + 8; | ||
| 2384 | if (is_simm32(jmp_offset)) { | ||
| 2385 | EMIT2_off32(0x0F, jmp_cond + 0x10, jmp_offset); | ||
| 2386 | } else { | ||
| 2387 | pr_err("cond_jmp gen bug %llx\n", jmp_offset); | ||
| 2388 | return -EFAULT; | ||
| 2389 | } | ||
| 2390 | EMIT2(0xEB, 6); | ||
| 2391 | |||
| 2392 | /* Check the condition for high 32-bit comparison */ | ||
| 2393 | jmp_cond = get_cond_jmp_opcode(BPF_OP(code), false); | ||
| 2394 | if (jmp_cond == COND_JMP_OPCODE_INVALID) | ||
| 2395 | return -EFAULT; | ||
| 2396 | jmp_offset = addrs[i + insn->off] - addrs[i]; | ||
| 2397 | if (is_simm32(jmp_offset)) { | ||
| 2398 | EMIT2_off32(0x0F, jmp_cond + 0x10, jmp_offset); | ||
| 2399 | } else { | ||
| 2400 | pr_err("cond_jmp gen bug %llx\n", jmp_offset); | ||
| 2401 | return -EFAULT; | ||
| 2402 | } | ||
| 2295 | break; | 2403 | break; |
| 2296 | } | 2404 | } |
| 2297 | case BPF_JMP | BPF_JA: | 2405 | case BPF_JMP | BPF_JA: |
diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c index ecdeb89645d0..149b1aca52a2 100644 --- a/drivers/isdn/gigaset/bas-gigaset.c +++ b/drivers/isdn/gigaset/bas-gigaset.c | |||
| @@ -958,6 +958,7 @@ static void write_iso_callback(struct urb *urb) | |||
| 958 | */ | 958 | */ |
| 959 | static int starturbs(struct bc_state *bcs) | 959 | static int starturbs(struct bc_state *bcs) |
| 960 | { | 960 | { |
| 961 | struct usb_device *udev = bcs->cs->hw.bas->udev; | ||
| 961 | struct bas_bc_state *ubc = bcs->hw.bas; | 962 | struct bas_bc_state *ubc = bcs->hw.bas; |
| 962 | struct urb *urb; | 963 | struct urb *urb; |
| 963 | int j, k; | 964 | int j, k; |
| @@ -975,8 +976,8 @@ static int starturbs(struct bc_state *bcs) | |||
| 975 | rc = -EFAULT; | 976 | rc = -EFAULT; |
| 976 | goto error; | 977 | goto error; |
| 977 | } | 978 | } |
| 978 | usb_fill_int_urb(urb, bcs->cs->hw.bas->udev, | 979 | usb_fill_int_urb(urb, udev, |
| 979 | usb_rcvisocpipe(urb->dev, 3 + 2 * bcs->channel), | 980 | usb_rcvisocpipe(udev, 3 + 2 * bcs->channel), |
| 980 | ubc->isoinbuf + k * BAS_INBUFSIZE, | 981 | ubc->isoinbuf + k * BAS_INBUFSIZE, |
| 981 | BAS_INBUFSIZE, read_iso_callback, bcs, | 982 | BAS_INBUFSIZE, read_iso_callback, bcs, |
| 982 | BAS_FRAMETIME); | 983 | BAS_FRAMETIME); |
| @@ -1006,8 +1007,8 @@ static int starturbs(struct bc_state *bcs) | |||
| 1006 | rc = -EFAULT; | 1007 | rc = -EFAULT; |
| 1007 | goto error; | 1008 | goto error; |
| 1008 | } | 1009 | } |
| 1009 | usb_fill_int_urb(urb, bcs->cs->hw.bas->udev, | 1010 | usb_fill_int_urb(urb, udev, |
| 1010 | usb_sndisocpipe(urb->dev, 4 + 2 * bcs->channel), | 1011 | usb_sndisocpipe(udev, 4 + 2 * bcs->channel), |
| 1011 | ubc->isooutbuf->data, | 1012 | ubc->isooutbuf->data, |
| 1012 | sizeof(ubc->isooutbuf->data), | 1013 | sizeof(ubc->isooutbuf->data), |
| 1013 | write_iso_callback, &ubc->isoouturbs[k], | 1014 | write_iso_callback, &ubc->isoouturbs[k], |
diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c b/drivers/net/ethernet/amazon/ena/ena_com.c index b17d435de09f..4cdd8459c37e 100644 --- a/drivers/net/ethernet/amazon/ena/ena_com.c +++ b/drivers/net/ethernet/amazon/ena/ena_com.c | |||
| @@ -731,7 +731,7 @@ static int ena_com_config_llq_info(struct ena_com_dev *ena_dev, | |||
| 731 | if (rc) | 731 | if (rc) |
| 732 | pr_err("Cannot set LLQ configuration: %d\n", rc); | 732 | pr_err("Cannot set LLQ configuration: %d\n", rc); |
| 733 | 733 | ||
| 734 | return 0; | 734 | return rc; |
| 735 | } | 735 | } |
| 736 | 736 | ||
| 737 | static int ena_com_wait_and_process_admin_cq_interrupts(struct ena_comp_ctx *comp_ctx, | 737 | static int ena_com_wait_and_process_admin_cq_interrupts(struct ena_comp_ctx *comp_ctx, |
| @@ -2195,7 +2195,7 @@ int ena_com_set_hash_function(struct ena_com_dev *ena_dev) | |||
| 2195 | if (unlikely(ret)) | 2195 | if (unlikely(ret)) |
| 2196 | return ret; | 2196 | return ret; |
| 2197 | 2197 | ||
| 2198 | if (get_resp.u.flow_hash_func.supported_func & (1 << rss->hash_func)) { | 2198 | if (!(get_resp.u.flow_hash_func.supported_func & BIT(rss->hash_func))) { |
| 2199 | pr_err("Func hash %d isn't supported by device, abort\n", | 2199 | pr_err("Func hash %d isn't supported by device, abort\n", |
| 2200 | rss->hash_func); | 2200 | rss->hash_func); |
| 2201 | return -EOPNOTSUPP; | 2201 | return -EOPNOTSUPP; |
| @@ -2280,6 +2280,7 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev, | |||
| 2280 | return -EINVAL; | 2280 | return -EINVAL; |
| 2281 | } | 2281 | } |
| 2282 | 2282 | ||
| 2283 | rss->hash_func = func; | ||
| 2283 | rc = ena_com_set_hash_function(ena_dev); | 2284 | rc = ena_com_set_hash_function(ena_dev); |
| 2284 | 2285 | ||
| 2285 | /* Restore the old function */ | 2286 | /* Restore the old function */ |
| @@ -2802,7 +2803,11 @@ int ena_com_init_interrupt_moderation(struct ena_com_dev *ena_dev) | |||
| 2802 | /* if moderation is supported by device we set adaptive moderation */ | 2803 | /* if moderation is supported by device we set adaptive moderation */ |
| 2803 | delay_resolution = get_resp.u.intr_moderation.intr_delay_resolution; | 2804 | delay_resolution = get_resp.u.intr_moderation.intr_delay_resolution; |
| 2804 | ena_com_update_intr_delay_resolution(ena_dev, delay_resolution); | 2805 | ena_com_update_intr_delay_resolution(ena_dev, delay_resolution); |
| 2805 | ena_com_enable_adaptive_moderation(ena_dev); | 2806 | |
| 2807 | /* Disable adaptive moderation by default - can be enabled from | ||
| 2808 | * ethtool | ||
| 2809 | */ | ||
| 2810 | ena_com_disable_adaptive_moderation(ena_dev); | ||
| 2806 | 2811 | ||
| 2807 | return 0; | 2812 | return 0; |
| 2808 | err: | 2813 | err: |
diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/ethernet/amazon/ena/ena_ethtool.c index f3a5a384e6e8..fe596bc30a96 100644 --- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c +++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c | |||
| @@ -697,8 +697,8 @@ static int ena_set_rxfh(struct net_device *netdev, const u32 *indir, | |||
| 697 | if (indir) { | 697 | if (indir) { |
| 698 | for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) { | 698 | for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) { |
| 699 | rc = ena_com_indirect_table_fill_entry(ena_dev, | 699 | rc = ena_com_indirect_table_fill_entry(ena_dev, |
| 700 | ENA_IO_RXQ_IDX(indir[i]), | 700 | i, |
| 701 | i); | 701 | ENA_IO_RXQ_IDX(indir[i])); |
| 702 | if (unlikely(rc)) { | 702 | if (unlikely(rc)) { |
| 703 | netif_err(adapter, drv, netdev, | 703 | netif_err(adapter, drv, netdev, |
| 704 | "Cannot fill indirect table (index is too large)\n"); | 704 | "Cannot fill indirect table (index is too large)\n"); |
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c index 7e40d14682f7..9c83642922c7 100644 --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c | |||
| @@ -224,28 +224,23 @@ static int ena_setup_tx_resources(struct ena_adapter *adapter, int qid) | |||
| 224 | if (!tx_ring->tx_buffer_info) { | 224 | if (!tx_ring->tx_buffer_info) { |
| 225 | tx_ring->tx_buffer_info = vzalloc(size); | 225 | tx_ring->tx_buffer_info = vzalloc(size); |
| 226 | if (!tx_ring->tx_buffer_info) | 226 | if (!tx_ring->tx_buffer_info) |
| 227 | return -ENOMEM; | 227 | goto err_tx_buffer_info; |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | size = sizeof(u16) * tx_ring->ring_size; | 230 | size = sizeof(u16) * tx_ring->ring_size; |
| 231 | tx_ring->free_tx_ids = vzalloc_node(size, node); | 231 | tx_ring->free_tx_ids = vzalloc_node(size, node); |
| 232 | if (!tx_ring->free_tx_ids) { | 232 | if (!tx_ring->free_tx_ids) { |
| 233 | tx_ring->free_tx_ids = vzalloc(size); | 233 | tx_ring->free_tx_ids = vzalloc(size); |
| 234 | if (!tx_ring->free_tx_ids) { | 234 | if (!tx_ring->free_tx_ids) |
| 235 | vfree(tx_ring->tx_buffer_info); | 235 | goto err_free_tx_ids; |
| 236 | return -ENOMEM; | ||
| 237 | } | ||
| 238 | } | 236 | } |
| 239 | 237 | ||
| 240 | size = tx_ring->tx_max_header_size; | 238 | size = tx_ring->tx_max_header_size; |
| 241 | tx_ring->push_buf_intermediate_buf = vzalloc_node(size, node); | 239 | tx_ring->push_buf_intermediate_buf = vzalloc_node(size, node); |
| 242 | if (!tx_ring->push_buf_intermediate_buf) { | 240 | if (!tx_ring->push_buf_intermediate_buf) { |
| 243 | tx_ring->push_buf_intermediate_buf = vzalloc(size); | 241 | tx_ring->push_buf_intermediate_buf = vzalloc(size); |
| 244 | if (!tx_ring->push_buf_intermediate_buf) { | 242 | if (!tx_ring->push_buf_intermediate_buf) |
| 245 | vfree(tx_ring->tx_buffer_info); | 243 | goto err_push_buf_intermediate_buf; |
| 246 | vfree(tx_ring->free_tx_ids); | ||
| 247 | return -ENOMEM; | ||
| 248 | } | ||
| 249 | } | 244 | } |
| 250 | 245 | ||
| 251 | /* Req id ring for TX out of order completions */ | 246 | /* Req id ring for TX out of order completions */ |
| @@ -259,6 +254,15 @@ static int ena_setup_tx_resources(struct ena_adapter *adapter, int qid) | |||
| 259 | tx_ring->next_to_clean = 0; | 254 | tx_ring->next_to_clean = 0; |
| 260 | tx_ring->cpu = ena_irq->cpu; | 255 | tx_ring->cpu = ena_irq->cpu; |
| 261 | return 0; | 256 | return 0; |
| 257 | |||
| 258 | err_push_buf_intermediate_buf: | ||
| 259 | vfree(tx_ring->free_tx_ids); | ||
| 260 | tx_ring->free_tx_ids = NULL; | ||
| 261 | err_free_tx_ids: | ||
| 262 | vfree(tx_ring->tx_buffer_info); | ||
| 263 | tx_ring->tx_buffer_info = NULL; | ||
| 264 | err_tx_buffer_info: | ||
| 265 | return -ENOMEM; | ||
| 262 | } | 266 | } |
| 263 | 267 | ||
| 264 | /* ena_free_tx_resources - Free I/O Tx Resources per Queue | 268 | /* ena_free_tx_resources - Free I/O Tx Resources per Queue |
| @@ -378,6 +382,7 @@ static int ena_setup_rx_resources(struct ena_adapter *adapter, | |||
| 378 | rx_ring->free_rx_ids = vzalloc(size); | 382 | rx_ring->free_rx_ids = vzalloc(size); |
| 379 | if (!rx_ring->free_rx_ids) { | 383 | if (!rx_ring->free_rx_ids) { |
| 380 | vfree(rx_ring->rx_buffer_info); | 384 | vfree(rx_ring->rx_buffer_info); |
| 385 | rx_ring->rx_buffer_info = NULL; | ||
| 381 | return -ENOMEM; | 386 | return -ENOMEM; |
| 382 | } | 387 | } |
| 383 | } | 388 | } |
| @@ -1820,6 +1825,7 @@ err_setup_rx: | |||
| 1820 | err_setup_tx: | 1825 | err_setup_tx: |
| 1821 | ena_free_io_irq(adapter); | 1826 | ena_free_io_irq(adapter); |
| 1822 | err_req_irq: | 1827 | err_req_irq: |
| 1828 | ena_del_napi(adapter); | ||
| 1823 | 1829 | ||
| 1824 | return rc; | 1830 | return rc; |
| 1825 | } | 1831 | } |
| @@ -2291,7 +2297,7 @@ static void ena_config_host_info(struct ena_com_dev *ena_dev, | |||
| 2291 | host_info->bdf = (pdev->bus->number << 8) | pdev->devfn; | 2297 | host_info->bdf = (pdev->bus->number << 8) | pdev->devfn; |
| 2292 | host_info->os_type = ENA_ADMIN_OS_LINUX; | 2298 | host_info->os_type = ENA_ADMIN_OS_LINUX; |
| 2293 | host_info->kernel_ver = LINUX_VERSION_CODE; | 2299 | host_info->kernel_ver = LINUX_VERSION_CODE; |
| 2294 | strncpy(host_info->kernel_ver_str, utsname()->version, | 2300 | strlcpy(host_info->kernel_ver_str, utsname()->version, |
| 2295 | sizeof(host_info->kernel_ver_str) - 1); | 2301 | sizeof(host_info->kernel_ver_str) - 1); |
| 2296 | host_info->os_dist = 0; | 2302 | host_info->os_dist = 0; |
| 2297 | strncpy(host_info->os_dist_str, utsname()->release, | 2303 | strncpy(host_info->os_dist_str, utsname()->release, |
diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index 5d5c9d70b2be..c049410bc888 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c | |||
| @@ -2427,12 +2427,12 @@ static int macb_open(struct net_device *dev) | |||
| 2427 | goto pm_exit; | 2427 | goto pm_exit; |
| 2428 | } | 2428 | } |
| 2429 | 2429 | ||
| 2430 | bp->macbgem_ops.mog_init_rings(bp); | ||
| 2431 | macb_init_hw(bp); | ||
| 2432 | |||
| 2433 | for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) | 2430 | for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) |
| 2434 | napi_enable(&queue->napi); | 2431 | napi_enable(&queue->napi); |
| 2435 | 2432 | ||
| 2433 | bp->macbgem_ops.mog_init_rings(bp); | ||
| 2434 | macb_init_hw(bp); | ||
| 2435 | |||
| 2436 | /* schedule a link state check */ | 2436 | /* schedule a link state check */ |
| 2437 | phy_start(dev->phydev); | 2437 | phy_start(dev->phydev); |
| 2438 | 2438 | ||
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 7487852e6afa..715e4edcf4a2 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
| @@ -6160,15 +6160,24 @@ static int __init cxgb4_init_module(void) | |||
| 6160 | 6160 | ||
| 6161 | ret = pci_register_driver(&cxgb4_driver); | 6161 | ret = pci_register_driver(&cxgb4_driver); |
| 6162 | if (ret < 0) | 6162 | if (ret < 0) |
| 6163 | debugfs_remove(cxgb4_debugfs_root); | 6163 | goto err_pci; |
| 6164 | 6164 | ||
| 6165 | #if IS_ENABLED(CONFIG_IPV6) | 6165 | #if IS_ENABLED(CONFIG_IPV6) |
| 6166 | if (!inet6addr_registered) { | 6166 | if (!inet6addr_registered) { |
| 6167 | register_inet6addr_notifier(&cxgb4_inet6addr_notifier); | 6167 | ret = register_inet6addr_notifier(&cxgb4_inet6addr_notifier); |
| 6168 | inet6addr_registered = true; | 6168 | if (ret) |
| 6169 | pci_unregister_driver(&cxgb4_driver); | ||
| 6170 | else | ||
| 6171 | inet6addr_registered = true; | ||
| 6169 | } | 6172 | } |
| 6170 | #endif | 6173 | #endif |
| 6171 | 6174 | ||
| 6175 | if (ret == 0) | ||
| 6176 | return ret; | ||
| 6177 | |||
| 6178 | err_pci: | ||
| 6179 | debugfs_remove(cxgb4_debugfs_root); | ||
| 6180 | |||
| 6172 | return ret; | 6181 | return ret; |
| 6173 | } | 6182 | } |
| 6174 | 6183 | ||
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c index dfebc30c4841..d3f2408dc9e8 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | |||
| @@ -1648,7 +1648,7 @@ static struct sk_buff *dpaa_cleanup_tx_fd(const struct dpaa_priv *priv, | |||
| 1648 | qm_sg_entry_get_len(&sgt[0]), dma_dir); | 1648 | qm_sg_entry_get_len(&sgt[0]), dma_dir); |
| 1649 | 1649 | ||
| 1650 | /* remaining pages were mapped with skb_frag_dma_map() */ | 1650 | /* remaining pages were mapped with skb_frag_dma_map() */ |
| 1651 | for (i = 1; i < nr_frags; i++) { | 1651 | for (i = 1; i <= nr_frags; i++) { |
| 1652 | WARN_ON(qm_sg_entry_is_ext(&sgt[i])); | 1652 | WARN_ON(qm_sg_entry_is_ext(&sgt[i])); |
| 1653 | 1653 | ||
| 1654 | dma_unmap_page(dev, qm_sg_addr(&sgt[i]), | 1654 | dma_unmap_page(dev, qm_sg_addr(&sgt[i]), |
diff --git a/drivers/net/ethernet/freescale/ucc_geth_ethtool.c b/drivers/net/ethernet/freescale/ucc_geth_ethtool.c index 0beee2cc2ddd..722b6de24816 100644 --- a/drivers/net/ethernet/freescale/ucc_geth_ethtool.c +++ b/drivers/net/ethernet/freescale/ucc_geth_ethtool.c | |||
| @@ -252,14 +252,12 @@ uec_set_ringparam(struct net_device *netdev, | |||
| 252 | return -EINVAL; | 252 | return -EINVAL; |
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | if (netif_running(netdev)) | ||
| 256 | return -EBUSY; | ||
| 257 | |||
| 255 | ug_info->bdRingLenRx[queue] = ring->rx_pending; | 258 | ug_info->bdRingLenRx[queue] = ring->rx_pending; |
| 256 | ug_info->bdRingLenTx[queue] = ring->tx_pending; | 259 | ug_info->bdRingLenTx[queue] = ring->tx_pending; |
| 257 | 260 | ||
| 258 | if (netif_running(netdev)) { | ||
| 259 | /* FIXME: restart automatically */ | ||
| 260 | netdev_info(netdev, "Please re-open the interface\n"); | ||
| 261 | } | ||
| 262 | |||
| 263 | return ret; | 261 | return ret; |
| 264 | } | 262 | } |
| 265 | 263 | ||
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index fdbeb7070d42..ee198606854d 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c | |||
| @@ -875,12 +875,6 @@ static inline int netvsc_send_pkt( | |||
| 875 | } else if (ret == -EAGAIN) { | 875 | } else if (ret == -EAGAIN) { |
| 876 | netif_tx_stop_queue(txq); | 876 | netif_tx_stop_queue(txq); |
| 877 | ndev_ctx->eth_stats.stop_queue++; | 877 | ndev_ctx->eth_stats.stop_queue++; |
| 878 | if (atomic_read(&nvchan->queue_sends) < 1 && | ||
| 879 | !net_device->tx_disable) { | ||
| 880 | netif_tx_wake_queue(txq); | ||
| 881 | ndev_ctx->eth_stats.wake_queue++; | ||
| 882 | ret = -ENOSPC; | ||
| 883 | } | ||
| 884 | } else { | 878 | } else { |
| 885 | netdev_err(ndev, | 879 | netdev_err(ndev, |
| 886 | "Unable to send packet pages %u len %u, ret %d\n", | 880 | "Unable to send packet pages %u len %u, ret %d\n", |
| @@ -888,6 +882,15 @@ static inline int netvsc_send_pkt( | |||
| 888 | ret); | 882 | ret); |
| 889 | } | 883 | } |
| 890 | 884 | ||
| 885 | if (netif_tx_queue_stopped(txq) && | ||
| 886 | atomic_read(&nvchan->queue_sends) < 1 && | ||
| 887 | !net_device->tx_disable) { | ||
| 888 | netif_tx_wake_queue(txq); | ||
| 889 | ndev_ctx->eth_stats.wake_queue++; | ||
| 890 | if (ret == -EAGAIN) | ||
| 891 | ret = -ENOSPC; | ||
| 892 | } | ||
| 893 | |||
| 891 | return ret; | 894 | return ret; |
| 892 | } | 895 | } |
| 893 | 896 | ||
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 068ab750c9ce..dcc93a873174 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
| @@ -2116,11 +2116,14 @@ bool phy_validate_pause(struct phy_device *phydev, | |||
| 2116 | struct ethtool_pauseparam *pp) | 2116 | struct ethtool_pauseparam *pp) |
| 2117 | { | 2117 | { |
| 2118 | if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, | 2118 | if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
| 2119 | phydev->supported) || | 2119 | phydev->supported) && pp->rx_pause) |
| 2120 | (!linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
| 2121 | phydev->supported) && | ||
| 2122 | pp->rx_pause != pp->tx_pause)) | ||
| 2123 | return false; | 2120 | return false; |
| 2121 | |||
| 2122 | if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
| 2123 | phydev->supported) && | ||
| 2124 | pp->rx_pause != pp->tx_pause) | ||
| 2125 | return false; | ||
| 2126 | |||
| 2124 | return true; | 2127 | return true; |
| 2125 | } | 2128 | } |
| 2126 | EXPORT_SYMBOL(phy_validate_pause); | 2129 | EXPORT_SYMBOL(phy_validate_pause); |
diff --git a/include/net/arp.h b/include/net/arp.h index 977aabfcdc03..c8f580a0e6b1 100644 --- a/include/net/arp.h +++ b/include/net/arp.h | |||
| @@ -18,6 +18,7 @@ static inline u32 arp_hashfn(const void *pkey, const struct net_device *dev, u32 | |||
| 18 | return val * hash_rnd[0]; | 18 | return val * hash_rnd[0]; |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | #ifdef CONFIG_INET | ||
| 21 | static inline struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key) | 22 | static inline struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key) |
| 22 | { | 23 | { |
| 23 | if (dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) | 24 | if (dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) |
| @@ -25,6 +26,13 @@ static inline struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev | |||
| 25 | 26 | ||
| 26 | return ___neigh_lookup_noref(&arp_tbl, neigh_key_eq32, arp_hashfn, &key, dev); | 27 | return ___neigh_lookup_noref(&arp_tbl, neigh_key_eq32, arp_hashfn, &key, dev); |
| 27 | } | 28 | } |
| 29 | #else | ||
| 30 | static inline | ||
| 31 | struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key) | ||
| 32 | { | ||
| 33 | return NULL; | ||
| 34 | } | ||
| 35 | #endif | ||
| 28 | 36 | ||
| 29 | static inline struct neighbour *__ipv4_neigh_lookup(struct net_device *dev, u32 key) | 37 | static inline struct neighbour *__ipv4_neigh_lookup(struct net_device *dev, u32 key) |
| 30 | { | 38 | { |
diff --git a/include/net/ipv6_frag.h b/include/net/ipv6_frag.h index 28aa9b30aece..1f77fb4dc79d 100644 --- a/include/net/ipv6_frag.h +++ b/include/net/ipv6_frag.h | |||
| @@ -94,7 +94,6 @@ ip6frag_expire_frag_queue(struct net *net, struct frag_queue *fq) | |||
| 94 | goto out; | 94 | goto out; |
| 95 | 95 | ||
| 96 | head->dev = dev; | 96 | head->dev = dev; |
| 97 | skb_get(head); | ||
| 98 | spin_unlock(&fq->q.lock); | 97 | spin_unlock(&fq->q.lock); |
| 99 | 98 | ||
| 100 | icmpv6_send(head, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0); | 99 | icmpv6_send(head, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0); |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index e73bfc63e473..dfa871061f14 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/times.h> | 31 | #include <linux/times.h> |
| 32 | #include <net/net_namespace.h> | 32 | #include <net/net_namespace.h> |
| 33 | #include <net/neighbour.h> | 33 | #include <net/neighbour.h> |
| 34 | #include <net/arp.h> | ||
| 34 | #include <net/dst.h> | 35 | #include <net/dst.h> |
| 35 | #include <net/sock.h> | 36 | #include <net/sock.h> |
| 36 | #include <net/netevent.h> | 37 | #include <net/netevent.h> |
| @@ -663,6 +664,8 @@ out: | |||
| 663 | out_tbl_unlock: | 664 | out_tbl_unlock: |
| 664 | write_unlock_bh(&tbl->lock); | 665 | write_unlock_bh(&tbl->lock); |
| 665 | out_neigh_release: | 666 | out_neigh_release: |
| 667 | if (!exempt_from_gc) | ||
| 668 | atomic_dec(&tbl->gc_entries); | ||
| 666 | neigh_release(n); | 669 | neigh_release(n); |
| 667 | goto out; | 670 | goto out; |
| 668 | } | 671 | } |
| @@ -2990,7 +2993,13 @@ int neigh_xmit(int index, struct net_device *dev, | |||
| 2990 | if (!tbl) | 2993 | if (!tbl) |
| 2991 | goto out; | 2994 | goto out; |
| 2992 | rcu_read_lock_bh(); | 2995 | rcu_read_lock_bh(); |
| 2993 | neigh = __neigh_lookup_noref(tbl, addr, dev); | 2996 | if (index == NEIGH_ARP_TABLE) { |
| 2997 | u32 key = *((u32 *)addr); | ||
| 2998 | |||
| 2999 | neigh = __ipv4_neigh_lookup_noref(dev, key); | ||
| 3000 | } else { | ||
| 3001 | neigh = __neigh_lookup_noref(tbl, addr, dev); | ||
| 3002 | } | ||
| 2994 | if (!neigh) | 3003 | if (!neigh) |
| 2995 | neigh = __neigh_create(tbl, addr, dev, false); | 3004 | neigh = __neigh_create(tbl, addr, dev, false); |
| 2996 | err = PTR_ERR(neigh); | 3005 | err = PTR_ERR(neigh); |
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index 9e1fc0b08290..1fc782fab393 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c | |||
| @@ -344,7 +344,7 @@ static int __init dsa_init_module(void) | |||
| 344 | 344 | ||
| 345 | rc = dsa_slave_register_notifier(); | 345 | rc = dsa_slave_register_notifier(); |
| 346 | if (rc) | 346 | if (rc) |
| 347 | return rc; | 347 | goto register_notifier_fail; |
| 348 | 348 | ||
| 349 | dev_add_pack(&dsa_pack_type); | 349 | dev_add_pack(&dsa_pack_type); |
| 350 | 350 | ||
| @@ -352,6 +352,11 @@ static int __init dsa_init_module(void) | |||
| 352 | THIS_MODULE); | 352 | THIS_MODULE); |
| 353 | 353 | ||
| 354 | return 0; | 354 | return 0; |
| 355 | |||
| 356 | register_notifier_fail: | ||
| 357 | destroy_workqueue(dsa_owq); | ||
| 358 | |||
| 359 | return rc; | ||
| 355 | } | 360 | } |
| 356 | module_init(dsa_init_module); | 361 | module_init(dsa_init_module); |
| 357 | 362 | ||
diff --git a/net/ipv4/ipmr_base.c b/net/ipv4/ipmr_base.c index 278834d4babc..ea48bd15a575 100644 --- a/net/ipv4/ipmr_base.c +++ b/net/ipv4/ipmr_base.c | |||
| @@ -335,8 +335,6 @@ next_entry2: | |||
| 335 | } | 335 | } |
| 336 | spin_unlock_bh(lock); | 336 | spin_unlock_bh(lock); |
| 337 | err = 0; | 337 | err = 0; |
| 338 | e = 0; | ||
| 339 | |||
| 340 | out: | 338 | out: |
| 341 | cb->args[1] = e; | 339 | cb->args[1] = e; |
| 342 | return err; | 340 | return err; |
| @@ -374,6 +372,7 @@ int mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb, | |||
| 374 | err = mr_table_dump(mrt, skb, cb, fill, lock, filter); | 372 | err = mr_table_dump(mrt, skb, cb, fill, lock, filter); |
| 375 | if (err < 0) | 373 | if (err < 0) |
| 376 | break; | 374 | break; |
| 375 | cb->args[1] = 0; | ||
| 377 | next_table: | 376 | next_table: |
| 378 | t++; | 377 | t++; |
| 379 | } | 378 | } |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index b2109b74857d..971d60bf9640 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -1084,7 +1084,7 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev) | |||
| 1084 | if (!tdev && tunnel->parms.link) | 1084 | if (!tdev && tunnel->parms.link) |
| 1085 | tdev = __dev_get_by_index(tunnel->net, tunnel->parms.link); | 1085 | tdev = __dev_get_by_index(tunnel->net, tunnel->parms.link); |
| 1086 | 1086 | ||
| 1087 | if (tdev) { | 1087 | if (tdev && !netif_is_l3_master(tdev)) { |
| 1088 | int t_hlen = tunnel->hlen + sizeof(struct iphdr); | 1088 | int t_hlen = tunnel->hlen + sizeof(struct iphdr); |
| 1089 | 1089 | ||
| 1090 | dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr); | 1090 | dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr); |
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c index 52b5a2797c0c..e4dec03a19fe 100644 --- a/net/l2tp/l2tp_core.c +++ b/net/l2tp/l2tp_core.c | |||
| @@ -1735,7 +1735,8 @@ static __net_exit void l2tp_exit_net(struct net *net) | |||
| 1735 | } | 1735 | } |
| 1736 | rcu_read_unlock_bh(); | 1736 | rcu_read_unlock_bh(); |
| 1737 | 1737 | ||
| 1738 | flush_workqueue(l2tp_wq); | 1738 | if (l2tp_wq) |
| 1739 | flush_workqueue(l2tp_wq); | ||
| 1739 | rcu_barrier(); | 1740 | rcu_barrier(); |
| 1740 | 1741 | ||
| 1741 | for (hash = 0; hash < L2TP_HASH_SIZE_2; hash++) | 1742 | for (hash = 0; hash < L2TP_HASH_SIZE_2; hash++) |
diff --git a/net/rds/tcp.c b/net/rds/tcp.c index faf726e00e27..66121bc6f34e 100644 --- a/net/rds/tcp.c +++ b/net/rds/tcp.c | |||
| @@ -551,7 +551,7 @@ static __net_init int rds_tcp_init_net(struct net *net) | |||
| 551 | tbl = kmemdup(rds_tcp_sysctl_table, | 551 | tbl = kmemdup(rds_tcp_sysctl_table, |
| 552 | sizeof(rds_tcp_sysctl_table), GFP_KERNEL); | 552 | sizeof(rds_tcp_sysctl_table), GFP_KERNEL); |
| 553 | if (!tbl) { | 553 | if (!tbl) { |
| 554 | pr_warn("could not set allocate syctl table\n"); | 554 | pr_warn("could not set allocate sysctl table\n"); |
| 555 | return -ENOMEM; | 555 | return -ENOMEM; |
| 556 | } | 556 | } |
| 557 | rtn->ctl_table = tbl; | 557 | rtn->ctl_table = tbl; |
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c index 037d128c2851..35659127e5a3 100644 --- a/net/sched/cls_cgroup.c +++ b/net/sched/cls_cgroup.c | |||
| @@ -32,6 +32,8 @@ static int cls_cgroup_classify(struct sk_buff *skb, const struct tcf_proto *tp, | |||
| 32 | struct cls_cgroup_head *head = rcu_dereference_bh(tp->root); | 32 | struct cls_cgroup_head *head = rcu_dereference_bh(tp->root); |
| 33 | u32 classid = task_get_classid(skb); | 33 | u32 classid = task_get_classid(skb); |
| 34 | 34 | ||
| 35 | if (unlikely(!head)) | ||
| 36 | return -1; | ||
| 35 | if (!classid) | 37 | if (!classid) |
| 36 | return -1; | 38 | return -1; |
| 37 | if (!tcf_em_tree_match(skb, &head->ematches, NULL)) | 39 | if (!tcf_em_tree_match(skb, &head->ematches, NULL)) |
diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c index da916f39b719..1e98a517fb0b 100644 --- a/net/sched/cls_matchall.c +++ b/net/sched/cls_matchall.c | |||
| @@ -32,6 +32,9 @@ static int mall_classify(struct sk_buff *skb, const struct tcf_proto *tp, | |||
| 32 | { | 32 | { |
| 33 | struct cls_mall_head *head = rcu_dereference_bh(tp->root); | 33 | struct cls_mall_head *head = rcu_dereference_bh(tp->root); |
| 34 | 34 | ||
| 35 | if (unlikely(!head)) | ||
| 36 | return -1; | ||
| 37 | |||
| 35 | if (tc_skip_sw(head->flags)) | 38 | if (tc_skip_sw(head->flags)) |
| 36 | return -1; | 39 | return -1; |
| 37 | 40 | ||
diff --git a/tools/testing/selftests/bpf/verifier/jit.c b/tools/testing/selftests/bpf/verifier/jit.c index be488b4495a3..c33adf344fae 100644 --- a/tools/testing/selftests/bpf/verifier/jit.c +++ b/tools/testing/selftests/bpf/verifier/jit.c | |||
| @@ -86,3 +86,22 @@ | |||
| 86 | .result = ACCEPT, | 86 | .result = ACCEPT, |
| 87 | .retval = 2, | 87 | .retval = 2, |
| 88 | }, | 88 | }, |
| 89 | { | ||
| 90 | "jit: jsgt, jslt", | ||
| 91 | .insns = { | ||
| 92 | BPF_LD_IMM64(BPF_REG_1, 0x80000000ULL), | ||
| 93 | BPF_LD_IMM64(BPF_REG_2, 0x0ULL), | ||
| 94 | BPF_JMP_REG(BPF_JSGT, BPF_REG_1, BPF_REG_2, 2), | ||
| 95 | BPF_MOV64_IMM(BPF_REG_0, 1), | ||
| 96 | BPF_EXIT_INSN(), | ||
| 97 | |||
| 98 | BPF_JMP_REG(BPF_JSLT, BPF_REG_2, BPF_REG_1, 2), | ||
| 99 | BPF_MOV64_IMM(BPF_REG_0, 1), | ||
| 100 | BPF_EXIT_INSN(), | ||
| 101 | |||
| 102 | BPF_MOV64_IMM(BPF_REG_0, 2), | ||
| 103 | BPF_EXIT_INSN(), | ||
| 104 | }, | ||
| 105 | .result = ACCEPT, | ||
| 106 | .retval = 2, | ||
| 107 | }, | ||
