1199 lines
40 KiB
Diff
1199 lines
40 KiB
Diff
From 13ef2f91f3bdac2d0a70a8e05b2496bb4aabdf4b Mon Sep 17 00:00:00 2001
|
|
From: Sasha Levin <sashal@kernel.org>
|
|
Date: Fri, 23 Aug 2024 18:30:46 +0200
|
|
Subject: drm: Use XArray instead of IDR for minors
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
From: Michał Winiarski <michal.winiarski@intel.com>
|
|
|
|
[ Upstream commit 5fbca8b48b3050ae7fb611a8b09af60012ed6de1 ]
|
|
|
|
IDR is deprecated, and since XArray manages its own state with internal
|
|
locking, it simplifies the locking on DRM side.
|
|
Additionally, don't use the IRQ-safe variant, since operating on drm
|
|
minor is not done in IRQ context.
|
|
|
|
Suggested-by: Matthew Wilcox <willy@infradead.org>
|
|
Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
|
|
Acked-by: James Zhu <James.Zhu@amd.com>
|
|
Acked-by: Christian König <christian.koenig@amd.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20240823163048.2676257-2-michal.winiarski@intel.com
|
|
Signed-off-by: Christian König <christian.koenig@amd.com>
|
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
---
|
|
drivers/gpu/drm/drm_drv.c | 63 ++++++++++++++++-----------------------
|
|
1 file changed, 25 insertions(+), 38 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
|
|
index 93543071a5008..ae675a588a1df 100644
|
|
--- a/drivers/gpu/drm/drm_drv.c
|
|
+++ b/drivers/gpu/drm/drm_drv.c
|
|
@@ -34,6 +34,7 @@
|
|
#include <linux/pseudo_fs.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/srcu.h>
|
|
+#include <linux/xarray.h>
|
|
|
|
#include <drm/drm_accel.h>
|
|
#include <drm/drm_cache.h>
|
|
@@ -54,8 +55,7 @@ MODULE_AUTHOR("Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl");
|
|
MODULE_DESCRIPTION("DRM shared core routines");
|
|
MODULE_LICENSE("GPL and additional rights");
|
|
|
|
-static DEFINE_SPINLOCK(drm_minor_lock);
|
|
-static struct idr drm_minors_idr;
|
|
+static DEFINE_XARRAY_ALLOC(drm_minors_xa);
|
|
|
|
/*
|
|
* If the drm core fails to init for whatever reason,
|
|
@@ -101,26 +101,23 @@ static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
|
|
static void drm_minor_alloc_release(struct drm_device *dev, void *data)
|
|
{
|
|
struct drm_minor *minor = data;
|
|
- unsigned long flags;
|
|
|
|
WARN_ON(dev != minor->dev);
|
|
|
|
put_device(minor->kdev);
|
|
|
|
- if (minor->type == DRM_MINOR_ACCEL) {
|
|
+ if (minor->type == DRM_MINOR_ACCEL)
|
|
accel_minor_remove(minor->index);
|
|
- } else {
|
|
- spin_lock_irqsave(&drm_minor_lock, flags);
|
|
- idr_remove(&drm_minors_idr, minor->index);
|
|
- spin_unlock_irqrestore(&drm_minor_lock, flags);
|
|
- }
|
|
+ else
|
|
+ xa_erase(&drm_minors_xa, minor->index);
|
|
}
|
|
|
|
+#define DRM_MINOR_LIMIT(t) ({ typeof(t) _t = (t); XA_LIMIT(64 * _t, 64 * _t + 63); })
|
|
+
|
|
static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
|
|
{
|
|
struct drm_minor *minor;
|
|
- unsigned long flags;
|
|
- int r;
|
|
+ int index, r;
|
|
|
|
minor = drmm_kzalloc(dev, sizeof(*minor), GFP_KERNEL);
|
|
if (!minor)
|
|
@@ -129,24 +126,17 @@ static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
|
|
minor->type = type;
|
|
minor->dev = dev;
|
|
|
|
- idr_preload(GFP_KERNEL);
|
|
if (type == DRM_MINOR_ACCEL) {
|
|
r = accel_minor_alloc();
|
|
+ index = r;
|
|
} else {
|
|
- spin_lock_irqsave(&drm_minor_lock, flags);
|
|
- r = idr_alloc(&drm_minors_idr,
|
|
- NULL,
|
|
- 64 * type,
|
|
- 64 * (type + 1),
|
|
- GFP_NOWAIT);
|
|
- spin_unlock_irqrestore(&drm_minor_lock, flags);
|
|
+ r = xa_alloc(&drm_minors_xa, &index, NULL, DRM_MINOR_LIMIT(type), GFP_KERNEL);
|
|
}
|
|
- idr_preload_end();
|
|
|
|
if (r < 0)
|
|
return r;
|
|
|
|
- minor->index = r;
|
|
+ minor->index = index;
|
|
|
|
r = drmm_add_action_or_reset(dev, drm_minor_alloc_release, minor);
|
|
if (r)
|
|
@@ -163,7 +153,7 @@ static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
|
|
static int drm_minor_register(struct drm_device *dev, enum drm_minor_type type)
|
|
{
|
|
struct drm_minor *minor;
|
|
- unsigned long flags;
|
|
+ void *entry;
|
|
int ret;
|
|
|
|
DRM_DEBUG("\n");
|
|
@@ -189,9 +179,12 @@ static int drm_minor_register(struct drm_device *dev, enum drm_minor_type type)
|
|
if (minor->type == DRM_MINOR_ACCEL) {
|
|
accel_minor_replace(minor, minor->index);
|
|
} else {
|
|
- spin_lock_irqsave(&drm_minor_lock, flags);
|
|
- idr_replace(&drm_minors_idr, minor, minor->index);
|
|
- spin_unlock_irqrestore(&drm_minor_lock, flags);
|
|
+ entry = xa_store(&drm_minors_xa, minor->index, minor, GFP_KERNEL);
|
|
+ if (xa_is_err(entry)) {
|
|
+ ret = xa_err(entry);
|
|
+ goto err_debugfs;
|
|
+ }
|
|
+ WARN_ON(entry);
|
|
}
|
|
|
|
DRM_DEBUG("new minor registered %d\n", minor->index);
|
|
@@ -205,20 +198,16 @@ static int drm_minor_register(struct drm_device *dev, enum drm_minor_type type)
|
|
static void drm_minor_unregister(struct drm_device *dev, enum drm_minor_type type)
|
|
{
|
|
struct drm_minor *minor;
|
|
- unsigned long flags;
|
|
|
|
minor = *drm_minor_get_slot(dev, type);
|
|
if (!minor || !device_is_registered(minor->kdev))
|
|
return;
|
|
|
|
/* replace @minor with NULL so lookups will fail from now on */
|
|
- if (minor->type == DRM_MINOR_ACCEL) {
|
|
+ if (minor->type == DRM_MINOR_ACCEL)
|
|
accel_minor_replace(NULL, minor->index);
|
|
- } else {
|
|
- spin_lock_irqsave(&drm_minor_lock, flags);
|
|
- idr_replace(&drm_minors_idr, NULL, minor->index);
|
|
- spin_unlock_irqrestore(&drm_minor_lock, flags);
|
|
- }
|
|
+ else
|
|
+ xa_store(&drm_minors_xa, minor->index, NULL, GFP_KERNEL);
|
|
|
|
device_del(minor->kdev);
|
|
dev_set_drvdata(minor->kdev, NULL); /* safety belt */
|
|
@@ -237,13 +226,12 @@ static void drm_minor_unregister(struct drm_device *dev, enum drm_minor_type typ
|
|
struct drm_minor *drm_minor_acquire(unsigned int minor_id)
|
|
{
|
|
struct drm_minor *minor;
|
|
- unsigned long flags;
|
|
|
|
- spin_lock_irqsave(&drm_minor_lock, flags);
|
|
- minor = idr_find(&drm_minors_idr, minor_id);
|
|
+ xa_lock(&drm_minors_xa);
|
|
+ minor = xa_load(&drm_minors_xa, minor_id);
|
|
if (minor)
|
|
drm_dev_get(minor->dev);
|
|
- spin_unlock_irqrestore(&drm_minor_lock, flags);
|
|
+ xa_unlock(&drm_minors_xa);
|
|
|
|
if (!minor) {
|
|
return ERR_PTR(-ENODEV);
|
|
@@ -1071,7 +1059,7 @@ static void drm_core_exit(void)
|
|
unregister_chrdev(DRM_MAJOR, "drm");
|
|
debugfs_remove(drm_debugfs_root);
|
|
drm_sysfs_destroy();
|
|
- idr_destroy(&drm_minors_idr);
|
|
+ WARN_ON(!xa_empty(&drm_minors_xa));
|
|
drm_connector_ida_destroy();
|
|
}
|
|
|
|
@@ -1080,7 +1068,6 @@ static int __init drm_core_init(void)
|
|
int ret;
|
|
|
|
drm_connector_ida_init();
|
|
- idr_init(&drm_minors_idr);
|
|
drm_memcpy_init_early();
|
|
|
|
ret = drm_sysfs_init();
|
|
--
|
|
2.43.0
|
|
|
|
From 2c092234084d8e1861ce63129a4c52d4eb13f3b3 Mon Sep 17 00:00:00 2001
|
|
From: Sasha Levin <sashal@kernel.org>
|
|
Date: Fri, 23 Aug 2024 18:30:47 +0200
|
|
Subject: accel: Use XArray instead of IDR for minors
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
From: Michał Winiarski <michal.winiarski@intel.com>
|
|
|
|
[ Upstream commit 45c4d994b82b08f0ce5eb50f8da29379c92a391e ]
|
|
|
|
Accel minor management is based on DRM (and is also using struct
|
|
drm_minor internally), since DRM is using XArray for minors, it makes
|
|
sense to also convert accel.
|
|
As the two implementations are identical (only difference being the
|
|
underlying xarray), move the accel_minor_* functionality to DRM.
|
|
|
|
Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
|
|
Acked-by: James Zhu <James.Zhu@amd.com>
|
|
Acked-by: Christian König <christian.koenig@amd.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20240823163048.2676257-3-michal.winiarski@intel.com
|
|
Signed-off-by: Christian König <christian.koenig@amd.com>
|
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
---
|
|
drivers/accel/drm_accel.c | 110 +++------------------------------
|
|
drivers/gpu/drm/drm_drv.c | 66 ++++++++++----------
|
|
drivers/gpu/drm/drm_file.c | 2 +-
|
|
drivers/gpu/drm/drm_internal.h | 4 --
|
|
include/drm/drm_accel.h | 18 +-----
|
|
include/drm/drm_file.h | 5 ++
|
|
6 files changed, 47 insertions(+), 158 deletions(-)
|
|
|
|
diff --git a/drivers/accel/drm_accel.c b/drivers/accel/drm_accel.c
|
|
index 16c3edb8c46ee..aa826033b0ceb 100644
|
|
--- a/drivers/accel/drm_accel.c
|
|
+++ b/drivers/accel/drm_accel.c
|
|
@@ -8,7 +8,7 @@
|
|
|
|
#include <linux/debugfs.h>
|
|
#include <linux/device.h>
|
|
-#include <linux/idr.h>
|
|
+#include <linux/xarray.h>
|
|
|
|
#include <drm/drm_accel.h>
|
|
#include <drm/drm_auth.h>
|
|
@@ -18,8 +18,7 @@
|
|
#include <drm/drm_ioctl.h>
|
|
#include <drm/drm_print.h>
|
|
|
|
-static DEFINE_SPINLOCK(accel_minor_lock);
|
|
-static struct idr accel_minors_idr;
|
|
+DEFINE_XARRAY_ALLOC(accel_minors_xa);
|
|
|
|
static struct dentry *accel_debugfs_root;
|
|
|
|
@@ -117,99 +116,6 @@ void accel_set_device_instance_params(struct device *kdev, int index)
|
|
kdev->type = &accel_sysfs_device_minor;
|
|
}
|
|
|
|
-/**
|
|
- * accel_minor_alloc() - Allocates a new accel minor
|
|
- *
|
|
- * This function access the accel minors idr and allocates from it
|
|
- * a new id to represent a new accel minor
|
|
- *
|
|
- * Return: A new id on success or error code in case idr_alloc failed
|
|
- */
|
|
-int accel_minor_alloc(void)
|
|
-{
|
|
- unsigned long flags;
|
|
- int r;
|
|
-
|
|
- spin_lock_irqsave(&accel_minor_lock, flags);
|
|
- r = idr_alloc(&accel_minors_idr, NULL, 0, ACCEL_MAX_MINORS, GFP_NOWAIT);
|
|
- spin_unlock_irqrestore(&accel_minor_lock, flags);
|
|
-
|
|
- return r;
|
|
-}
|
|
-
|
|
-/**
|
|
- * accel_minor_remove() - Remove an accel minor
|
|
- * @index: The minor id to remove.
|
|
- *
|
|
- * This function access the accel minors idr and removes from
|
|
- * it the member with the id that is passed to this function.
|
|
- */
|
|
-void accel_minor_remove(int index)
|
|
-{
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&accel_minor_lock, flags);
|
|
- idr_remove(&accel_minors_idr, index);
|
|
- spin_unlock_irqrestore(&accel_minor_lock, flags);
|
|
-}
|
|
-
|
|
-/**
|
|
- * accel_minor_replace() - Replace minor pointer in accel minors idr.
|
|
- * @minor: Pointer to the new minor.
|
|
- * @index: The minor id to replace.
|
|
- *
|
|
- * This function access the accel minors idr structure and replaces the pointer
|
|
- * that is associated with an existing id. Because the minor pointer can be
|
|
- * NULL, we need to explicitly pass the index.
|
|
- *
|
|
- * Return: 0 for success, negative value for error
|
|
- */
|
|
-void accel_minor_replace(struct drm_minor *minor, int index)
|
|
-{
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&accel_minor_lock, flags);
|
|
- idr_replace(&accel_minors_idr, minor, index);
|
|
- spin_unlock_irqrestore(&accel_minor_lock, flags);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Looks up the given minor-ID and returns the respective DRM-minor object. The
|
|
- * refence-count of the underlying device is increased so you must release this
|
|
- * object with accel_minor_release().
|
|
- *
|
|
- * The object can be only a drm_minor that represents an accel device.
|
|
- *
|
|
- * As long as you hold this minor, it is guaranteed that the object and the
|
|
- * minor->dev pointer will stay valid! However, the device may get unplugged and
|
|
- * unregistered while you hold the minor.
|
|
- */
|
|
-static struct drm_minor *accel_minor_acquire(unsigned int minor_id)
|
|
-{
|
|
- struct drm_minor *minor;
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&accel_minor_lock, flags);
|
|
- minor = idr_find(&accel_minors_idr, minor_id);
|
|
- if (minor)
|
|
- drm_dev_get(minor->dev);
|
|
- spin_unlock_irqrestore(&accel_minor_lock, flags);
|
|
-
|
|
- if (!minor) {
|
|
- return ERR_PTR(-ENODEV);
|
|
- } else if (drm_dev_is_unplugged(minor->dev)) {
|
|
- drm_dev_put(minor->dev);
|
|
- return ERR_PTR(-ENODEV);
|
|
- }
|
|
-
|
|
- return minor;
|
|
-}
|
|
-
|
|
-static void accel_minor_release(struct drm_minor *minor)
|
|
-{
|
|
- drm_dev_put(minor->dev);
|
|
-}
|
|
-
|
|
/**
|
|
* accel_open - open method for ACCEL file
|
|
* @inode: device inode
|
|
@@ -227,7 +133,7 @@ int accel_open(struct inode *inode, struct file *filp)
|
|
struct drm_minor *minor;
|
|
int retcode;
|
|
|
|
- minor = accel_minor_acquire(iminor(inode));
|
|
+ minor = drm_minor_acquire(&accel_minors_xa, iminor(inode));
|
|
if (IS_ERR(minor))
|
|
return PTR_ERR(minor);
|
|
|
|
@@ -246,7 +152,7 @@ int accel_open(struct inode *inode, struct file *filp)
|
|
|
|
err_undo:
|
|
atomic_dec(&dev->open_count);
|
|
- accel_minor_release(minor);
|
|
+ drm_minor_release(minor);
|
|
return retcode;
|
|
}
|
|
EXPORT_SYMBOL_GPL(accel_open);
|
|
@@ -257,7 +163,7 @@ static int accel_stub_open(struct inode *inode, struct file *filp)
|
|
struct drm_minor *minor;
|
|
int err;
|
|
|
|
- minor = accel_minor_acquire(iminor(inode));
|
|
+ minor = drm_minor_acquire(&accel_minors_xa, iminor(inode));
|
|
if (IS_ERR(minor))
|
|
return PTR_ERR(minor);
|
|
|
|
@@ -274,7 +180,7 @@ static int accel_stub_open(struct inode *inode, struct file *filp)
|
|
err = 0;
|
|
|
|
out:
|
|
- accel_minor_release(minor);
|
|
+ drm_minor_release(minor);
|
|
|
|
return err;
|
|
}
|
|
@@ -290,15 +196,13 @@ void accel_core_exit(void)
|
|
unregister_chrdev(ACCEL_MAJOR, "accel");
|
|
debugfs_remove(accel_debugfs_root);
|
|
accel_sysfs_destroy();
|
|
- idr_destroy(&accel_minors_idr);
|
|
+ WARN_ON(!xa_empty(&accel_minors_xa));
|
|
}
|
|
|
|
int __init accel_core_init(void)
|
|
{
|
|
int ret;
|
|
|
|
- idr_init(&accel_minors_idr);
|
|
-
|
|
ret = accel_sysfs_init();
|
|
if (ret < 0) {
|
|
DRM_ERROR("Cannot create ACCEL class: %d\n", ret);
|
|
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
|
|
index ae675a588a1df..7e0fa5a2a3182 100644
|
|
--- a/drivers/gpu/drm/drm_drv.c
|
|
+++ b/drivers/gpu/drm/drm_drv.c
|
|
@@ -55,7 +55,7 @@ MODULE_AUTHOR("Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl");
|
|
MODULE_DESCRIPTION("DRM shared core routines");
|
|
MODULE_LICENSE("GPL and additional rights");
|
|
|
|
-static DEFINE_XARRAY_ALLOC(drm_minors_xa);
|
|
+DEFINE_XARRAY_ALLOC(drm_minors_xa);
|
|
|
|
/*
|
|
* If the drm core fails to init for whatever reason,
|
|
@@ -83,6 +83,18 @@ DEFINE_STATIC_SRCU(drm_unplug_srcu);
|
|
* registered and unregistered dynamically according to device-state.
|
|
*/
|
|
|
|
+static struct xarray *drm_minor_get_xa(enum drm_minor_type type)
|
|
+{
|
|
+ if (type == DRM_MINOR_PRIMARY || type == DRM_MINOR_RENDER)
|
|
+ return &drm_minors_xa;
|
|
+#if IS_ENABLED(CONFIG_DRM_ACCEL)
|
|
+ else if (type == DRM_MINOR_ACCEL)
|
|
+ return &accel_minors_xa;
|
|
+#endif
|
|
+ else
|
|
+ return ERR_PTR(-EOPNOTSUPP);
|
|
+}
|
|
+
|
|
static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
|
|
enum drm_minor_type type)
|
|
{
|
|
@@ -106,18 +118,18 @@ static void drm_minor_alloc_release(struct drm_device *dev, void *data)
|
|
|
|
put_device(minor->kdev);
|
|
|
|
- if (minor->type == DRM_MINOR_ACCEL)
|
|
- accel_minor_remove(minor->index);
|
|
- else
|
|
- xa_erase(&drm_minors_xa, minor->index);
|
|
+ xa_erase(drm_minor_get_xa(minor->type), minor->index);
|
|
}
|
|
|
|
-#define DRM_MINOR_LIMIT(t) ({ typeof(t) _t = (t); XA_LIMIT(64 * _t, 64 * _t + 63); })
|
|
+#define DRM_MINOR_LIMIT(t) ({ \
|
|
+ typeof(t) _t = (t); \
|
|
+ _t == DRM_MINOR_ACCEL ? XA_LIMIT(0, ACCEL_MAX_MINORS) : XA_LIMIT(64 * _t, 64 * _t + 63); \
|
|
+})
|
|
|
|
static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
|
|
{
|
|
struct drm_minor *minor;
|
|
- int index, r;
|
|
+ int r;
|
|
|
|
minor = drmm_kzalloc(dev, sizeof(*minor), GFP_KERNEL);
|
|
if (!minor)
|
|
@@ -126,18 +138,11 @@ static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
|
|
minor->type = type;
|
|
minor->dev = dev;
|
|
|
|
- if (type == DRM_MINOR_ACCEL) {
|
|
- r = accel_minor_alloc();
|
|
- index = r;
|
|
- } else {
|
|
- r = xa_alloc(&drm_minors_xa, &index, NULL, DRM_MINOR_LIMIT(type), GFP_KERNEL);
|
|
- }
|
|
-
|
|
+ r = xa_alloc(drm_minor_get_xa(type), &minor->index,
|
|
+ NULL, DRM_MINOR_LIMIT(type), GFP_KERNEL);
|
|
if (r < 0)
|
|
return r;
|
|
|
|
- minor->index = index;
|
|
-
|
|
r = drmm_add_action_or_reset(dev, drm_minor_alloc_release, minor);
|
|
if (r)
|
|
return r;
|
|
@@ -176,16 +181,12 @@ static int drm_minor_register(struct drm_device *dev, enum drm_minor_type type)
|
|
goto err_debugfs;
|
|
|
|
/* replace NULL with @minor so lookups will succeed from now on */
|
|
- if (minor->type == DRM_MINOR_ACCEL) {
|
|
- accel_minor_replace(minor, minor->index);
|
|
- } else {
|
|
- entry = xa_store(&drm_minors_xa, minor->index, minor, GFP_KERNEL);
|
|
- if (xa_is_err(entry)) {
|
|
- ret = xa_err(entry);
|
|
- goto err_debugfs;
|
|
- }
|
|
- WARN_ON(entry);
|
|
+ entry = xa_store(drm_minor_get_xa(type), minor->index, minor, GFP_KERNEL);
|
|
+ if (xa_is_err(entry)) {
|
|
+ ret = xa_err(entry);
|
|
+ goto err_debugfs;
|
|
}
|
|
+ WARN_ON(entry);
|
|
|
|
DRM_DEBUG("new minor registered %d\n", minor->index);
|
|
return 0;
|
|
@@ -204,10 +205,7 @@ static void drm_minor_unregister(struct drm_device *dev, enum drm_minor_type typ
|
|
return;
|
|
|
|
/* replace @minor with NULL so lookups will fail from now on */
|
|
- if (minor->type == DRM_MINOR_ACCEL)
|
|
- accel_minor_replace(NULL, minor->index);
|
|
- else
|
|
- xa_store(&drm_minors_xa, minor->index, NULL, GFP_KERNEL);
|
|
+ xa_store(drm_minor_get_xa(type), minor->index, NULL, GFP_KERNEL);
|
|
|
|
device_del(minor->kdev);
|
|
dev_set_drvdata(minor->kdev, NULL); /* safety belt */
|
|
@@ -223,15 +221,15 @@ static void drm_minor_unregister(struct drm_device *dev, enum drm_minor_type typ
|
|
* minor->dev pointer will stay valid! However, the device may get unplugged and
|
|
* unregistered while you hold the minor.
|
|
*/
|
|
-struct drm_minor *drm_minor_acquire(unsigned int minor_id)
|
|
+struct drm_minor *drm_minor_acquire(struct xarray *minor_xa, unsigned int minor_id)
|
|
{
|
|
struct drm_minor *minor;
|
|
|
|
- xa_lock(&drm_minors_xa);
|
|
- minor = xa_load(&drm_minors_xa, minor_id);
|
|
+ xa_lock(minor_xa);
|
|
+ minor = xa_load(minor_xa, minor_id);
|
|
if (minor)
|
|
drm_dev_get(minor->dev);
|
|
- xa_unlock(&drm_minors_xa);
|
|
+ xa_unlock(minor_xa);
|
|
|
|
if (!minor) {
|
|
return ERR_PTR(-ENODEV);
|
|
@@ -1024,7 +1022,7 @@ static int drm_stub_open(struct inode *inode, struct file *filp)
|
|
|
|
DRM_DEBUG("\n");
|
|
|
|
- minor = drm_minor_acquire(iminor(inode));
|
|
+ minor = drm_minor_acquire(&drm_minors_xa, iminor(inode));
|
|
if (IS_ERR(minor))
|
|
return PTR_ERR(minor);
|
|
|
|
diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
|
|
index 714e42b051080..f917b259b3342 100644
|
|
--- a/drivers/gpu/drm/drm_file.c
|
|
+++ b/drivers/gpu/drm/drm_file.c
|
|
@@ -364,7 +364,7 @@ int drm_open(struct inode *inode, struct file *filp)
|
|
struct drm_minor *minor;
|
|
int retcode;
|
|
|
|
- minor = drm_minor_acquire(iminor(inode));
|
|
+ minor = drm_minor_acquire(&drm_minors_xa, iminor(inode));
|
|
if (IS_ERR(minor))
|
|
return PTR_ERR(minor);
|
|
|
|
diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
|
|
index 690505a1f7a5d..12acf44c4e240 100644
|
|
--- a/drivers/gpu/drm/drm_internal.h
|
|
+++ b/drivers/gpu/drm/drm_internal.h
|
|
@@ -81,10 +81,6 @@ void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv);
|
|
void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv,
|
|
uint32_t handle);
|
|
|
|
-/* drm_drv.c */
|
|
-struct drm_minor *drm_minor_acquire(unsigned int minor_id);
|
|
-void drm_minor_release(struct drm_minor *minor);
|
|
-
|
|
/* drm_managed.c */
|
|
void drm_managed_release(struct drm_device *dev);
|
|
void drmm_add_final_kfree(struct drm_device *dev, void *container);
|
|
diff --git a/include/drm/drm_accel.h b/include/drm/drm_accel.h
|
|
index f4d3784b1dce0..8867ce0be94cd 100644
|
|
--- a/include/drm/drm_accel.h
|
|
+++ b/include/drm/drm_accel.h
|
|
@@ -51,11 +51,10 @@
|
|
|
|
#if IS_ENABLED(CONFIG_DRM_ACCEL)
|
|
|
|
+extern struct xarray accel_minors_xa;
|
|
+
|
|
void accel_core_exit(void);
|
|
int accel_core_init(void);
|
|
-void accel_minor_remove(int index);
|
|
-int accel_minor_alloc(void);
|
|
-void accel_minor_replace(struct drm_minor *minor, int index);
|
|
void accel_set_device_instance_params(struct device *kdev, int index);
|
|
int accel_open(struct inode *inode, struct file *filp);
|
|
void accel_debugfs_init(struct drm_device *dev);
|
|
@@ -73,19 +72,6 @@ static inline int __init accel_core_init(void)
|
|
return 0;
|
|
}
|
|
|
|
-static inline void accel_minor_remove(int index)
|
|
-{
|
|
-}
|
|
-
|
|
-static inline int accel_minor_alloc(void)
|
|
-{
|
|
- return -EOPNOTSUPP;
|
|
-}
|
|
-
|
|
-static inline void accel_minor_replace(struct drm_minor *minor, int index)
|
|
-{
|
|
-}
|
|
-
|
|
static inline void accel_set_device_instance_params(struct device *kdev, int index)
|
|
{
|
|
}
|
|
diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h
|
|
index ab230d3af138d..8c0030c773081 100644
|
|
--- a/include/drm/drm_file.h
|
|
+++ b/include/drm/drm_file.h
|
|
@@ -45,6 +45,8 @@ struct drm_printer;
|
|
struct device;
|
|
struct file;
|
|
|
|
+extern struct xarray drm_minors_xa;
|
|
+
|
|
/*
|
|
* FIXME: Not sure we want to have drm_minor here in the end, but to avoid
|
|
* header include loops we need it here for now.
|
|
@@ -434,6 +436,9 @@ static inline bool drm_is_accel_client(const struct drm_file *file_priv)
|
|
|
|
void drm_file_update_pid(struct drm_file *);
|
|
|
|
+struct drm_minor *drm_minor_acquire(struct xarray *minors_xa, unsigned int minor_id);
|
|
+void drm_minor_release(struct drm_minor *minor);
|
|
+
|
|
int drm_open(struct inode *inode, struct file *filp);
|
|
int drm_open_helper(struct file *filp, struct drm_minor *minor);
|
|
ssize_t drm_read(struct file *filp, char __user *buffer,
|
|
--
|
|
2.43.0
|
|
|
|
From e5b3b380b671294816499f105b3a348e68799cec Mon Sep 17 00:00:00 2001
|
|
From: Sasha Levin <sashal@kernel.org>
|
|
Date: Fri, 23 Aug 2024 18:30:48 +0200
|
|
Subject: drm: Expand max DRM device number to full MINORBITS
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
From: Michał Winiarski <michal.winiarski@intel.com>
|
|
|
|
[ Upstream commit 071d583e01c88272f6ff216d4f867f8f35e94d7d ]
|
|
|
|
Having a limit of 64 DRM devices is not good enough for modern world
|
|
where we have multi-GPU servers, SR-IOV virtual functions and virtual
|
|
devices used for testing.
|
|
Let's utilize full minor range for DRM devices.
|
|
To avoid regressing the existing userspace, we're still maintaining the
|
|
numbering scheme where 0-63 is used for primary, 64-127 is reserved
|
|
(formerly for control) and 128-191 is used for render.
|
|
For minors >= 192, we're allocating minors dynamically on a first-come,
|
|
first-served basis.
|
|
|
|
Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20240823163048.2676257-4-michal.winiarski@intel.com
|
|
Acked-by: James Zhu <James.Zhu@amd.com>
|
|
Acked-by: Christian König <christian.koenig@amd.com>
|
|
Signed-off-by: Christian König <christian.koenig@amd.com>
|
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
---
|
|
drivers/gpu/drm/drm_drv.c | 12 ++++++++++++
|
|
1 file changed, 12 insertions(+)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
|
|
index 7e0fa5a2a3182..c734e6a1c4ce2 100644
|
|
--- a/drivers/gpu/drm/drm_drv.c
|
|
+++ b/drivers/gpu/drm/drm_drv.c
|
|
@@ -121,10 +121,19 @@ static void drm_minor_alloc_release(struct drm_device *dev, void *data)
|
|
xa_erase(drm_minor_get_xa(minor->type), minor->index);
|
|
}
|
|
|
|
+/*
|
|
+ * DRM used to support 64 devices, for backwards compatibility we need to maintain the
|
|
+ * minor allocation scheme where minors 0-63 are primary nodes, 64-127 are control nodes,
|
|
+ * and 128-191 are render nodes.
|
|
+ * After reaching the limit, we're allocating minors dynamically - first-come, first-serve.
|
|
+ * Accel nodes are using a distinct major, so the minors are allocated in continuous 0-MAX
|
|
+ * range.
|
|
+ */
|
|
#define DRM_MINOR_LIMIT(t) ({ \
|
|
typeof(t) _t = (t); \
|
|
_t == DRM_MINOR_ACCEL ? XA_LIMIT(0, ACCEL_MAX_MINORS) : XA_LIMIT(64 * _t, 64 * _t + 63); \
|
|
})
|
|
+#define DRM_EXTENDED_MINOR_LIMIT XA_LIMIT(192, (1 << MINORBITS) - 1)
|
|
|
|
static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
|
|
{
|
|
@@ -140,6 +149,9 @@ static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
|
|
|
|
r = xa_alloc(drm_minor_get_xa(type), &minor->index,
|
|
NULL, DRM_MINOR_LIMIT(type), GFP_KERNEL);
|
|
+ if (r == -EBUSY && (type == DRM_MINOR_PRIMARY || type == DRM_MINOR_RENDER))
|
|
+ r = xa_alloc(&drm_minors_xa, &minor->index,
|
|
+ NULL, DRM_EXTENDED_MINOR_LIMIT, GFP_KERNEL);
|
|
if (r < 0)
|
|
return r;
|
|
|
|
--
|
|
2.43.0
|
|
|
|
From 1383fefefcd735c11b9a7f6805ba94e4154382ce Mon Sep 17 00:00:00 2001
|
|
From: Sasha Levin <sashal@kernel.org>
|
|
Date: Fri, 19 Jul 2024 10:12:35 +0000
|
|
Subject: powercap/intel_rapl: Add support for AMD family 1Ah
|
|
|
|
From: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
|
|
|
|
[ Upstream commit 166df51097a258a14fe9e946e2157f3b75eeb3c2 ]
|
|
|
|
AMD Family 1Ah's RAPL MSRs are identical to Family 19h's,
|
|
extend Family 19h's support to Family 1Ah.
|
|
|
|
Signed-off-by: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
|
|
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
|
Link: https://patch.msgid.link/20240719101234.50827-1-Dhananjay.Ugwekar@amd.com
|
|
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
---
|
|
drivers/powercap/intel_rapl_common.c | 1 +
|
|
1 file changed, 1 insertion(+)
|
|
|
|
diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_rapl_common.c
|
|
index 3cffa6c795388..8b7a5a31e8c17 100644
|
|
--- a/drivers/powercap/intel_rapl_common.c
|
|
+++ b/drivers/powercap/intel_rapl_common.c
|
|
@@ -1285,6 +1285,7 @@ static const struct x86_cpu_id rapl_ids[] __initconst = {
|
|
|
|
X86_MATCH_VENDOR_FAM(AMD, 0x17, &rapl_defaults_amd),
|
|
X86_MATCH_VENDOR_FAM(AMD, 0x19, &rapl_defaults_amd),
|
|
+ X86_MATCH_VENDOR_FAM(AMD, 0x1A, &rapl_defaults_amd),
|
|
X86_MATCH_VENDOR_FAM(HYGON, 0x18, &rapl_defaults_amd),
|
|
{}
|
|
};
|
|
--
|
|
2.43.0
|
|
|
|
From 56984f36db8620fe5f1a6c3202befc257c456379 Mon Sep 17 00:00:00 2001
|
|
From: Sasha Levin <sashal@kernel.org>
|
|
Date: Tue, 30 Jul 2024 04:49:19 +0000
|
|
Subject: powercap/intel_rapl: Fix the energy-pkg event for AMD CPUs
|
|
|
|
From: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
|
|
|
|
[ Upstream commit 26096aed255fbac9501718174dbb24c935d8854e ]
|
|
|
|
After commit ("x86/cpu/topology: Add support for the AMD 0x80000026 leaf"),
|
|
on AMD processors that support extended CPUID leaf 0x80000026, the
|
|
topology_logical_die_id() macros, no longer returns package id, instead it
|
|
returns the CCD (Core Complex Die) id. This leads to the energy-pkg
|
|
event scope to be modified to CCD instead of package.
|
|
|
|
For more historical context, please refer to commit 32fb480e0a2c
|
|
("powercap/intel_rapl: Support multi-die/package"), which initially changed
|
|
the RAPL scope from package to die for all systems, as Intel systems
|
|
with Die enumeration have RAPL scope as die, and those without die
|
|
enumeration are not affected. So, all systems(Intel, AMD, Hygon), worked
|
|
correctly with topology_logical_die_id() until recently, but this changed
|
|
after the "0x80000026 leaf" commit mentioned above.
|
|
|
|
Future multi-die Intel systems will have package scope RAPL counters,
|
|
but they will be using TPMI RAPL interface, which is not affected by
|
|
this change.
|
|
|
|
Replacing topology_logical_die_id() with topology_physical_package_id()
|
|
conditionally only for AMD and Hygon fixes the energy-pkg event.
|
|
|
|
On an AMD 2 socket 8 CCD Zen4 server:
|
|
|
|
Before:
|
|
|
|
linux$ ls /sys/class/powercap/
|
|
intel-rapl intel-rapl:4 intel-rapl:8:0 intel-rapl:d
|
|
intel-rapl:0 intel-rapl:4:0 intel-rapl:9 intel-rapl:d:0
|
|
intel-rapl:0:0 intel-rapl:5 intel-rapl:9:0 intel-rapl:e
|
|
intel-rapl:1 intel-rapl:5:0 intel-rapl:a intel-rapl:e:0
|
|
intel-rapl:1:0 intel-rapl:6 intel-rapl:a:0 intel-rapl:f
|
|
intel-rapl:2 intel-rapl:6:0 intel-rapl:b intel-rapl:f:0
|
|
intel-rapl:2:0 intel-rapl:7 intel-rapl:b:0
|
|
intel-rapl:3 intel-rapl:7:0 intel-rapl:c
|
|
intel-rapl:3:0 intel-rapl:8 intel-rapl:c:0
|
|
|
|
After:
|
|
|
|
linux$ ls /sys/class/powercap/
|
|
intel-rapl intel-rapl:0 intel-rapl:0:0 intel-rapl:1 intel-rapl:1:0
|
|
|
|
Only one sysfs entry per-event per-package is created after this change.
|
|
|
|
Fixes: 63edbaa48a57 ("x86/cpu/topology: Add support for the AMD 0x80000026 leaf")
|
|
Reported-by: Michael Larabel <michael@michaellarabel.com>
|
|
Signed-off-by: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
|
|
Reviewed-by: Zhang Rui <rui.zhang@intel.com>
|
|
Link: https://patch.msgid.link/20240730044917.4680-3-Dhananjay.Ugwekar@amd.com
|
|
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
---
|
|
drivers/powercap/intel_rapl_common.c | 34 ++++++++++++++++++++++++----
|
|
1 file changed, 30 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_rapl_common.c
|
|
index 8b7a5a31e8c17..5a6d05bf847ce 100644
|
|
--- a/drivers/powercap/intel_rapl_common.c
|
|
+++ b/drivers/powercap/intel_rapl_common.c
|
|
@@ -2129,6 +2129,21 @@ void rapl_remove_package(struct rapl_package *rp)
|
|
}
|
|
EXPORT_SYMBOL_GPL(rapl_remove_package);
|
|
|
|
+/*
|
|
+ * RAPL Package energy counter scope:
|
|
+ * 1. AMD/HYGON platforms use per-PKG package energy counter
|
|
+ * 2. For Intel platforms
|
|
+ * 2.1 CLX-AP platform has per-DIE package energy counter
|
|
+ * 2.2 Other platforms that uses MSR RAPL are single die systems so the
|
|
+ * package energy counter can be considered as per-PKG/per-DIE,
|
|
+ * here it is considered as per-DIE.
|
|
+ * 2.3 New platforms that use TPMI RAPL doesn't care about the
|
|
+ * scope because they are not MSR/CPU based.
|
|
+ */
|
|
+#define rapl_msrs_are_pkg_scope() \
|
|
+ (boot_cpu_data.x86_vendor == X86_VENDOR_AMD || \
|
|
+ boot_cpu_data.x86_vendor == X86_VENDOR_HYGON)
|
|
+
|
|
/* caller to ensure CPU hotplug lock is held */
|
|
struct rapl_package *rapl_find_package_domain_cpuslocked(int id, struct rapl_if_priv *priv,
|
|
bool id_is_cpu)
|
|
@@ -2136,8 +2151,14 @@ struct rapl_package *rapl_find_package_domain_cpuslocked(int id, struct rapl_if_
|
|
struct rapl_package *rp;
|
|
int uid;
|
|
|
|
- if (id_is_cpu)
|
|
- uid = topology_logical_die_id(id);
|
|
+ if (id_is_cpu) {
|
|
+ uid = rapl_msrs_are_pkg_scope() ?
|
|
+ topology_physical_package_id(id) : topology_logical_die_id(id);
|
|
+ if (uid < 0) {
|
|
+ pr_err("topology_logical_(package/die)_id() returned a negative value");
|
|
+ return ERR_PTR(-EINVAL);
|
|
+ }
|
|
+ }
|
|
else
|
|
uid = id;
|
|
|
|
@@ -2169,9 +2190,14 @@ struct rapl_package *rapl_add_package_cpuslocked(int id, struct rapl_if_priv *pr
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
if (id_is_cpu) {
|
|
- rp->id = topology_logical_die_id(id);
|
|
+ rp->id = rapl_msrs_are_pkg_scope() ?
|
|
+ topology_physical_package_id(id) : topology_logical_die_id(id);
|
|
+ if ((int)(rp->id) < 0) {
|
|
+ pr_err("topology_logical_(package/die)_id() returned a negative value");
|
|
+ return ERR_PTR(-EINVAL);
|
|
+ }
|
|
rp->lead_cpu = id;
|
|
- if (topology_max_dies_per_package() > 1)
|
|
+ if (!rapl_msrs_are_pkg_scope() && topology_max_dies_per_package() > 1)
|
|
snprintf(rp->name, PACKAGE_DOMAIN_NAME_LENGTH, "package-%d-die-%d",
|
|
topology_physical_package_id(id), topology_die_id(id));
|
|
else
|
|
--
|
|
2.43.0
|
|
|
|
From 43fb7040567ced74430fe800777f88c5a82a6f53 Mon Sep 17 00:00:00 2001
|
|
From: Sasha Levin <sashal@kernel.org>
|
|
Date: Fri, 9 Aug 2024 06:08:16 +0000
|
|
Subject: cpufreq/amd-pstate: Add the missing cpufreq_cpu_put()
|
|
|
|
From: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
|
|
|
|
[ Upstream commit 49243adc715e6ae34d6cc003827e63bcf5b3a21d ]
|
|
|
|
Fix the reference counting of cpufreq_policy object in amd_pstate_update()
|
|
function by adding the missing cpufreq_cpu_put().
|
|
|
|
Fixes: e8f555daacd3 ("cpufreq/amd-pstate: fix setting policy current frequency value")
|
|
Signed-off-by: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
|
|
Reviewed-by: Perry Yuan <perry.yuan@amd.com>
|
|
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
---
|
|
drivers/cpufreq/amd-pstate.c | 5 ++++-
|
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
|
|
index 259a917da75f3..073ca9caf52ac 100644
|
|
--- a/drivers/cpufreq/amd-pstate.c
|
|
+++ b/drivers/cpufreq/amd-pstate.c
|
|
@@ -554,12 +554,15 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
|
|
}
|
|
|
|
if (value == prev)
|
|
- return;
|
|
+ goto cpufreq_policy_put;
|
|
|
|
WRITE_ONCE(cpudata->cppc_req_cached, value);
|
|
|
|
amd_pstate_update_perf(cpudata, min_perf, des_perf,
|
|
max_perf, fast_switch);
|
|
+
|
|
+cpufreq_policy_put:
|
|
+ cpufreq_cpu_put(policy);
|
|
}
|
|
|
|
static int amd_pstate_verify(struct cpufreq_policy_data *policy)
|
|
--
|
|
2.43.0
|
|
|
|
From 7052622fccb1efb850c6b55de477f65d03525a30 Mon Sep 17 00:00:00 2001
|
|
From: Dan Carpenter <dan.carpenter@linaro.org>
|
|
Date: Sat, 14 Sep 2024 12:56:51 +0300
|
|
Subject: netfilter: nft_socket: Fix a NULL vs IS_ERR() bug in nft_socket_cgroup_subtree_level()
|
|
|
|
From: Dan Carpenter <dan.carpenter@linaro.org>
|
|
|
|
commit 7052622fccb1efb850c6b55de477f65d03525a30 upstream.
|
|
|
|
The cgroup_get_from_path() function never returns NULL, it returns error
|
|
pointers. Update the error handling to match.
|
|
|
|
Fixes: 7f3287db6543 ("netfilter: nft_socket: make cgroupsv2 matching work with namespaces")
|
|
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
|
|
Acked-by: Florian Westphal <fw@strlen.de>
|
|
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
Link: https://patch.msgid.link/bbc0c4e0-05cc-4f44-8797-2f4b3920a820@stanley.mountain
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
net/netfilter/nft_socket.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
--- a/net/netfilter/nft_socket.c
|
|
+++ b/net/netfilter/nft_socket.c
|
|
@@ -61,8 +61,8 @@ static noinline int nft_socket_cgroup_su
|
|
struct cgroup *cgrp = cgroup_get_from_path("/");
|
|
int level;
|
|
|
|
- if (!cgrp)
|
|
- return -ENOENT;
|
|
+ if (IS_ERR(cgrp))
|
|
+ return PTR_ERR(cgrp);
|
|
|
|
level = cgrp->level;
|
|
|
|
From 7ffaa200251871980af12e57649ad57c70bf0f43 Mon Sep 17 00:00:00 2001
|
|
From: Kiran K <kiran.k@intel.com>
|
|
Date: Thu, 12 Sep 2024 16:21:00 +0530
|
|
Subject: Bluetooth: btintel_pcie: Allocate memory for driver private data
|
|
|
|
From: Kiran K <kiran.k@intel.com>
|
|
|
|
commit 7ffaa200251871980af12e57649ad57c70bf0f43 upstream.
|
|
|
|
Fix driver not allocating memory for struct btintel_data which is used
|
|
to store internal data.
|
|
|
|
Fixes: 6e65a09f9275 ("Bluetooth: btintel_pcie: Add *setup* function to download firmware")
|
|
Signed-off-by: Kiran K <kiran.k@intel.com>
|
|
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
|
|
Cc: Thomas Leroy <thomas.leroy@suse.com>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/bluetooth/btintel_pcie.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
--- a/drivers/bluetooth/btintel_pcie.c
|
|
+++ b/drivers/bluetooth/btintel_pcie.c
|
|
@@ -1208,7 +1208,7 @@ static int btintel_pcie_setup_hdev(struc
|
|
int err;
|
|
struct hci_dev *hdev;
|
|
|
|
- hdev = hci_alloc_dev();
|
|
+ hdev = hci_alloc_dev_priv(sizeof(struct btintel_data));
|
|
if (!hdev)
|
|
return -ENOMEM;
|
|
|
|
From c35fad6f7e0d69b0e9e7e196bdbca3ed03ac24ea Mon Sep 17 00:00:00 2001
|
|
From: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
|
|
Date: Wed, 7 Aug 2024 14:21:48 +0530
|
|
Subject: ASoC: amd: acp: add ZSC control register programming sequence
|
|
|
|
From: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
|
|
|
|
commit c35fad6f7e0d69b0e9e7e196bdbca3ed03ac24ea upstream.
|
|
|
|
Add ZSC Control register programming sequence for ACP D0 and D3 state
|
|
transitions for ACP7.0 onwards. This will allow ACP to enter low power
|
|
state when ACP enters D3 state. When ACP enters D0 State, ZSC control
|
|
should be disabled.
|
|
|
|
Tested-by: Leo Li <sunpeng.li@amd.com>
|
|
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
|
|
Link: https://patch.msgid.link/20240807085154.1987681-1-Vijendar.Mukunda@amd.com
|
|
Signed-off-by: Mark Brown <broonie@kernel.org>
|
|
Cc: Mario Limonciello <mario.limonciello@amd.com>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
sound/soc/amd/acp/acp-legacy-common.c | 5 +++++
|
|
sound/soc/amd/acp/amd.h | 2 ++
|
|
2 files changed, 7 insertions(+)
|
|
|
|
--- a/sound/soc/amd/acp/acp-legacy-common.c
|
|
+++ b/sound/soc/amd/acp/acp-legacy-common.c
|
|
@@ -321,6 +321,8 @@ int acp_init(struct acp_chip_info *chip)
|
|
pr_err("ACP reset failed\n");
|
|
return ret;
|
|
}
|
|
+ if (chip->acp_rev >= ACP70_DEV)
|
|
+ writel(0, chip->base + ACP_ZSC_DSP_CTRL);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_NS_GPL(acp_init, SND_SOC_ACP_COMMON);
|
|
@@ -336,6 +338,9 @@ int acp_deinit(struct acp_chip_info *chi
|
|
|
|
if (chip->acp_rev != ACP70_DEV)
|
|
writel(0, chip->base + ACP_CONTROL);
|
|
+
|
|
+ if (chip->acp_rev >= ACP70_DEV)
|
|
+ writel(0x01, chip->base + ACP_ZSC_DSP_CTRL);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_NS_GPL(acp_deinit, SND_SOC_ACP_COMMON);
|
|
--- a/sound/soc/amd/acp/amd.h
|
|
+++ b/sound/soc/amd/acp/amd.h
|
|
@@ -103,6 +103,8 @@
|
|
#define ACP70_PGFSM_CONTROL ACP6X_PGFSM_CONTROL
|
|
#define ACP70_PGFSM_STATUS ACP6X_PGFSM_STATUS
|
|
|
|
+#define ACP_ZSC_DSP_CTRL 0x0001014
|
|
+#define ACP_ZSC_STS 0x0001018
|
|
#define ACP_SOFT_RST_DONE_MASK 0x00010001
|
|
|
|
#define ACP_PGFSM_CNTL_POWER_ON_MASK 0xffffffff
|
|
From 83bdfcbdbe5d901c5fa432decf12e1725a840a56 Mon Sep 17 00:00:00 2001
|
|
From: Keith Busch <kbusch@kernel.org>
|
|
Date: Wed, 11 Sep 2024 10:39:59 -0700
|
|
Subject: nvme-pci: qdepth 1 quirk
|
|
|
|
From: Keith Busch <kbusch@kernel.org>
|
|
|
|
commit 83bdfcbdbe5d901c5fa432decf12e1725a840a56 upstream.
|
|
|
|
Another device has been reported to be unreliable if we have more than
|
|
one outstanding command. In this new case, data corruption may occur.
|
|
Since we have two devices now needing this quirky behavior, make a
|
|
generic quirk flag.
|
|
|
|
The same Apple quirk is clearly not "temporary", so update the comment
|
|
while moving it.
|
|
|
|
Link: https://lore.kernel.org/linux-nvme/191d810a4e3.fcc6066c765804.973611676137075390@collabora.com/
|
|
Reported-by: Robert Beckett <bob.beckett@collabora.com>
|
|
Reviewed-by: Christoph Hellwig hch@lst.de>
|
|
Signed-off-by: Keith Busch <kbusch@kernel.org>
|
|
Cc: "Gagniuc, Alexandru" <alexandru.gagniuc@hp.com>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/nvme/host/nvme.h | 5 +++++
|
|
drivers/nvme/host/pci.c | 18 +++++++++---------
|
|
2 files changed, 14 insertions(+), 9 deletions(-)
|
|
|
|
--- a/drivers/nvme/host/nvme.h
|
|
+++ b/drivers/nvme/host/nvme.h
|
|
@@ -91,6 +91,11 @@ enum nvme_quirks {
|
|
NVME_QUIRK_NO_DEEPEST_PS = (1 << 5),
|
|
|
|
/*
|
|
+ * Problems seen with concurrent commands
|
|
+ */
|
|
+ NVME_QUIRK_QDEPTH_ONE = (1 << 6),
|
|
+
|
|
+ /*
|
|
* Set MEDIUM priority on SQ creation
|
|
*/
|
|
NVME_QUIRK_MEDIUM_PRIO_SQ = (1 << 7),
|
|
--- a/drivers/nvme/host/pci.c
|
|
+++ b/drivers/nvme/host/pci.c
|
|
@@ -2563,15 +2563,8 @@ static int nvme_pci_enable(struct nvme_d
|
|
else
|
|
dev->io_sqes = NVME_NVM_IOSQES;
|
|
|
|
- /*
|
|
- * Temporary fix for the Apple controller found in the MacBook8,1 and
|
|
- * some MacBook7,1 to avoid controller resets and data loss.
|
|
- */
|
|
- if (pdev->vendor == PCI_VENDOR_ID_APPLE && pdev->device == 0x2001) {
|
|
+ if (dev->ctrl.quirks & NVME_QUIRK_QDEPTH_ONE) {
|
|
dev->q_depth = 2;
|
|
- dev_warn(dev->ctrl.device, "detected Apple NVMe controller, "
|
|
- "set queue depth=%u to work around controller resets\n",
|
|
- dev->q_depth);
|
|
} else if (pdev->vendor == PCI_VENDOR_ID_SAMSUNG &&
|
|
(pdev->device == 0xa821 || pdev->device == 0xa822) &&
|
|
NVME_CAP_MQES(dev->ctrl.cap) == 0) {
|
|
@@ -3442,6 +3435,8 @@ static const struct pci_device_id nvme_i
|
|
NVME_QUIRK_BOGUS_NID, },
|
|
{ PCI_VDEVICE(REDHAT, 0x0010), /* Qemu emulated controller */
|
|
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
|
+ { PCI_DEVICE(0x1217, 0x8760), /* O2 Micro 64GB Steam Deck */
|
|
+ .driver_data = NVME_QUIRK_QDEPTH_ONE },
|
|
{ PCI_DEVICE(0x126f, 0x2262), /* Silicon Motion generic */
|
|
.driver_data = NVME_QUIRK_NO_DEEPEST_PS |
|
|
NVME_QUIRK_BOGUS_NID, },
|
|
@@ -3576,7 +3571,12 @@ static const struct pci_device_id nvme_i
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0xcd02),
|
|
.driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001),
|
|
- .driver_data = NVME_QUIRK_SINGLE_VECTOR },
|
|
+ /*
|
|
+ * Fix for the Apple controller found in the MacBook8,1 and
|
|
+ * some MacBook7,1 to avoid controller resets and data loss.
|
|
+ */
|
|
+ .driver_data = NVME_QUIRK_SINGLE_VECTOR |
|
|
+ NVME_QUIRK_QDEPTH_ONE },
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) },
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2005),
|
|
.driver_data = NVME_QUIRK_SINGLE_VECTOR |
|
|
From 7d47d22444bb7dc1b6d768904a22070ef35e1fc0 Mon Sep 17 00:00:00 2001
|
|
From: Junhao Xie <bigfoot@classfun.cn>
|
|
Date: Tue, 3 Sep 2024 23:06:38 +0800
|
|
Subject: USB: serial: pl2303: add device id for Macrosilicon MS3020
|
|
|
|
From: Junhao Xie <bigfoot@classfun.cn>
|
|
|
|
commit 7d47d22444bb7dc1b6d768904a22070ef35e1fc0 upstream.
|
|
|
|
Add the device id for the Macrosilicon MS3020 which is a
|
|
PL2303HXN based device.
|
|
|
|
Signed-off-by: Junhao Xie <bigfoot@classfun.cn>
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Johan Hovold <johan@kernel.org>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/usb/serial/pl2303.c | 1 +
|
|
drivers/usb/serial/pl2303.h | 4 ++++
|
|
2 files changed, 5 insertions(+)
|
|
|
|
--- a/drivers/usb/serial/pl2303.c
|
|
+++ b/drivers/usb/serial/pl2303.c
|
|
@@ -118,6 +118,7 @@ static const struct usb_device_id id_tab
|
|
{ USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
|
|
{ USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) },
|
|
{ USB_DEVICE(IBM_VENDOR_ID, IBM_PRODUCT_ID) },
|
|
+ { USB_DEVICE(MACROSILICON_VENDOR_ID, MACROSILICON_MS3020_PRODUCT_ID) },
|
|
{ } /* Terminating entry */
|
|
};
|
|
|
|
--- a/drivers/usb/serial/pl2303.h
|
|
+++ b/drivers/usb/serial/pl2303.h
|
|
@@ -171,3 +171,7 @@
|
|
/* Allied Telesis VT-Kit3 */
|
|
#define AT_VENDOR_ID 0x0caa
|
|
#define AT_VTKIT3_PRODUCT_ID 0x3001
|
|
+
|
|
+/* Macrosilicon MS3020 */
|
|
+#define MACROSILICON_VENDOR_ID 0x345f
|
|
+#define MACROSILICON_MS3020_PRODUCT_ID 0x3020
|
|
From 625fa77151f00c1bd00d34d60d6f2e710b3f9aad Mon Sep 17 00:00:00 2001
|
|
From: Edward Adam Davis <eadavis@qq.com>
|
|
Date: Sun, 8 Sep 2024 17:17:41 +0800
|
|
Subject: USB: usbtmc: prevent kernel-usb-infoleak
|
|
|
|
From: Edward Adam Davis <eadavis@qq.com>
|
|
|
|
commit 625fa77151f00c1bd00d34d60d6f2e710b3f9aad upstream.
|
|
|
|
The syzbot reported a kernel-usb-infoleak in usbtmc_write,
|
|
we need to clear the structure before filling fields.
|
|
|
|
Fixes: 4ddc645f40e9 ("usb: usbtmc: Add ioctl for vendor specific write")
|
|
Reported-and-tested-by: syzbot+9d34f80f841e948c3fdb@syzkaller.appspotmail.com
|
|
Closes: https://syzkaller.appspot.com/bug?extid=9d34f80f841e948c3fdb
|
|
Signed-off-by: Edward Adam Davis <eadavis@qq.com>
|
|
Cc: stable <stable@kernel.org>
|
|
Link: https://lore.kernel.org/r/tencent_9649AA6EC56EDECCA8A7D106C792D1C66B06@qq.com
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/usb/class/usbtmc.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
--- a/drivers/usb/class/usbtmc.c
|
|
+++ b/drivers/usb/class/usbtmc.c
|
|
@@ -754,7 +754,7 @@ static struct urb *usbtmc_create_urb(voi
|
|
if (!urb)
|
|
return NULL;
|
|
|
|
- dmabuf = kmalloc(bufsize, GFP_KERNEL);
|
|
+ dmabuf = kzalloc(bufsize, GFP_KERNEL);
|
|
if (!dmabuf) {
|
|
usb_free_urb(urb);
|
|
return NULL;
|