aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/net/ethernet.txt2
-rw-r--r--arch/x86/net/bpf_jit_comp32.c236
-rw-r--r--drivers/isdn/gigaset/bas-gigaset.c9
-rw-r--r--drivers/net/ethernet/amazon/ena/ena_com.c11
-rw-r--r--drivers/net/ethernet/amazon/ena/ena_ethtool.c4
-rw-r--r--drivers/net/ethernet/amazon/ena/ena_netdev.c28
-rw-r--r--drivers/net/ethernet/cadence/macb_main.c6
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c15
-rw-r--r--drivers/net/ethernet/freescale/dpaa/dpaa_eth.c2
-rw-r--r--drivers/net/ethernet/freescale/ucc_geth_ethtool.c8
-rw-r--r--drivers/net/hyperv/netvsc.c15
-rw-r--r--drivers/net/phy/phy_device.c11
-rw-r--r--include/net/arp.h8
-rw-r--r--include/net/ipv6_frag.h1
-rw-r--r--net/core/neighbour.c11
-rw-r--r--net/dsa/dsa.c7
-rw-r--r--net/ipv4/ipmr_base.c3
-rw-r--r--net/ipv6/sit.c2
-rw-r--r--net/l2tp/l2tp_core.c3
-rw-r--r--net/rds/tcp.c2
-rw-r--r--net/sched/cls_cgroup.c2
-rw-r--r--net/sched/cls_matchall.c3
-rw-r--r--tools/testing/selftests/bpf/verifier/jit.c19
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
1611static 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
1616static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, 1680static 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
2241emit_cond_jmp: /* Convert BPF opcode to x86 */ 2331emit_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 */
2379emit_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 */
959static int starturbs(struct bc_state *bcs) 959static 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
737static int ena_com_wait_and_process_admin_cq_interrupts(struct ena_comp_ctx *comp_ctx, 737static 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;
2808err: 2813err:
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
258err_push_buf_intermediate_buf:
259 vfree(tx_ring->free_tx_ids);
260 tx_ring->free_tx_ids = NULL;
261err_free_tx_ids:
262 vfree(tx_ring->tx_buffer_info);
263 tx_ring->tx_buffer_info = NULL;
264err_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:
1820err_setup_tx: 1825err_setup_tx:
1821 ena_free_io_irq(adapter); 1826 ena_free_io_irq(adapter);
1822err_req_irq: 1827err_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
6178err_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}
2126EXPORT_SYMBOL(phy_validate_pause); 2129EXPORT_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
21static inline struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key) 22static 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
30static inline
31struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key)
32{
33 return NULL;
34}
35#endif
28 36
29static inline struct neighbour *__ipv4_neigh_lookup(struct net_device *dev, u32 key) 37static 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:
663out_tbl_unlock: 664out_tbl_unlock:
664 write_unlock_bh(&tbl->lock); 665 write_unlock_bh(&tbl->lock);
665out_neigh_release: 666out_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
356register_notifier_fail:
357 destroy_workqueue(dsa_owq);
358
359 return rc;
355} 360}
356module_init(dsa_init_module); 361module_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
340out: 338out:
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;
377next_table: 376next_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},