commit:     6200bf9362bb394005bda91951c869ae7e5d986b
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sun Aug  8 13:40:00 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sun Aug  8 13:40:00 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=6200bf93

Linux patch 4.14.243

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README               |   4 +
 1242_linux-4.14.243.patch | 326 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 330 insertions(+)

diff --git a/0000_README b/0000_README
index e9e9664..cc735f5 100644
--- a/0000_README
+++ b/0000_README
@@ -1011,6 +1011,10 @@ Patch:  1241_linux-4.14.242.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.14.242
 
+Patch:  1242_linux-4.14.243.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.14.243
+
 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/1242_linux-4.14.243.patch b/1242_linux-4.14.243.patch
new file mode 100644
index 0000000..5314450
--- /dev/null
+++ b/1242_linux-4.14.243.patch
@@ -0,0 +1,326 @@
+diff --git a/Makefile b/Makefile
+index 0179c3c463b38..c0664d65f9efb 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 14
+-SUBLEVEL = 242
++SUBLEVEL = 243
+ EXTRAVERSION =
+ NAME = Petit Gorille
+ 
+diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c 
b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
+index ef17ca09d3038..789ecc19c4125 100644
+--- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c
++++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
+@@ -497,14 +497,18 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
+ 
+               spin_lock_bh(&p_hwfn->mcp_info->cmd_lock);
+ 
+-              if (!qed_mcp_has_pending_cmd(p_hwfn))
++              if (!qed_mcp_has_pending_cmd(p_hwfn)) {
++                      spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
+                       break;
++              }
+ 
+               rc = qed_mcp_update_pending_cmd(p_hwfn, p_ptt);
+-              if (!rc)
++              if (!rc) {
++                      spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
+                       break;
+-              else if (rc != -EAGAIN)
++              } else if (rc != -EAGAIN) {
+                       goto err;
++              }
+ 
+               spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
+ 
+@@ -521,6 +525,8 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
+               return -EAGAIN;
+       }
+ 
++      spin_lock_bh(&p_hwfn->mcp_info->cmd_lock);
++
+       /* Send the mailbox command */
+       qed_mcp_reread_offsets(p_hwfn, p_ptt);
+       seq_num = ++p_hwfn->mcp_info->drv_mb_seq;
+@@ -547,14 +553,18 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
+ 
+               spin_lock_bh(&p_hwfn->mcp_info->cmd_lock);
+ 
+-              if (p_cmd_elem->b_is_completed)
++              if (p_cmd_elem->b_is_completed) {
++                      spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
+                       break;
++              }
+ 
+               rc = qed_mcp_update_pending_cmd(p_hwfn, p_ptt);
+-              if (!rc)
++              if (!rc) {
++                      spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
+                       break;
+-              else if (rc != -EAGAIN)
++              } else if (rc != -EAGAIN) {
+                       goto err;
++              }
+ 
+               spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
+       } while (++cnt < max_retries);
+@@ -575,6 +585,7 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
+               return -EAGAIN;
+       }
+ 
++      spin_lock_bh(&p_hwfn->mcp_info->cmd_lock);
+       qed_mcp_cmd_del_elem(p_hwfn, p_cmd_elem);
+       spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
+ 
+diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
+index 8da3c891c9e80..a5a4fef09b938 100644
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -3953,9 +3953,10 @@ static int rtl8152_close(struct net_device *netdev)
+               tp->rtl_ops.down(tp);
+ 
+               mutex_unlock(&tp->control);
++      }
+ 
++      if (!res)
+               usb_autopm_put_interface(tp->intf);
+-      }
+ 
+       free_all_mem(tp);
+ 
+diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c
+index e2b171057b3b3..690e8ddf5f6b8 100644
+--- a/drivers/spi/spi-mt65xx.c
++++ b/drivers/spi/spi-mt65xx.c
+@@ -391,24 +391,15 @@ static int mtk_spi_fifo_transfer(struct spi_master 
*master,
+       mtk_spi_prepare_transfer(master, xfer);
+       mtk_spi_setup_packet(master);
+ 
+-      cnt = xfer->len / 4;
+-      if (xfer->tx_buf)
++      if (xfer->tx_buf) {
++              cnt = xfer->len / 4;
+               iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
+-
+-      if (xfer->rx_buf)
+-              ioread32_rep(mdata->base + SPI_RX_DATA_REG, xfer->rx_buf, cnt);
+-
+-      remainder = xfer->len % 4;
+-      if (remainder > 0) {
+-              reg_val = 0;
+-              if (xfer->tx_buf) {
++              remainder = xfer->len % 4;
++              if (remainder > 0) {
++                      reg_val = 0;
+                       memcpy(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
+                       writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+               }
+-              if (xfer->rx_buf) {
+-                      reg_val = readl(mdata->base + SPI_RX_DATA_REG);
+-                      memcpy(xfer->rx_buf + (cnt * 4), &reg_val, remainder);
+-              }
+       }
+ 
+       mtk_spi_enable_transfer(master);
+diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
+index 059c9eddb5468..347f0389b0899 100644
+--- a/drivers/watchdog/iTCO_wdt.c
++++ b/drivers/watchdog/iTCO_wdt.c
+@@ -75,8 +75,6 @@
+ #define TCOBASE(p)    ((p)->tco_res->start)
+ /* SMI Control and Enable Register */
+ #define SMI_EN(p)     ((p)->smi_res->start)
+-#define TCO_EN                (1 << 13)
+-#define GBL_SMI_EN    (1 << 0)
+ 
+ #define TCO_RLD(p)    (TCOBASE(p) + 0x00) /* TCO Timer Reload/Curr. Value */
+ #define TCOv1_TMR(p)  (TCOBASE(p) + 0x01) /* TCOv1 Timer Initial Value*/
+@@ -332,12 +330,8 @@ static int iTCO_wdt_set_timeout(struct watchdog_device 
*wd_dev, unsigned int t)
+ 
+       tmrval = seconds_to_ticks(p, t);
+ 
+-      /*
+-       * If TCO SMIs are off, the timer counts down twice before rebooting.
+-       * Otherwise, the BIOS generally reboots when the SMI triggers.
+-       */
+-      if (p->smi_res &&
+-          (SMI_EN(p) & (TCO_EN | GBL_SMI_EN)) != (TCO_EN | GBL_SMI_EN))
++      /* For TCO v1 the timer counts down twice before rebooting */
++      if (p->iTCO_version == 1)
+               tmrval /= 2;
+ 
+       /* from the specs: */
+@@ -499,7 +493,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
+                * Disables TCO logic generating an SMI#
+                */
+               val32 = inl(SMI_EN(p));
+-              val32 &= ~TCO_EN;       /* Turn off SMI clearing watchdog */
++              val32 &= 0xffffdfff;    /* Turn off SMI clearing watchdog */
+               outl(val32, SMI_EN(p));
+       }
+ 
+diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
+index ccd9c709375e7..24341c97c13fd 100644
+--- a/fs/btrfs/compression.c
++++ b/fs/btrfs/compression.c
+@@ -286,7 +286,7 @@ static void end_compressed_bio_write(struct bio *bio)
+                                        cb->start,
+                                        cb->start + cb->len - 1,
+                                        NULL,
+-                                       bio->bi_status ? 0 : 1);
++                                       !cb->errors);
+       cb->compressed_pages[0]->mapping = NULL;
+ 
+       end_compressed_writeback(inode, cb);
+diff --git a/include/linux/mfd/rt5033-private.h 
b/include/linux/mfd/rt5033-private.h
+index 1b63fc2f42d1c..52d53d134f72c 100644
+--- a/include/linux/mfd/rt5033-private.h
++++ b/include/linux/mfd/rt5033-private.h
+@@ -203,13 +203,13 @@ enum rt5033_reg {
+ #define RT5033_REGULATOR_BUCK_VOLTAGE_MIN             1000000U
+ #define RT5033_REGULATOR_BUCK_VOLTAGE_MAX             3000000U
+ #define RT5033_REGULATOR_BUCK_VOLTAGE_STEP            100000U
+-#define RT5033_REGULATOR_BUCK_VOLTAGE_STEP_NUM                32
++#define RT5033_REGULATOR_BUCK_VOLTAGE_STEP_NUM                21
+ 
+ /* RT5033 regulator LDO output voltage uV */
+ #define RT5033_REGULATOR_LDO_VOLTAGE_MIN              1200000U
+ #define RT5033_REGULATOR_LDO_VOLTAGE_MAX              3000000U
+ #define RT5033_REGULATOR_LDO_VOLTAGE_STEP             100000U
+-#define RT5033_REGULATOR_LDO_VOLTAGE_STEP_NUM         32
++#define RT5033_REGULATOR_LDO_VOLTAGE_STEP_NUM         19
+ 
+ /* RT5033 regulator SAFE LDO output voltage uV */
+ #define RT5033_REGULATOR_SAFE_LDO_VOLTAGE             4900000U
+diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
+index 0958dbdd2906c..ba5c899d1edfa 100644
+--- a/net/bluetooth/hci_core.c
++++ b/net/bluetooth/hci_core.c
+@@ -1569,6 +1569,14 @@ int hci_dev_do_close(struct hci_dev *hdev)
+ 
+       BT_DBG("%s %p", hdev->name, hdev);
+ 
++      if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
++          !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
++          test_bit(HCI_UP, &hdev->flags)) {
++              /* Execute vendor specific shutdown routine */
++              if (hdev->shutdown)
++                      hdev->shutdown(hdev);
++      }
++
+       cancel_delayed_work(&hdev->power_off);
+ 
+       hci_request_cancel_all(hdev);
+@@ -1636,14 +1644,6 @@ int hci_dev_do_close(struct hci_dev *hdev)
+               clear_bit(HCI_INIT, &hdev->flags);
+       }
+ 
+-      if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
+-          !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
+-          test_bit(HCI_UP, &hdev->flags)) {
+-              /* Execute vendor specific shutdown routine */
+-              if (hdev->shutdown)
+-                      hdev->shutdown(hdev);
+-      }
+-
+       /* flush cmd  work */
+       flush_work(&hdev->cmd_work);
+ 
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 18dc8524e525a..a278258e68cbf 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -2702,8 +2702,11 @@ skb_zerocopy_headlen(const struct sk_buff *from)
+ 
+       if (!from->head_frag ||
+           skb_headlen(from) < L1_CACHE_BYTES ||
+-          skb_shinfo(from)->nr_frags >= MAX_SKB_FRAGS)
++          skb_shinfo(from)->nr_frags >= MAX_SKB_FRAGS) {
+               hlen = skb_headlen(from);
++              if (!hlen)
++                      hlen = from->len;
++      }
+ 
+       if (skb_has_frag_list(from))
+               hlen = from->len;
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 547ae59199db2..36b9f2b29071b 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -1485,15 +1485,24 @@ static bool vma_is_valid(struct vm_area_struct *vma, 
bool write_fault)
+       return true;
+ }
+ 
++static int kvm_try_get_pfn(kvm_pfn_t pfn)
++{
++      if (kvm_is_reserved_pfn(pfn))
++              return 1;
++      return get_page_unless_zero(pfn_to_page(pfn));
++}
++
+ static int hva_to_pfn_remapped(struct vm_area_struct *vma,
+                              unsigned long addr, bool *async,
+                              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_pmd(vma->vm_mm, addr, NULL, NULL, &ptep, NULL, &ptl);
+       if (r) {
+               /*
+                * get_user_pages fails for VM_IO and VM_PFNMAP vmas and does
+@@ -1508,14 +1517,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_pmd(vma->vm_mm, addr, NULL, NULL, &ptep, NULL, 
&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
+@@ -1527,11 +1541,21 @@ static int hva_to_pfn_remapped(struct vm_area_struct 
*vma,
+        * Whoever called remap_pfn_range is also going to call e.g.
+        * unmap_mapping_range before the underlying pages are freed,
+        * causing a call to our MMU notifier.
++       *
++       * Certain IO or PFNMAP mappings can be backed with valid
++       * struct pages, but be allocated without refcounting e.g.,
++       * tail pages of non-compound higher order allocations, which
++       * would then underflow the refcount when the caller does the
++       * required put_page. Don't allow those pages here.
+        */ 
+-      kvm_get_pfn(pfn);
++      if (!kvm_try_get_pfn(pfn))
++              r = -EFAULT;
+ 
++out:
++      pte_unmap_unlock(ptep, ptl);
+       *p_pfn = pfn;
+-      return 0;
++
++      return r;
+ }
+ 
+ /*

Reply via email to