commit: f6d488f641a3289902abf03543bb035ce13d70e6 Author: Alice Ferrazzi <alicef <AT> gentoo <DOT> org> AuthorDate: Fri Feb 26 10:42:06 2021 +0000 Commit: Alice Ferrazzi <alicef <AT> gentoo <DOT> org> CommitDate: Fri Feb 26 10:42:24 2021 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=f6d488f6
Linux patch 5.10.19 Signed-off-by: Alice Ferrazzi <alicef <AT> gentoo.org> 0000_README | 4 + 1018_linux-5.10.19.patch | 544 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 548 insertions(+) diff --git a/0000_README b/0000_README index ae786d2..0f03575 100644 --- a/0000_README +++ b/0000_README @@ -115,6 +115,10 @@ Patch: 1017_linux-5.10.18.patch From: http://www.kernel.org Desc: Linux 5.10.18 +Patch: 1018_linux-5.10.19.patch +From: http://www.kernel.org +Desc: Linux 5.10.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/1018_linux-5.10.19.patch b/1018_linux-5.10.19.patch new file mode 100644 index 0000000..b8b2ca4 --- /dev/null +++ b/1018_linux-5.10.19.patch @@ -0,0 +1,544 @@ +diff --git a/Makefile b/Makefile +index 822a8e10d4325..f700bdea626d9 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,9 +1,9 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 10 +-SUBLEVEL = 18 ++SUBLEVEL = 19 + EXTRAVERSION = +-NAME = Kleptomaniac Octopus ++NAME = Dare mighty things + + # *DOCUMENTATION* + # To see a list of typical targets execute "make help" +diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi b/arch/arm64/boot/dts/nvidia/tegra210.dtsi +index d47c88950d38d..7fd47d8f166a6 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi +@@ -997,6 +997,7 @@ + <&tegra_car 128>, /* hda2hdmi */ + <&tegra_car 111>; /* hda2codec_2x */ + reset-names = "hda", "hda2hdmi", "hda2codec_2x"; ++ power-domains = <&pd_sor>; + status = "disabled"; + }; + +diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c +index 52f36c8790862..dacbd13d32c69 100644 +--- a/arch/x86/kvm/mmu/mmu.c ++++ b/arch/x86/kvm/mmu/mmu.c +@@ -2409,7 +2409,7 @@ static unsigned long kvm_mmu_zap_oldest_mmu_pages(struct kvm *kvm, + return 0; + + restart: +- list_for_each_entry_safe(sp, tmp, &kvm->arch.active_mmu_pages, link) { ++ list_for_each_entry_safe_reverse(sp, tmp, &kvm->arch.active_mmu_pages, link) { + /* + * Don't zap active root pages, the page itself can't be freed + * and zapping it will just force vCPUs to realloc and reload. +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 9f958699141e2..1c942869baacc 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -3689,6 +3689,13 @@ static int btusb_setup_qca(struct hci_dev *hdev) + info = &qca_devices_table[i]; + } + if (!info) { ++ /* If the rom_version is not matched in the qca_devices_table ++ * and the high ROM version is not zero, we assume this chip no ++ * need to load the rampatch and nvm. ++ */ ++ if (ver_rom & ~0xffffU) ++ return 0; ++ + bt_dev_err(hdev, "don't support firmware rome 0x%x", ver_rom); + return -ENODEV; + } +diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c b/drivers/gpu/drm/xlnx/zynqmp_disp.c +index 98bd48f13fd11..8cd8af35cfaac 100644 +--- a/drivers/gpu/drm/xlnx/zynqmp_disp.c ++++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c +@@ -1398,19 +1398,11 @@ static void zynqmp_disp_enable(struct zynqmp_disp *disp) + */ + static void zynqmp_disp_disable(struct zynqmp_disp *disp) + { +- struct drm_crtc *crtc = &disp->crtc; +- + zynqmp_disp_audio_disable(&disp->audio); + + zynqmp_disp_avbuf_disable_audio(&disp->avbuf); + zynqmp_disp_avbuf_disable_channels(&disp->avbuf); + zynqmp_disp_avbuf_disable(&disp->avbuf); +- +- /* Mark the flip is done as crtc is disabled anyway */ +- if (crtc->state->event) { +- complete_all(crtc->state->event->base.completion); +- crtc->state->event = NULL; +- } + } + + static inline struct zynqmp_disp *crtc_to_disp(struct drm_crtc *crtc) +@@ -1499,6 +1491,13 @@ zynqmp_disp_crtc_atomic_disable(struct drm_crtc *crtc, + + drm_crtc_vblank_off(&disp->crtc); + ++ spin_lock_irq(&crtc->dev->event_lock); ++ if (crtc->state->event) { ++ drm_crtc_send_vblank_event(crtc, crtc->state->event); ++ crtc->state->event = NULL; ++ } ++ spin_unlock_irq(&crtc->dev->event_lock); ++ + clk_disable_unprepare(disp->pclk); + pm_runtime_put_sync(disp->dev); + } +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 56172fe6995cd..8a8b2b982f83c 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -90,7 +90,7 @@ EXPORT_SYMBOL_GPL(hid_register_report); + * Register a new field for this report. + */ + +-static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages, unsigned values) ++static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages) + { + struct hid_field *field; + +@@ -101,7 +101,7 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned + + field = kzalloc((sizeof(struct hid_field) + + usages * sizeof(struct hid_usage) + +- values * sizeof(unsigned)), GFP_KERNEL); ++ usages * sizeof(unsigned)), GFP_KERNEL); + if (!field) + return NULL; + +@@ -300,7 +300,7 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign + usages = max_t(unsigned, parser->local.usage_index, + parser->global.report_count); + +- field = hid_register_field(report, usages, parser->global.report_count); ++ field = hid_register_field(report, usages); + if (!field) + return 0; + +diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c +index ec448f5f2dc33..73b9db9e3aab6 100644 +--- a/drivers/hwmon/dell-smm-hwmon.c ++++ b/drivers/hwmon/dell-smm-hwmon.c +@@ -1159,6 +1159,13 @@ static struct dmi_system_id i8k_blacklist_fan_support_dmi_table[] __initdata = { + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "XPS13 9333"), + }, + }, ++ { ++ .ident = "Dell XPS 15 L502X", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), ++ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Dell System XPS L502X"), ++ }, ++ }, + { } + }; + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h b/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h +index 0c5373462cedb..0b1b5f9c67d47 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h ++++ b/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h +@@ -219,6 +219,7 @@ CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN + CH_PCI_ID_TABLE_FENTRY(0x6089), /* Custom T62100-KR */ + CH_PCI_ID_TABLE_FENTRY(0x608a), /* Custom T62100-CR */ + CH_PCI_ID_TABLE_FENTRY(0x608b), /* Custom T6225-CR */ ++ CH_PCI_ID_TABLE_FENTRY(0x6092), /* Custom T62100-CR-LOM */ + CH_PCI_DEVICE_ID_TABLE_DEFINE_END; + + #endif /* __T4_PCI_ID_TBL_H__ */ +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index ce73df4c137ea..b223536e07bed 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1332,6 +1332,7 @@ static const struct usb_device_id products[] = { + {QMI_FIXED_INTF(0x1e2d, 0x0082, 5)}, /* Cinterion PHxx,PXxx (2 RmNet) */ + {QMI_FIXED_INTF(0x1e2d, 0x0083, 4)}, /* Cinterion PHxx,PXxx (1 RmNet + USB Audio)*/ + {QMI_QUIRK_SET_DTR(0x1e2d, 0x00b0, 4)}, /* Cinterion CLS8 */ ++ {QMI_FIXED_INTF(0x1e2d, 0x00b7, 0)}, /* Cinterion MV31 RmNet */ + {QMI_FIXED_INTF(0x413c, 0x81a2, 8)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a3, 8)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ +diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c +index 493ed7ba86ed2..4eb867804b6ab 100644 +--- a/drivers/nvme/host/rdma.c ++++ b/drivers/nvme/host/rdma.c +@@ -860,7 +860,7 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, + return error; + + ctrl->device = ctrl->queues[0].device; +- ctrl->ctrl.numa_node = dev_to_node(ctrl->device->dev->dma_device); ++ ctrl->ctrl.numa_node = ibdev_to_node(ctrl->device->dev); + + /* T10-PI support */ + if (ctrl->device->dev->attrs.device_cap_flags & +diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c +index 1b4eb7046b078..6ade3daf78584 100644 +--- a/drivers/usb/core/quirks.c ++++ b/drivers/usb/core/quirks.c +@@ -391,6 +391,9 @@ static const struct usb_device_id usb_quirk_list[] = { + /* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */ + { USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF }, + ++ /* ELMO L-12F document camera */ ++ { USB_DEVICE(0x09a1, 0x0028), .driver_info = USB_QUIRK_DELAY_CTRL_MSG }, ++ + /* Broadcom BCM92035DGROM BT dongle */ + { USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME }, + +@@ -415,6 +418,9 @@ static const struct usb_device_id usb_quirk_list[] = { + { USB_DEVICE(0x10d6, 0x2200), .driver_info = + USB_QUIRK_STRING_FETCH_255 }, + ++ /* novation SoundControl XL */ ++ { USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME }, ++ + /* Huawei 4G LTE module */ + { USB_DEVICE(0x12d1, 0x15bb), .driver_info = + USB_QUIRK_DISCONNECT_SUSPEND }, +@@ -495,9 +501,6 @@ static const struct usb_device_id usb_quirk_list[] = { + /* INTEL VALUE SSD */ + { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, + +- /* novation SoundControl XL */ +- { USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME }, +- + { } /* terminating entry must be last */ + }; + +diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c +index e4aba6c6d3b59..1096d1d3a84c4 100644 +--- a/fs/ceph/mdsmap.c ++++ b/fs/ceph/mdsmap.c +@@ -243,8 +243,8 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end) + } + + if (state <= 0) { +- pr_warn("mdsmap_decode got incorrect state(%s)\n", +- ceph_mds_state_name(state)); ++ dout("mdsmap_decode got incorrect state(%s)\n", ++ ceph_mds_state_name(state)); + continue; + } + +diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c +index 44f9cce570995..ad3ecda1314d9 100644 +--- a/fs/cifs/connect.c ++++ b/fs/cifs/connect.c +@@ -4007,6 +4007,7 @@ int cifs_setup_cifs_sb(struct smb_vol *pvolume_info, + cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL); + if (cifs_sb->prepath == NULL) + return -ENOMEM; ++ cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH; + } + + return 0; +diff --git a/fs/dax.c b/fs/dax.c +index 5b47834f2e1bb..b3d27fdc67752 100644 +--- a/fs/dax.c ++++ b/fs/dax.c +@@ -810,12 +810,12 @@ static void dax_entry_mkclean(struct address_space *mapping, pgoff_t index, + address = pgoff_address(index, vma); + + /* +- * Note because we provide range to follow_pte_pmd it will +- * call mmu_notifier_invalidate_range_start() on our behalf +- * before taking any lock. ++ * follow_invalidate_pte() will use the range to call ++ * mmu_notifier_invalidate_range_start() on our behalf before ++ * taking any lock. + */ +- if (follow_pte_pmd(vma->vm_mm, address, &range, +- &ptep, &pmdp, &ptl)) ++ if (follow_invalidate_pte(vma->vm_mm, address, &range, &ptep, ++ &pmdp, &ptl)) + continue; + + /* +diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c +index caf563981532b..e9d5c8e638b01 100644 +--- a/fs/ntfs/inode.c ++++ b/fs/ntfs/inode.c +@@ -629,6 +629,12 @@ static int ntfs_read_locked_inode(struct inode *vi) + } + a = ctx->attr; + /* Get the standard information attribute value. */ ++ if ((u8 *)a + le16_to_cpu(a->data.resident.value_offset) ++ + le32_to_cpu(a->data.resident.value_length) > ++ (u8 *)ctx->mrec + vol->mft_record_size) { ++ ntfs_error(vi->i_sb, "Corrupt standard information attribute in inode."); ++ goto unm_err_out; ++ } + si = (STANDARD_INFORMATION*)((u8*)a + + le16_to_cpu(a->data.resident.value_offset)); + +diff --git a/include/linux/mm.h b/include/linux/mm.h +index cd5c313729ea1..b8eadd9f96802 100644 +--- a/include/linux/mm.h ++++ b/include/linux/mm.h +@@ -1655,9 +1655,11 @@ void free_pgd_range(struct mmu_gather *tlb, unsigned long addr, + unsigned long end, unsigned long floor, unsigned long ceiling); + int + copy_page_range(struct vm_area_struct *dst_vma, struct vm_area_struct *src_vma); +-int follow_pte_pmd(struct mm_struct *mm, unsigned long address, +- struct mmu_notifier_range *range, +- pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp); ++int follow_invalidate_pte(struct mm_struct *mm, unsigned long address, ++ struct mmu_notifier_range *range, pte_t **ptepp, ++ pmd_t **pmdpp, spinlock_t **ptlp); ++int follow_pte(struct mm_struct *mm, unsigned long address, ++ pte_t **ptepp, spinlock_t **ptlp); + int follow_pfn(struct vm_area_struct *vma, unsigned long address, + unsigned long *pfn); + int follow_phys(struct vm_area_struct *vma, unsigned long address, +diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h +index 65771bef5e654..ac6ffa5618843 100644 +--- a/include/rdma/ib_verbs.h ++++ b/include/rdma/ib_verbs.h +@@ -4642,6 +4642,19 @@ static inline struct ib_device *rdma_device_to_ibdev(struct device *device) + return coredev->owner; + } + ++/** ++ * ibdev_to_node - return the NUMA node for a given ib_device ++ * @dev: device to get the NUMA node for. ++ */ ++static inline int ibdev_to_node(struct ib_device *ibdev) ++{ ++ struct device *parent = ibdev->dev.parent; ++ ++ if (!parent) ++ return NUMA_NO_NODE; ++ return dev_to_node(parent); ++} ++ + /** + * rdma_device_to_drv_device - Helper macro to reach back to driver's + * ib_device holder structure from device pointer. +diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c +index 8c017f8c0c6d6..c09594e70f90a 100644 +--- a/kernel/bpf/verifier.c ++++ b/kernel/bpf/verifier.c +@@ -10869,7 +10869,7 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env) + bool isdiv = BPF_OP(insn->code) == BPF_DIV; + struct bpf_insn *patchlet; + struct bpf_insn chk_and_div[] = { +- /* Rx div 0 -> 0 */ ++ /* [R,W]x div 0 -> 0 */ + BPF_RAW_INSN((is64 ? BPF_JMP : BPF_JMP32) | + BPF_JNE | BPF_K, insn->src_reg, + 0, 2, 0), +@@ -10878,16 +10878,18 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env) + *insn, + }; + struct bpf_insn chk_and_mod[] = { +- /* Rx mod 0 -> Rx */ ++ /* [R,W]x mod 0 -> [R,W]x */ + BPF_RAW_INSN((is64 ? BPF_JMP : BPF_JMP32) | + BPF_JEQ | BPF_K, insn->src_reg, +- 0, 1, 0), ++ 0, 1 + (is64 ? 0 : 1), 0), + *insn, ++ BPF_JMP_IMM(BPF_JA, 0, 0, 1), ++ BPF_MOV32_REG(insn->dst_reg, insn->dst_reg), + }; + + patchlet = isdiv ? chk_and_div : chk_and_mod; + cnt = isdiv ? ARRAY_SIZE(chk_and_div) : +- ARRAY_SIZE(chk_and_mod); ++ ARRAY_SIZE(chk_and_mod) - (is64 ? 2 : 0); + + new_prog = bpf_patch_insn_data(env, i + delta, patchlet, cnt); + if (!new_prog) +diff --git a/mm/memory.c b/mm/memory.c +index 50632c4366b8a..eb5722027160a 100644 +--- a/mm/memory.c ++++ b/mm/memory.c +@@ -4707,9 +4707,9 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address) + } + #endif /* __PAGETABLE_PMD_FOLDED */ + +-static int __follow_pte_pmd(struct mm_struct *mm, unsigned long address, +- struct mmu_notifier_range *range, +- pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp) ++int follow_invalidate_pte(struct mm_struct *mm, unsigned long address, ++ struct mmu_notifier_range *range, pte_t **ptepp, ++ pmd_t **pmdpp, spinlock_t **ptlp) + { + pgd_t *pgd; + p4d_t *p4d; +@@ -4774,31 +4774,33 @@ out: + return -EINVAL; + } + +-static inline int follow_pte(struct mm_struct *mm, unsigned long address, +- pte_t **ptepp, spinlock_t **ptlp) +-{ +- int res; +- +- /* (void) is needed to make gcc happy */ +- (void) __cond_lock(*ptlp, +- !(res = __follow_pte_pmd(mm, address, NULL, +- ptepp, NULL, ptlp))); +- return res; +-} +- +-int follow_pte_pmd(struct mm_struct *mm, unsigned long address, +- struct mmu_notifier_range *range, +- pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp) ++/** ++ * follow_pte - look up PTE at a user virtual address ++ * @mm: the mm_struct of the target address space ++ * @address: user virtual address ++ * @ptepp: location to store found PTE ++ * @ptlp: location to store the lock for the PTE ++ * ++ * On a successful return, the pointer to the PTE is stored in @ptepp; ++ * the corresponding lock is taken and its location is stored in @ptlp. ++ * The contents of the PTE are only stable until @ptlp is released; ++ * any further use, if any, must be protected against invalidation ++ * with MMU notifiers. ++ * ++ * Only IO mappings and raw PFN mappings are allowed. The mmap semaphore ++ * should be taken for read. ++ * ++ * KVM uses this function. While it is arguably less bad than ``follow_pfn``, ++ * it is not a good general-purpose API. ++ * ++ * Return: zero on success, -ve otherwise. ++ */ ++int follow_pte(struct mm_struct *mm, unsigned long address, ++ pte_t **ptepp, spinlock_t **ptlp) + { +- int res; +- +- /* (void) is needed to make gcc happy */ +- (void) __cond_lock(*ptlp, +- !(res = __follow_pte_pmd(mm, address, range, +- ptepp, pmdpp, ptlp))); +- return res; ++ return follow_invalidate_pte(mm, address, NULL, ptepp, NULL, ptlp); + } +-EXPORT_SYMBOL(follow_pte_pmd); ++EXPORT_SYMBOL_GPL(follow_pte); + + /** + * follow_pfn - look up PFN at a user virtual address +@@ -4808,6 +4810,9 @@ EXPORT_SYMBOL(follow_pte_pmd); + * + * Only IO mappings and raw PFN mappings are allowed. + * ++ * This function does not allow the caller to read the permissions ++ * of the PTE. Do not use it. ++ * + * Return: zero and the pfn at @pfn on success, -ve otherwise. + */ + int follow_pfn(struct vm_area_struct *vma, unsigned long address, +diff --git a/net/rds/ib.h b/net/rds/ib.h +index 8dfff43cf07f4..c23a11d9ad362 100644 +--- a/net/rds/ib.h ++++ b/net/rds/ib.h +@@ -264,13 +264,6 @@ struct rds_ib_device { + int *vector_load; + }; + +-static inline int ibdev_to_node(struct ib_device *ibdev) +-{ +- struct device *parent; +- +- parent = ibdev->dev.parent; +- return parent ? dev_to_node(parent) : NUMA_NO_NODE; +-} + #define rdsibdev_to_node(rdsibdev) ibdev_to_node(rdsibdev->dev) + + /* bits for i_ack_flags */ +diff --git a/scripts/gen_autoksyms.sh b/scripts/gen_autoksyms.sh +index 16c0b2ddaa4c9..d54dfba15bf25 100755 +--- a/scripts/gen_autoksyms.sh ++++ b/scripts/gen_autoksyms.sh +@@ -43,6 +43,9 @@ EOT + sed 's/ko$/mod/' $modlist | + xargs -n1 sed -n -e '2{s/ /\n/g;/^$/!p;}' -- | + cat - "$ksym_wl" | ++# Remove the dot prefix for ppc64; symbol names with a dot (.) hold entry ++# point addresses. ++sed -e 's/^\.//' | + sort -u | + sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$output_file" + +diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl +index 3f77a5d695c13..0bafed857e171 100755 +--- a/scripts/recordmcount.pl ++++ b/scripts/recordmcount.pl +@@ -268,7 +268,11 @@ if ($arch eq "x86_64") { + + # force flags for this arch + $ld .= " -m shlelf_linux"; +- $objcopy .= " -O elf32-sh-linux"; ++ if ($endian eq "big") { ++ $objcopy .= " -O elf32-shbig-linux"; ++ } else { ++ $objcopy .= " -O elf32-sh-linux"; ++ } + + } elsif ($arch eq "powerpc") { + my $ldemulation; +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index cf9cc0ed7e995..ed4d2e3a00718 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -1888,10 +1888,12 @@ static int hva_to_pfn_remapped(struct vm_area_struct *vma, + bool write_fault, bool *writable, + kvm_pfn_t *p_pfn) + { +- unsigned long pfn; ++ kvm_pfn_t pfn; ++ pte_t *ptep; ++ spinlock_t *ptl; + int r; + +- r = follow_pfn(vma, addr, &pfn); ++ r = follow_pte(vma->vm_mm, addr, &ptep, &ptl); + if (r) { + /* + * get_user_pages fails for VM_IO and VM_PFNMAP vmas and does +@@ -1906,14 +1908,19 @@ static int hva_to_pfn_remapped(struct vm_area_struct *vma, + if (r) + return r; + +- r = follow_pfn(vma, addr, &pfn); ++ r = follow_pte(vma->vm_mm, addr, &ptep, &ptl); + if (r) + return r; ++ } + ++ if (write_fault && !pte_write(*ptep)) { ++ pfn = KVM_PFN_ERR_RO_FAULT; ++ goto out; + } + + if (writable) +- *writable = true; ++ *writable = pte_write(*ptep); ++ pfn = pte_pfn(*ptep); + + /* + * Get a reference here because callers of *hva_to_pfn* and +@@ -1928,6 +1935,8 @@ static int hva_to_pfn_remapped(struct vm_area_struct *vma, + */ + kvm_get_pfn(pfn); + ++out: ++ pte_unmap_unlock(ptep, ptl); + *p_pfn = pfn; + return 0; + }
