commit:     705e865cb7116eec6fa548403b2d0c5c6309dd0e
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Fri May 17 11:23:48 2024 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Fri May 17 11:23:48 2024 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=705e865c

Linux patch 6.9.1

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

 0000_README            |   4 +
 1000_linux-6.9.1.patch | 286 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 290 insertions(+)

diff --git a/0000_README b/0000_README
index 887cea4c..02b4c7fb 100644
--- a/0000_README
+++ b/0000_README
@@ -43,6 +43,10 @@ EXPERIMENTAL
 Individual Patch Descriptions:
 --------------------------------------------------------------------------
 
+Patch:  1000_linux-6.9.1.patch
+From:   https://www.kernel.org
+Desc:   Linux 6.9.1
+
 Patch:  1510_fs-enable-link-security-restrictions-by-default.patch
 From:   
http://sources.debian.net/src/linux/3.16.7-ckt4-3/debian/patches/debian/fs-enable-link-security-restrictions-by-default.patch/
 Desc:   Enable link security restrictions by default.

diff --git a/1000_linux-6.9.1.patch b/1000_linux-6.9.1.patch
new file mode 100644
index 00000000..277d2283
--- /dev/null
+++ b/1000_linux-6.9.1.patch
@@ -0,0 +1,286 @@
+diff --git a/Makefile b/Makefile
+index 967e97878ecdf..a7045435151e6 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 9
+-SUBLEVEL = 0
++SUBLEVEL = 1
+ EXTRAVERSION =
+ NAME = Hurr durr I'ma ninja sloth
+ 
+diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c
+index c095a2c8f6595..39935071174a3 100644
+--- a/drivers/dma/idxd/cdev.c
++++ b/drivers/dma/idxd/cdev.c
+@@ -400,6 +400,18 @@ static int idxd_cdev_mmap(struct file *filp, struct 
vm_area_struct *vma)
+       int rc;
+ 
+       dev_dbg(&pdev->dev, "%s called\n", __func__);
++
++      /*
++       * Due to an erratum in some of the devices supported by the driver,
++       * direct user submission to the device can be unsafe.
++       * (See the INTEL-SA-01084 security advisory)
++       *
++       * For the devices that exhibit this behavior, require that the user
++       * has CAP_SYS_RAWIO capabilities.
++       */
++      if (!idxd->user_submission_safe && !capable(CAP_SYS_RAWIO))
++              return -EPERM;
++
+       rc = check_vma(wq, vma, __func__);
+       if (rc < 0)
+               return rc;
+@@ -414,6 +426,70 @@ static int idxd_cdev_mmap(struct file *filp, struct 
vm_area_struct *vma)
+                       vma->vm_page_prot);
+ }
+ 
++static int idxd_submit_user_descriptor(struct idxd_user_context *ctx,
++                                     struct dsa_hw_desc __user *udesc)
++{
++      struct idxd_wq *wq = ctx->wq;
++      struct idxd_dev *idxd_dev = &wq->idxd->idxd_dev;
++      const uint64_t comp_addr_align = is_dsa_dev(idxd_dev) ? 0x20 : 0x40;
++      void __iomem *portal = idxd_wq_portal_addr(wq);
++      struct dsa_hw_desc descriptor __aligned(64);
++      int rc;
++
++      rc = copy_from_user(&descriptor, udesc, sizeof(descriptor));
++      if (rc)
++              return -EFAULT;
++
++      /*
++       * DSA devices are capable of indirect ("batch") command submission.
++       * On devices where direct user submissions are not safe, we cannot
++       * allow this since there is no good way for us to verify these
++       * indirect commands.
++       */
++      if (is_dsa_dev(idxd_dev) && descriptor.opcode == DSA_OPCODE_BATCH &&
++              !wq->idxd->user_submission_safe)
++              return -EINVAL;
++      /*
++       * As per the programming specification, the completion address must be
++       * aligned to 32 or 64 bytes. If this is violated the hardware
++       * engine can get very confused (security issue).
++       */
++      if (!IS_ALIGNED(descriptor.completion_addr, comp_addr_align))
++              return -EINVAL;
++
++      if (wq_dedicated(wq))
++              iosubmit_cmds512(portal, &descriptor, 1);
++      else {
++              descriptor.priv = 0;
++              descriptor.pasid = ctx->pasid;
++              rc = idxd_enqcmds(wq, portal, &descriptor);
++              if (rc < 0)
++                      return rc;
++      }
++
++      return 0;
++}
++
++static ssize_t idxd_cdev_write(struct file *filp, const char __user *buf, 
size_t len,
++                             loff_t *unused)
++{
++      struct dsa_hw_desc __user *udesc = (struct dsa_hw_desc __user *)buf;
++      struct idxd_user_context *ctx = filp->private_data;
++      ssize_t written = 0;
++      int i;
++
++      for (i = 0; i < len/sizeof(struct dsa_hw_desc); i++) {
++              int rc = idxd_submit_user_descriptor(ctx, udesc + i);
++
++              if (rc)
++                      return written ? written : rc;
++
++              written += sizeof(struct dsa_hw_desc);
++      }
++
++      return written;
++}
++
+ static __poll_t idxd_cdev_poll(struct file *filp,
+                              struct poll_table_struct *wait)
+ {
+@@ -436,6 +512,7 @@ static const struct file_operations idxd_cdev_fops = {
+       .open = idxd_cdev_open,
+       .release = idxd_cdev_release,
+       .mmap = idxd_cdev_mmap,
++      .write = idxd_cdev_write,
+       .poll = idxd_cdev_poll,
+ };
+ 
+diff --git a/drivers/dma/idxd/idxd.h b/drivers/dma/idxd/idxd.h
+index 7b98944135eb4..868b724a3b75b 100644
+--- a/drivers/dma/idxd/idxd.h
++++ b/drivers/dma/idxd/idxd.h
+@@ -288,6 +288,7 @@ struct idxd_driver_data {
+       int evl_cr_off;
+       int cr_status_off;
+       int cr_result_off;
++      bool user_submission_safe;
+       load_device_defaults_fn_t load_device_defaults;
+ };
+ 
+@@ -374,6 +375,8 @@ struct idxd_device {
+ 
+       struct dentry *dbgfs_dir;
+       struct dentry *dbgfs_evl_file;
++
++      bool user_submission_safe;
+ };
+ 
+ static inline unsigned int evl_ent_size(struct idxd_device *idxd)
+diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c
+index 264c4e47d7cca..a7295943fa223 100644
+--- a/drivers/dma/idxd/init.c
++++ b/drivers/dma/idxd/init.c
+@@ -47,6 +47,7 @@ static struct idxd_driver_data idxd_driver_data[] = {
+               .align = 32,
+               .dev_type = &dsa_device_type,
+               .evl_cr_off = offsetof(struct dsa_evl_entry, cr),
++              .user_submission_safe = false, /* See INTEL-SA-01084 security 
advisory */
+               .cr_status_off = offsetof(struct dsa_completion_record, status),
+               .cr_result_off = offsetof(struct dsa_completion_record, result),
+       },
+@@ -57,6 +58,7 @@ static struct idxd_driver_data idxd_driver_data[] = {
+               .align = 64,
+               .dev_type = &iax_device_type,
+               .evl_cr_off = offsetof(struct iax_evl_entry, cr),
++              .user_submission_safe = false, /* See INTEL-SA-01084 security 
advisory */
+               .cr_status_off = offsetof(struct iax_completion_record, status),
+               .cr_result_off = offsetof(struct iax_completion_record, 
error_code),
+               .load_device_defaults = idxd_load_iaa_device_defaults,
+@@ -774,6 +776,8 @@ static int idxd_pci_probe(struct pci_dev *pdev, const 
struct pci_device_id *id)
+       dev_info(&pdev->dev, "Intel(R) Accelerator Device (v%x)\n",
+                idxd->hw.version);
+ 
++      idxd->user_submission_safe = data->user_submission_safe;
++
+       return 0;
+ 
+  err_dev_register:
+diff --git a/drivers/dma/idxd/registers.h b/drivers/dma/idxd/registers.h
+index 315c004f58e47..e16dbf9ab324c 100644
+--- a/drivers/dma/idxd/registers.h
++++ b/drivers/dma/idxd/registers.h
+@@ -6,9 +6,6 @@
+ #include <uapi/linux/idxd.h>
+ 
+ /* PCI Config */
+-#define PCI_DEVICE_ID_INTEL_DSA_SPR0  0x0b25
+-#define PCI_DEVICE_ID_INTEL_IAX_SPR0  0x0cfe
+-
+ #define DEVICE_VERSION_1              0x100
+ #define DEVICE_VERSION_2              0x200
+ 
+diff --git a/drivers/dma/idxd/sysfs.c b/drivers/dma/idxd/sysfs.c
+index 7f28f01be672b..f706eae0e76b1 100644
+--- a/drivers/dma/idxd/sysfs.c
++++ b/drivers/dma/idxd/sysfs.c
+@@ -1197,12 +1197,35 @@ static ssize_t wq_enqcmds_retries_store(struct device 
*dev, struct device_attrib
+ static struct device_attribute dev_attr_wq_enqcmds_retries =
+               __ATTR(enqcmds_retries, 0644, wq_enqcmds_retries_show, 
wq_enqcmds_retries_store);
+ 
++static ssize_t op_cap_show_common(struct device *dev, char *buf, unsigned 
long *opcap_bmap)
++{
++      ssize_t pos;
++      int i;
++
++      pos = 0;
++      for (i = IDXD_MAX_OPCAP_BITS/64 - 1; i >= 0; i--) {
++              unsigned long val = opcap_bmap[i];
++
++              /* On systems where direct user submissions are not safe, we 
need to clear out
++               * the BATCH capability from the capability mask in sysfs since 
we cannot support
++               * that command on such systems.
++               */
++              if (i == DSA_OPCODE_BATCH/64 && 
!confdev_to_idxd(dev)->user_submission_safe)
++                      clear_bit(DSA_OPCODE_BATCH % 64, &val);
++
++              pos += sysfs_emit_at(buf, pos, "%*pb", 64, &val);
++              pos += sysfs_emit_at(buf, pos, "%c", i == 0 ? '\n' : ',');
++      }
++
++      return pos;
++}
++
+ static ssize_t wq_op_config_show(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+ {
+       struct idxd_wq *wq = confdev_to_wq(dev);
+ 
+-      return sysfs_emit(buf, "%*pb\n", IDXD_MAX_OPCAP_BITS, wq->opcap_bmap);
++      return op_cap_show_common(dev, buf, wq->opcap_bmap);
+ }
+ 
+ static int idxd_verify_supported_opcap(struct idxd_device *idxd, unsigned 
long *opmask)
+@@ -1455,7 +1478,7 @@ static ssize_t op_cap_show(struct device *dev,
+ {
+       struct idxd_device *idxd = confdev_to_idxd(dev);
+ 
+-      return sysfs_emit(buf, "%*pb\n", IDXD_MAX_OPCAP_BITS, idxd->opcap_bmap);
++      return op_cap_show_common(dev, buf, idxd->opcap_bmap);
+ }
+ static DEVICE_ATTR_RO(op_cap);
+ 
+diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c 
b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+index 3709d18da0e6b..075d04ba3ef28 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+@@ -1657,6 +1657,10 @@ mt7915_net_fill_forward_path(struct ieee80211_hw *hw,
+ #endif
+ 
+ const struct ieee80211_ops mt7915_ops = {
++      .add_chanctx = ieee80211_emulate_add_chanctx,
++      .remove_chanctx = ieee80211_emulate_remove_chanctx,
++      .change_chanctx = ieee80211_emulate_change_chanctx,
++      .switch_vif_chanctx = ieee80211_emulate_switch_vif_chanctx,
+       .tx = mt7915_tx,
+       .start = mt7915_start,
+       .stop = mt7915_stop,
+diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
+index cb5b7f865d585..e727941f589de 100644
+--- a/drivers/vfio/pci/vfio_pci.c
++++ b/drivers/vfio/pci/vfio_pci.c
+@@ -71,6 +71,8 @@ static bool vfio_pci_dev_in_denylist(struct pci_dev *pdev)
+               case PCI_DEVICE_ID_INTEL_QAT_C62X_VF:
+               case PCI_DEVICE_ID_INTEL_QAT_DH895XCC:
+               case PCI_DEVICE_ID_INTEL_QAT_DH895XCC_VF:
++              case PCI_DEVICE_ID_INTEL_DSA_SPR0:
++              case PCI_DEVICE_ID_INTEL_IAX_SPR0:
+                       return true;
+               default:
+                       return false;
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index c547d1d4feb1e..4beb29907c2bd 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -2687,8 +2687,10 @@
+ #define PCI_DEVICE_ID_INTEL_I960      0x0960
+ #define PCI_DEVICE_ID_INTEL_I960RM    0x0962
+ #define PCI_DEVICE_ID_INTEL_HDA_HSW_0 0x0a0c
++#define PCI_DEVICE_ID_INTEL_DSA_SPR0  0x0b25
+ #define PCI_DEVICE_ID_INTEL_HDA_HSW_2 0x0c0c
+ #define PCI_DEVICE_ID_INTEL_CENTERTON_ILB     0x0c60
++#define PCI_DEVICE_ID_INTEL_IAX_SPR0  0x0cfe
+ #define PCI_DEVICE_ID_INTEL_HDA_HSW_3 0x0d0c
+ #define PCI_DEVICE_ID_INTEL_HDA_BYT   0x0f04
+ #define PCI_DEVICE_ID_INTEL_SST_BYT   0x0f28
+diff --git a/security/keys/key.c b/security/keys/key.c
+index 5607900383298..0aa5f01d16ffb 100644
+--- a/security/keys/key.c
++++ b/security/keys/key.c
+@@ -463,7 +463,8 @@ static int __key_instantiate_and_link(struct key *key,
+                       if (authkey)
+                               key_invalidate(authkey);
+ 
+-                      key_set_expiry(key, prep->expiry);
++                      if (prep->expiry != TIME64_MAX)
++                              key_set_expiry(key, prep->expiry);
+               }
+       }
+ 

Reply via email to