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;
+ }

Reply via email to