commit: ddb238bad3d656c87ce631f39b83f6627f10802c Author: Alice Ferrazzi <alicef <AT> gentoo <DOT> org> AuthorDate: Tue Feb 13 13:19:35 2018 +0000 Commit: Alice Ferrazzi <alicef <AT> gentoo <DOT> org> CommitDate: Tue Feb 13 13:19:35 2018 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=ddb238ba
linux kernel 4.14.19 0000_README | 4 + 1017_linux-4.14.19.patch | 875 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 879 insertions(+) diff --git a/0000_README b/0000_README index a02a4f5..b7c928d 100644 --- a/0000_README +++ b/0000_README @@ -115,6 +115,10 @@ Patch: 1017_linux-4.14.18.patch From: http://www.kernel.org Desc: Linux 4.14.18 +Patch: 1018_linux-4.14.19.patch +From: http://www.kernel.org +Desc: Linux 4.14.19 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1017_linux-4.14.19.patch b/1017_linux-4.14.19.patch new file mode 100644 index 0000000..86964e7 --- /dev/null +++ b/1017_linux-4.14.19.patch @@ -0,0 +1,875 @@ +diff --git a/.gitignore b/.gitignore +index 0c39aa20b6ba..f6050b88e95b 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -7,38 +7,40 @@ + # command after changing this file, to see if there are + # any tracked files which get ignored after the change. + # +-# Normal rules ++# Normal rules (sorted alphabetically) + # + .* ++*.a ++*.bin ++*.bz2 ++*.c.[012]*.* ++*.dtb ++*.dtb.S ++*.dwo ++*.elf ++*.gcno ++*.gz ++*.i ++*.ko ++*.ll ++*.lst ++*.lz4 ++*.lzma ++*.lzo ++*.mod.c + *.o + *.o.* +-*.a ++*.order ++*.patch + *.s +-*.ko + *.so + *.so.dbg +-*.mod.c +-*.i +-*.lst ++*.su + *.symtypes +-*.order +-*.elf +-*.bin + *.tar +-*.gz +-*.bz2 +-*.lzma + *.xz +-*.lz4 +-*.lzo +-*.patch +-*.gcno +-*.ll +-modules.builtin + Module.symvers +-*.dwo +-*.su +-*.c.[012]*.* ++modules.builtin + + # + # Top-level generic files +@@ -53,6 +55,11 @@ Module.symvers + /System.map + /Module.markers + ++# ++# RPM spec file (make rpm-pkg) ++# ++/*.spec ++ + # + # Debian directory (make deb-pkg) + # +diff --git a/Makefile b/Makefile +index a69e5da9ed86..76a0b13623f4 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 14 +-SUBLEVEL = 18 ++SUBLEVEL = 19 + EXTRAVERSION = + NAME = Petit Gorille + +diff --git a/arch/arc/boot/.gitignore b/arch/arc/boot/.gitignore +index 5246969a20c5..c4c5fd529c25 100644 +--- a/arch/arc/boot/.gitignore ++++ b/arch/arc/boot/.gitignore +@@ -1,2 +1 @@ +-*.dtb* + uImage +diff --git a/arch/arm/boot/.gitignore b/arch/arm/boot/.gitignore +index 3c79f85975aa..ce1c5ff746e7 100644 +--- a/arch/arm/boot/.gitignore ++++ b/arch/arm/boot/.gitignore +@@ -3,4 +3,3 @@ zImage + xipImage + bootpImage + uImage +-*.dtb +diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c +index 0fcd82f01388..b8dc3b516f93 100644 +--- a/arch/arm/kernel/traps.c ++++ b/arch/arm/kernel/traps.c +@@ -790,7 +790,6 @@ void abort(void) + /* if that doesn't kill us, halt */ + panic("Oops failed to kill thread"); + } +-EXPORT_SYMBOL(abort); + + void __init trap_init(void) + { +diff --git a/arch/arm64/boot/dts/.gitignore b/arch/arm64/boot/dts/.gitignore +deleted file mode 100644 +index b60ed208c779..000000000000 +--- a/arch/arm64/boot/dts/.gitignore ++++ /dev/null +@@ -1 +0,0 @@ +-*.dtb +diff --git a/arch/m32r/kernel/traps.c b/arch/m32r/kernel/traps.c +index cb79fba79d43..b88a8dd14933 100644 +--- a/arch/m32r/kernel/traps.c ++++ b/arch/m32r/kernel/traps.c +@@ -122,7 +122,6 @@ void abort(void) + /* if that doesn't kill us, halt */ + panic("Oops failed to kill thread"); + } +-EXPORT_SYMBOL(abort); + + void __init trap_init(void) + { +diff --git a/arch/metag/boot/.gitignore b/arch/metag/boot/.gitignore +index 2d6c0c160884..6c662ddb909a 100644 +--- a/arch/metag/boot/.gitignore ++++ b/arch/metag/boot/.gitignore +@@ -1,4 +1,3 @@ + vmlinux* + uImage* + ramdisk.* +-*.dtb* +diff --git a/arch/microblaze/boot/.gitignore b/arch/microblaze/boot/.gitignore +index bf0459186027..679502d64a97 100644 +--- a/arch/microblaze/boot/.gitignore ++++ b/arch/microblaze/boot/.gitignore +@@ -1,3 +1,2 @@ +-*.dtb + linux.bin* + simpleImage.* +diff --git a/arch/mips/boot/.gitignore b/arch/mips/boot/.gitignore +index d3962cd5ce0c..a73d6e2c4f64 100644 +--- a/arch/mips/boot/.gitignore ++++ b/arch/mips/boot/.gitignore +@@ -5,4 +5,3 @@ zImage + zImage.tmp + calc_vmlinuz_load_addr + uImage +-*.dtb +diff --git a/arch/nios2/boot/.gitignore b/arch/nios2/boot/.gitignore +index 109279ca5a4d..64386a8dedd8 100644 +--- a/arch/nios2/boot/.gitignore ++++ b/arch/nios2/boot/.gitignore +@@ -1,2 +1 @@ +-*.dtb + vmImage +diff --git a/arch/powerpc/boot/.gitignore b/arch/powerpc/boot/.gitignore +index 84774ccba1c2..f92d0530ceb1 100644 +--- a/arch/powerpc/boot/.gitignore ++++ b/arch/powerpc/boot/.gitignore +@@ -18,7 +18,6 @@ otheros.bld + uImage + cuImage.* + dtbImage.* +-*.dtb + treeImage.* + vmlinux.strip + zImage +diff --git a/arch/unicore32/kernel/traps.c b/arch/unicore32/kernel/traps.c +index 5f25b39f04d4..c4ac6043ebb0 100644 +--- a/arch/unicore32/kernel/traps.c ++++ b/arch/unicore32/kernel/traps.c +@@ -298,7 +298,6 @@ void abort(void) + /* if that doesn't kill us, halt */ + panic("Oops failed to kill thread"); + } +-EXPORT_SYMBOL(abort); + + void __init trap_init(void) + { +diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c +index 21be0193d9dc..b034826a0b3b 100644 +--- a/arch/x86/kernel/alternative.c ++++ b/arch/x86/kernel/alternative.c +@@ -287,7 +287,7 @@ recompute_jump(struct alt_instr *a, u8 *orig_insn, u8 *repl_insn, u8 *insnbuf) + tgt_rip = next_rip + o_dspl; + n_dspl = tgt_rip - orig_insn; + +- DPRINTK("target RIP: %px, new_displ: 0x%x", tgt_rip, n_dspl); ++ DPRINTK("target RIP: %p, new_displ: 0x%x", tgt_rip, n_dspl); + + if (tgt_rip - orig_insn >= 0) { + if (n_dspl - 2 <= 127) +@@ -344,7 +344,7 @@ static void __init_or_module noinline optimize_nops(struct alt_instr *a, u8 *ins + add_nops(instr + (a->instrlen - a->padlen), a->padlen); + local_irq_restore(flags); + +- DUMP_BYTES(instr, a->instrlen, "%px: [%d:%d) optimized NOPs: ", ++ DUMP_BYTES(instr, a->instrlen, "%p: [%d:%d) optimized NOPs: ", + instr, a->instrlen - a->padlen, a->padlen); + } + +@@ -365,7 +365,7 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start, + u8 *instr, *replacement; + u8 insnbuf[MAX_PATCH_LEN]; + +- DPRINTK("alt table %px, -> %px", start, end); ++ DPRINTK("alt table %p -> %p", start, end); + /* + * The scan order should be from start to end. A later scanned + * alternative code can overwrite previously scanned alternative code. +@@ -389,14 +389,14 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start, + continue; + } + +- DPRINTK("feat: %d*32+%d, old: (%px len: %d), repl: (%px, len: %d), pad: %d", ++ DPRINTK("feat: %d*32+%d, old: (%p, len: %d), repl: (%p, len: %d), pad: %d", + a->cpuid >> 5, + a->cpuid & 0x1f, + instr, a->instrlen, + replacement, a->replacementlen, a->padlen); + +- DUMP_BYTES(instr, a->instrlen, "%px: old_insn: ", instr); +- DUMP_BYTES(replacement, a->replacementlen, "%px: rpl_insn: ", replacement); ++ DUMP_BYTES(instr, a->instrlen, "%p: old_insn: ", instr); ++ DUMP_BYTES(replacement, a->replacementlen, "%p: rpl_insn: ", replacement); + + memcpy(insnbuf, replacement, a->replacementlen); + insnbuf_sz = a->replacementlen; +@@ -422,7 +422,7 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start, + a->instrlen - a->replacementlen); + insnbuf_sz += a->instrlen - a->replacementlen; + } +- DUMP_BYTES(insnbuf, insnbuf_sz, "%px: final_insn: ", instr); ++ DUMP_BYTES(insnbuf, insnbuf_sz, "%p: final_insn: ", instr); + + text_poke_early(instr, insnbuf, insnbuf_sz); + } +diff --git a/arch/xtensa/boot/.gitignore b/arch/xtensa/boot/.gitignore +index be7655998b26..38177c7ebcab 100644 +--- a/arch/xtensa/boot/.gitignore ++++ b/arch/xtensa/boot/.gitignore +@@ -1,3 +1,2 @@ + uImage + zImage.redboot +-*.dtb +diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c +index f5f58a6eee5d..e339960dcac7 100644 +--- a/crypto/tcrypt.c ++++ b/crypto/tcrypt.c +@@ -221,11 +221,13 @@ static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE], + } + + sg_init_table(sg, np + 1); +- np--; ++ if (rem) ++ np--; + for (k = 0; k < np; k++) + sg_set_buf(&sg[k + 1], xbuf[k], PAGE_SIZE); + +- sg_set_buf(&sg[k + 1], xbuf[k], rem); ++ if (rem) ++ sg_set_buf(&sg[k + 1], xbuf[k], rem); + } + + static void test_aead_speed(const char *algo, int enc, unsigned int secs, +diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c +index 46768c056193..0c28d0b995cc 100644 +--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c ++++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c +@@ -115,3 +115,6 @@ struct mtk_vcodec_ctx *mtk_vcodec_get_curr_ctx(struct mtk_vcodec_dev *dev) + return ctx; + } + EXPORT_SYMBOL(mtk_vcodec_get_curr_ctx); ++ ++MODULE_LICENSE("GPL v2"); ++MODULE_DESCRIPTION("Mediatek video codec driver"); +diff --git a/drivers/media/platform/soc_camera/soc_scale_crop.c b/drivers/media/platform/soc_camera/soc_scale_crop.c +index 0116097c0c0f..092c73f24589 100644 +--- a/drivers/media/platform/soc_camera/soc_scale_crop.c ++++ b/drivers/media/platform/soc_camera/soc_scale_crop.c +@@ -419,3 +419,7 @@ void soc_camera_calc_client_output(struct soc_camera_device *icd, + mf->height = soc_camera_shift_scale(rect->height, shift, scale_v); + } + EXPORT_SYMBOL(soc_camera_calc_client_output); ++ ++MODULE_DESCRIPTION("soc-camera scaling-cropping functions"); ++MODULE_AUTHOR("Guennadi Liakhovetski <ker...@pengutronix.de>"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +index f7080d0ab874..46b0372dd032 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +@@ -3891,7 +3891,7 @@ static void qlcnic_83xx_flush_mbx_queue(struct qlcnic_adapter *adapter) + struct list_head *head = &mbx->cmd_q; + struct qlcnic_cmd_args *cmd = NULL; + +- spin_lock(&mbx->queue_lock); ++ spin_lock_bh(&mbx->queue_lock); + + while (!list_empty(head)) { + cmd = list_entry(head->next, struct qlcnic_cmd_args, list); +@@ -3902,7 +3902,7 @@ static void qlcnic_83xx_flush_mbx_queue(struct qlcnic_adapter *adapter) + qlcnic_83xx_notify_cmd_completion(adapter, cmd); + } + +- spin_unlock(&mbx->queue_lock); ++ spin_unlock_bh(&mbx->queue_lock); + } + + static int qlcnic_83xx_check_mbx_status(struct qlcnic_adapter *adapter) +@@ -3938,12 +3938,12 @@ static void qlcnic_83xx_dequeue_mbx_cmd(struct qlcnic_adapter *adapter, + { + struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; + +- spin_lock(&mbx->queue_lock); ++ spin_lock_bh(&mbx->queue_lock); + + list_del(&cmd->list); + mbx->num_cmds--; + +- spin_unlock(&mbx->queue_lock); ++ spin_unlock_bh(&mbx->queue_lock); + + qlcnic_83xx_notify_cmd_completion(adapter, cmd); + } +@@ -4008,7 +4008,7 @@ static int qlcnic_83xx_enqueue_mbx_cmd(struct qlcnic_adapter *adapter, + init_completion(&cmd->completion); + cmd->rsp_opcode = QLC_83XX_MBX_RESPONSE_UNKNOWN; + +- spin_lock(&mbx->queue_lock); ++ spin_lock_bh(&mbx->queue_lock); + + list_add_tail(&cmd->list, &mbx->cmd_q); + mbx->num_cmds++; +@@ -4016,7 +4016,7 @@ static int qlcnic_83xx_enqueue_mbx_cmd(struct qlcnic_adapter *adapter, + *timeout = cmd->total_cmds * QLC_83XX_MBX_TIMEOUT; + queue_work(mbx->work_q, &mbx->work); + +- spin_unlock(&mbx->queue_lock); ++ spin_unlock_bh(&mbx->queue_lock); + + return 0; + } +@@ -4112,15 +4112,15 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work) + mbx->rsp_status = QLC_83XX_MBX_RESPONSE_WAIT; + spin_unlock_irqrestore(&mbx->aen_lock, flags); + +- spin_lock(&mbx->queue_lock); ++ spin_lock_bh(&mbx->queue_lock); + + if (list_empty(head)) { +- spin_unlock(&mbx->queue_lock); ++ spin_unlock_bh(&mbx->queue_lock); + return; + } + cmd = list_entry(head->next, struct qlcnic_cmd_args, list); + +- spin_unlock(&mbx->queue_lock); ++ spin_unlock_bh(&mbx->queue_lock); + + mbx_ops->encode_cmd(adapter, cmd); + mbx_ops->nofity_fw(adapter, QLC_83XX_MBX_REQUEST); +diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c +index 958ff931e790..619a1b7281a0 100644 +--- a/drivers/net/ethernet/realtek/r8169.c ++++ b/drivers/net/ethernet/realtek/r8169.c +@@ -1388,7 +1388,7 @@ DECLARE_RTL_COND(rtl_ocp_tx_cond) + { + void __iomem *ioaddr = tp->mmio_addr; + +- return RTL_R8(IBISR0) & 0x02; ++ return RTL_R8(IBISR0) & 0x20; + } + + static void rtl8168ep_stop_cmac(struct rtl8169_private *tp) +@@ -1396,7 +1396,7 @@ static void rtl8168ep_stop_cmac(struct rtl8169_private *tp) + void __iomem *ioaddr = tp->mmio_addr; + + RTL_W8(IBCR2, RTL_R8(IBCR2) & ~0x01); +- rtl_msleep_loop_wait_low(tp, &rtl_ocp_tx_cond, 50, 2000); ++ rtl_msleep_loop_wait_high(tp, &rtl_ocp_tx_cond, 50, 2000); + RTL_W8(IBISR0, RTL_R8(IBISR0) | 0x20); + RTL_W8(IBCR0, RTL_R8(IBCR0) & ~0x01); + } +diff --git a/drivers/net/ethernet/rocker/rocker_main.c b/drivers/net/ethernet/rocker/rocker_main.c +index fc8f8bdf6579..056cb6093630 100644 +--- a/drivers/net/ethernet/rocker/rocker_main.c ++++ b/drivers/net/ethernet/rocker/rocker_main.c +@@ -2902,6 +2902,12 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id) + goto err_alloc_ordered_workqueue; + } + ++ err = rocker_probe_ports(rocker); ++ if (err) { ++ dev_err(&pdev->dev, "failed to probe ports\n"); ++ goto err_probe_ports; ++ } ++ + /* Only FIBs pointing to our own netdevs are programmed into + * the device, so no need to pass a callback. + */ +@@ -2918,22 +2924,16 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id) + + rocker->hw.id = rocker_read64(rocker, SWITCH_ID); + +- err = rocker_probe_ports(rocker); +- if (err) { +- dev_err(&pdev->dev, "failed to probe ports\n"); +- goto err_probe_ports; +- } +- + dev_info(&pdev->dev, "Rocker switch with id %*phN\n", + (int)sizeof(rocker->hw.id), &rocker->hw.id); + + return 0; + +-err_probe_ports: +- unregister_switchdev_notifier(&rocker_switchdev_notifier); + err_register_switchdev_notifier: + unregister_fib_notifier(&rocker->fib_nb); + err_register_fib_notifier: ++ rocker_remove_ports(rocker); ++err_probe_ports: + destroy_workqueue(rocker->rocker_owq); + err_alloc_ordered_workqueue: + free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_EVENT), rocker); +@@ -2961,9 +2961,9 @@ static void rocker_remove(struct pci_dev *pdev) + { + struct rocker *rocker = pci_get_drvdata(pdev); + +- rocker_remove_ports(rocker); + unregister_switchdev_notifier(&rocker_switchdev_notifier); + unregister_fib_notifier(&rocker->fib_nb); ++ rocker_remove_ports(rocker); + rocker_write32(rocker, CONTROL, ROCKER_CONTROL_RESET); + destroy_workqueue(rocker->rocker_owq); + free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_EVENT), rocker); +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 2092febfcb42..8d9f02b7a71f 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1243,6 +1243,7 @@ static const struct usb_device_id products[] = { + {QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ + {QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */ + {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */ ++ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0306, 4)}, /* Quectel EP06 Mini PCIe */ + + /* 4. Gobi 1000 devices */ + {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ +diff --git a/drivers/of/unittest-data/.gitignore b/drivers/of/unittest-data/.gitignore +deleted file mode 100644 +index 4b3cf8b16de2..000000000000 +--- a/drivers/of/unittest-data/.gitignore ++++ /dev/null +@@ -1,2 +0,0 @@ +-testcases.dtb +-testcases.dtb.S +diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c +index 5e7200f05873..c17ccb913fde 100644 +--- a/drivers/scsi/storvsc_drv.c ++++ b/drivers/scsi/storvsc_drv.c +@@ -1826,8 +1826,10 @@ static int storvsc_probe(struct hv_device *device, + fc_host_node_name(host) = stor_device->node_name; + fc_host_port_name(host) = stor_device->port_name; + stor_device->rport = fc_remote_port_add(host, 0, &ids); +- if (!stor_device->rport) ++ if (!stor_device->rport) { ++ ret = -ENOMEM; + goto err_out3; ++ } + } + #endif + return 0; +diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c +index bd15309ac5f1..082891dffd9d 100644 +--- a/drivers/vhost/net.c ++++ b/drivers/vhost/net.c +@@ -1212,6 +1212,7 @@ static long vhost_net_reset_owner(struct vhost_net *n) + } + vhost_net_stop(n, &tx_sock, &rx_sock); + vhost_net_flush(n); ++ vhost_dev_stop(&n->dev); + vhost_dev_reset_owner(&n->dev, umem); + vhost_net_vq_reset(n); + done: +diff --git a/kernel/exit.c b/kernel/exit.c +index f6cad39f35df..e3a08761eb40 100644 +--- a/kernel/exit.c ++++ b/kernel/exit.c +@@ -1755,3 +1755,12 @@ COMPAT_SYSCALL_DEFINE5(waitid, + return -EFAULT; + } + #endif ++ ++__weak void abort(void) ++{ ++ BUG(); ++ ++ /* if that doesn't kill us, halt */ ++ panic("Oops failed to kill thread"); ++} ++EXPORT_SYMBOL(abort); +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index 53f7c919b916..66e7efabf0a1 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -5828,6 +5828,20 @@ void mem_cgroup_sk_alloc(struct sock *sk) + if (!mem_cgroup_sockets_enabled) + return; + ++ /* ++ * Socket cloning can throw us here with sk_memcg already ++ * filled. It won't however, necessarily happen from ++ * process context. So the test for root memcg given ++ * the current task's memcg won't help us in this case. ++ * ++ * Respecting the original socket's memcg is a better ++ * decision in this case. ++ */ ++ if (sk->sk_memcg) { ++ css_get(&sk->sk_memcg->css); ++ return; ++ } ++ + rcu_read_lock(); + memcg = mem_cgroup_from_task(current); + if (memcg == root_mem_cgroup) +diff --git a/net/core/sock.c b/net/core/sock.c +index 415f441c63b9..beb1e299fed3 100644 +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -1677,16 +1677,13 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) + newsk->sk_dst_pending_confirm = 0; + newsk->sk_wmem_queued = 0; + newsk->sk_forward_alloc = 0; +- +- /* sk->sk_memcg will be populated at accept() time */ +- newsk->sk_memcg = NULL; +- + atomic_set(&newsk->sk_drops, 0); + newsk->sk_send_head = NULL; + newsk->sk_userlocks = sk->sk_userlocks & ~SOCK_BINDPORT_LOCK; + atomic_set(&newsk->sk_zckey, 0); + + sock_reset_flag(newsk, SOCK_DONE); ++ mem_cgroup_sk_alloc(newsk); + cgroup_sk_alloc(&newsk->sk_cgrp_data); + + rcu_read_lock(); +diff --git a/net/core/sock_reuseport.c b/net/core/sock_reuseport.c +index 5eeb1d20cc38..676092d7bd81 100644 +--- a/net/core/sock_reuseport.c ++++ b/net/core/sock_reuseport.c +@@ -94,6 +94,16 @@ static struct sock_reuseport *reuseport_grow(struct sock_reuseport *reuse) + return more_reuse; + } + ++static void reuseport_free_rcu(struct rcu_head *head) ++{ ++ struct sock_reuseport *reuse; ++ ++ reuse = container_of(head, struct sock_reuseport, rcu); ++ if (reuse->prog) ++ bpf_prog_destroy(reuse->prog); ++ kfree(reuse); ++} ++ + /** + * reuseport_add_sock - Add a socket to the reuseport group of another. + * @sk: New socket to add to the group. +@@ -102,7 +112,7 @@ static struct sock_reuseport *reuseport_grow(struct sock_reuseport *reuse) + */ + int reuseport_add_sock(struct sock *sk, struct sock *sk2) + { +- struct sock_reuseport *reuse; ++ struct sock_reuseport *old_reuse, *reuse; + + if (!rcu_access_pointer(sk2->sk_reuseport_cb)) { + int err = reuseport_alloc(sk2); +@@ -113,10 +123,13 @@ int reuseport_add_sock(struct sock *sk, struct sock *sk2) + + spin_lock_bh(&reuseport_lock); + reuse = rcu_dereference_protected(sk2->sk_reuseport_cb, +- lockdep_is_held(&reuseport_lock)), +- WARN_ONCE(rcu_dereference_protected(sk->sk_reuseport_cb, +- lockdep_is_held(&reuseport_lock)), +- "socket already in reuseport group"); ++ lockdep_is_held(&reuseport_lock)); ++ old_reuse = rcu_dereference_protected(sk->sk_reuseport_cb, ++ lockdep_is_held(&reuseport_lock)); ++ if (old_reuse && old_reuse->num_socks != 1) { ++ spin_unlock_bh(&reuseport_lock); ++ return -EBUSY; ++ } + + if (reuse->num_socks == reuse->max_socks) { + reuse = reuseport_grow(reuse); +@@ -134,19 +147,11 @@ int reuseport_add_sock(struct sock *sk, struct sock *sk2) + + spin_unlock_bh(&reuseport_lock); + ++ if (old_reuse) ++ call_rcu(&old_reuse->rcu, reuseport_free_rcu); + return 0; + } + +-static void reuseport_free_rcu(struct rcu_head *head) +-{ +- struct sock_reuseport *reuse; +- +- reuse = container_of(head, struct sock_reuseport, rcu); +- if (reuse->prog) +- bpf_prog_destroy(reuse->prog); +- kfree(reuse); +-} +- + void reuseport_detach_sock(struct sock *sk) + { + struct sock_reuseport *reuse; +diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c +index 013fed55b610..fbeb35ad804b 100644 +--- a/net/ipv4/igmp.c ++++ b/net/ipv4/igmp.c +@@ -386,7 +386,11 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, unsigned int mtu) + pip->frag_off = htons(IP_DF); + pip->ttl = 1; + pip->daddr = fl4.daddr; ++ ++ rcu_read_lock(); + pip->saddr = igmpv3_get_srcaddr(dev, &fl4); ++ rcu_read_unlock(); ++ + pip->protocol = IPPROTO_IGMP; + pip->tot_len = 0; /* filled in later */ + ip_select_ident(net, skb, NULL); +diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c +index b47a59cb3573..0cc08c512202 100644 +--- a/net/ipv4/inet_connection_sock.c ++++ b/net/ipv4/inet_connection_sock.c +@@ -475,7 +475,6 @@ struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern) + } + spin_unlock_bh(&queue->fastopenq.lock); + } +- mem_cgroup_sk_alloc(newsk); + out: + release_sock(sk); + if (req) +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 2a65d806b562..fe11128d7df4 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -2379,6 +2379,12 @@ int tcp_disconnect(struct sock *sk, int flags) + + WARN_ON(inet->inet_num && !icsk->icsk_bind_hash); + ++ if (sk->sk_frag.page) { ++ put_page(sk->sk_frag.page); ++ sk->sk_frag.page = NULL; ++ sk->sk_frag.offset = 0; ++ } ++ + sk->sk_error_report(sk); + return err; + } +diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c +index 8322f26e770e..25c5a0b60cfc 100644 +--- a/net/ipv4/tcp_bbr.c ++++ b/net/ipv4/tcp_bbr.c +@@ -481,7 +481,8 @@ static void bbr_advance_cycle_phase(struct sock *sk) + + bbr->cycle_idx = (bbr->cycle_idx + 1) & (CYCLE_LEN - 1); + bbr->cycle_mstamp = tp->delivered_mstamp; +- bbr->pacing_gain = bbr_pacing_gain[bbr->cycle_idx]; ++ bbr->pacing_gain = bbr->lt_use_bw ? BBR_UNIT : ++ bbr_pacing_gain[bbr->cycle_idx]; + } + + /* Gain cycling: cycle pacing gain to converge to fair share of available bw. */ +@@ -490,8 +491,7 @@ static void bbr_update_cycle_phase(struct sock *sk, + { + struct bbr *bbr = inet_csk_ca(sk); + +- if ((bbr->mode == BBR_PROBE_BW) && !bbr->lt_use_bw && +- bbr_is_next_cycle_phase(sk, rs)) ++ if (bbr->mode == BBR_PROBE_BW && bbr_is_next_cycle_phase(sk, rs)) + bbr_advance_cycle_phase(sk); + } + +diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c +index c5318f5f6a14..6a76e41e6d51 100644 +--- a/net/ipv6/addrconf.c ++++ b/net/ipv6/addrconf.c +@@ -184,7 +184,8 @@ static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx, + + static void addrconf_dad_start(struct inet6_ifaddr *ifp); + static void addrconf_dad_work(struct work_struct *w); +-static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id); ++static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, ++ bool send_na); + static void addrconf_dad_run(struct inet6_dev *idev); + static void addrconf_rs_timer(unsigned long data); + static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); +@@ -3825,12 +3826,17 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp) + idev->cnf.accept_dad < 1) || + !(ifp->flags&IFA_F_TENTATIVE) || + ifp->flags & IFA_F_NODAD) { ++ bool send_na = false; ++ ++ if (ifp->flags & IFA_F_TENTATIVE && ++ !(ifp->flags & IFA_F_OPTIMISTIC)) ++ send_na = true; + bump_id = ifp->flags & IFA_F_TENTATIVE; + ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); + spin_unlock(&ifp->lock); + read_unlock_bh(&idev->lock); + +- addrconf_dad_completed(ifp, bump_id); ++ addrconf_dad_completed(ifp, bump_id, send_na); + return; + } + +@@ -3959,16 +3965,21 @@ static void addrconf_dad_work(struct work_struct *w) + } + + if (ifp->dad_probes == 0) { ++ bool send_na = false; ++ + /* + * DAD was successful + */ + ++ if (ifp->flags & IFA_F_TENTATIVE && ++ !(ifp->flags & IFA_F_OPTIMISTIC)) ++ send_na = true; + bump_id = ifp->flags & IFA_F_TENTATIVE; + ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); + spin_unlock(&ifp->lock); + write_unlock_bh(&idev->lock); + +- addrconf_dad_completed(ifp, bump_id); ++ addrconf_dad_completed(ifp, bump_id, send_na); + + goto out; + } +@@ -4006,7 +4017,8 @@ static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) + return true; + } + +-static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id) ++static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, ++ bool send_na) + { + struct net_device *dev = ifp->idev->dev; + struct in6_addr lladdr; +@@ -4038,6 +4050,16 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id) + if (send_mld) + ipv6_mc_dad_complete(ifp->idev); + ++ /* send unsolicited NA if enabled */ ++ if (send_na && ++ (ifp->idev->cnf.ndisc_notify || ++ dev_net(dev)->ipv6.devconf_all->ndisc_notify)) { ++ ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr, ++ /*router=*/ !!ifp->idev->cnf.forwarding, ++ /*solicited=*/ false, /*override=*/ true, ++ /*inc_opt=*/ true); ++ } ++ + if (send_rs) { + /* + * If a host as already performed a random delay +diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c +index bcbd5f3bf8bd..9ccbf74deb99 100644 +--- a/net/ipv6/af_inet6.c ++++ b/net/ipv6/af_inet6.c +@@ -284,6 +284,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) + struct net *net = sock_net(sk); + __be32 v4addr = 0; + unsigned short snum; ++ bool saved_ipv6only; + int addr_type = 0; + int err = 0; + +@@ -389,19 +390,21 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) + if (!(addr_type & IPV6_ADDR_MULTICAST)) + np->saddr = addr->sin6_addr; + ++ saved_ipv6only = sk->sk_ipv6only; ++ if (addr_type != IPV6_ADDR_ANY && addr_type != IPV6_ADDR_MAPPED) ++ sk->sk_ipv6only = 1; ++ + /* Make sure we are allowed to bind here. */ + if ((snum || !inet->bind_address_no_port) && + sk->sk_prot->get_port(sk, snum)) { ++ sk->sk_ipv6only = saved_ipv6only; + inet_reset_saddr(sk); + err = -EADDRINUSE; + goto out; + } + +- if (addr_type != IPV6_ADDR_ANY) { ++ if (addr_type != IPV6_ADDR_ANY) + sk->sk_userlocks |= SOCK_BINDADDR_LOCK; +- if (addr_type != IPV6_ADDR_MAPPED) +- sk->sk_ipv6only = 1; +- } + if (snum) + sk->sk_userlocks |= SOCK_BINDPORT_LOCK; + inet->inet_sport = htons(inet->inet_num); +diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c +index f5500f5444e9..e1060f28410d 100644 +--- a/net/ipv6/ip6mr.c ++++ b/net/ipv6/ip6mr.c +@@ -496,6 +496,7 @@ static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) + return ERR_PTR(-ENOENT); + + it->mrt = mrt; ++ it->cache = NULL; + return *pos ? ipmr_mfc_seq_idx(net, seq->private, *pos - 1) + : SEQ_START_TOKEN; + } +diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c +index 266a530414d7..2a937c8d19e9 100644 +--- a/net/ipv6/ndisc.c ++++ b/net/ipv6/ndisc.c +@@ -558,6 +558,11 @@ static void ndisc_send_unsol_na(struct net_device *dev) + + read_lock_bh(&idev->lock); + list_for_each_entry(ifa, &idev->addr_list, if_list) { ++ /* skip tentative addresses until dad completes */ ++ if (ifa->flags & IFA_F_TENTATIVE && ++ !(ifa->flags & IFA_F_OPTIMISTIC)) ++ continue; ++ + ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr, + /*router=*/ !!idev->cnf.forwarding, + /*solicited=*/ false, /*override=*/ true, +diff --git a/scripts/package/Makefile b/scripts/package/Makefile +index 34de8b953ecf..348af5b20618 100644 +--- a/scripts/package/Makefile ++++ b/scripts/package/Makefile +@@ -50,7 +50,6 @@ rpm-pkg rpm: FORCE + $(CONFIG_SHELL) $(MKSPEC) >$(objtree)/kernel.spec + $(call cmd,src_tar,$(KERNELPATH),kernel.spec) + +rpmbuild $(RPMOPTS) --target $(UTS_MACHINE) -ta $(KERNELPATH).tar.gz +- rm $(KERNELPATH).tar.gz kernel.spec + + # binrpm-pkg + # --------------------------------------------------------------------------- +@@ -59,7 +58,8 @@ binrpm-pkg: FORCE + $(CONFIG_SHELL) $(MKSPEC) prebuilt > $(objtree)/binkernel.spec + +rpmbuild $(RPMOPTS) --define "_builddir $(objtree)" --target \ + $(UTS_MACHINE) -bb $(objtree)/binkernel.spec +- rm binkernel.spec ++ ++clean-files += $(objtree)/*.spec + + # Deb target + # ---------------------------------------------------------------------------