* [PATCH] accel/ivpu: use kmem_cache for IPC rx_msg allocations
@ 2026-06-11 5:52 Karol Wachowski
2026-06-11 6:04 ` sashiko-bot
0 siblings, 1 reply; 3+ messages in thread
From: Karol Wachowski @ 2026-06-11 5:52 UTC (permalink / raw)
To: dri-devel
Cc: oded.gabbay, jeff.hugo, lizhi.hou, andrzej.kacprowski,
dawid.osuchowski, Karol Wachowski
Use a dedicated kmem_cache for ivpu_ipc_rx_msg allocations instead of
the generic kmalloc. This gives each CPU its own hot freelist for this
object type, reducing allocator overhead in the IRQ handler and threaded
IRQ path where rx_msg objects are allocated and freed at high frequency.
Signed-off-by: Karol Wachowski <karol.wachowski@linux.intel.com>
---
drivers/accel/ivpu/ivpu_ipc.c | 17 ++++++++++++++---
drivers/accel/ivpu/ivpu_ipc.h | 1 +
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/drivers/accel/ivpu/ivpu_ipc.c b/drivers/accel/ivpu/ivpu_ipc.c
index 64864e9d8a0a..c5f11be86c8c 100644
--- a/drivers/accel/ivpu/ivpu_ipc.c
+++ b/drivers/accel/ivpu/ivpu_ipc.c
@@ -146,7 +146,7 @@ ivpu_ipc_rx_msg_add(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
lockdep_assert_held(&ipc->cons_lock);
- rx_msg = kzalloc_obj(*rx_msg, GFP_ATOMIC);
+ rx_msg = kmem_cache_zalloc(ipc->rx_msg_cache, GFP_ATOMIC);
if (!rx_msg) {
ivpu_ipc_rx_mark_free(vdev, ipc_hdr, jsm_msg);
return;
@@ -174,7 +174,7 @@ ivpu_ipc_rx_msg_del(struct ivpu_device *vdev, struct ivpu_ipc_rx_msg *rx_msg)
list_del(&rx_msg->link);
ivpu_ipc_rx_mark_free(vdev, rx_msg->ipc_hdr, rx_msg->jsm_msg);
atomic_dec(&vdev->ipc->rx_msg_count);
- kfree(rx_msg);
+ kmem_cache_free(vdev->ipc->rx_msg_cache, rx_msg);
}
void ivpu_ipc_consumer_add(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
@@ -490,10 +490,18 @@ int ivpu_ipc_init(struct ivpu_device *vdev)
struct ivpu_ipc_info *ipc = vdev->ipc;
int ret;
+ ipc->rx_msg_cache = kmem_cache_create("ivpu_ipc_rx_msg", sizeof(struct ivpu_ipc_rx_msg), 0,
+ SLAB_HWCACHE_ALIGN, NULL);
+ if (!ipc->rx_msg_cache) {
+ ivpu_err(vdev, "Failed to create rx_msg_cache\n");
+ return -ENOMEM;
+ }
+
ipc->mem_tx = ivpu_bo_create_global(vdev, SZ_16K, DRM_IVPU_BO_WC | DRM_IVPU_BO_MAPPABLE);
if (!ipc->mem_tx) {
ivpu_err(vdev, "Failed to allocate mem_tx\n");
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto err_destroy_cache;
}
ipc->mem_rx = ivpu_bo_create_global(vdev, SZ_16K, DRM_IVPU_BO_WC | DRM_IVPU_BO_MAPPABLE);
@@ -532,6 +540,8 @@ int ivpu_ipc_init(struct ivpu_device *vdev)
ivpu_bo_free(ipc->mem_rx);
err_free_tx:
ivpu_bo_free(ipc->mem_tx);
+err_destroy_cache:
+ kmem_cache_destroy(ipc->rx_msg_cache);
return ret;
}
@@ -544,6 +554,7 @@ void ivpu_ipc_fini(struct ivpu_device *vdev)
drm_WARN_ON(&vdev->drm, atomic_read(&ipc->rx_msg_count) > 0);
ivpu_ipc_mem_fini(vdev);
+ kmem_cache_destroy(ipc->rx_msg_cache);
}
void ivpu_ipc_enable(struct ivpu_device *vdev)
diff --git a/drivers/accel/ivpu/ivpu_ipc.h b/drivers/accel/ivpu/ivpu_ipc.h
index 1c9cf67f1e5b..fb3e5816ca50 100644
--- a/drivers/accel/ivpu/ivpu_ipc.h
+++ b/drivers/accel/ivpu/ivpu_ipc.h
@@ -70,6 +70,7 @@ struct ivpu_ipc_info {
struct gen_pool *mm_tx;
struct ivpu_bo *mem_tx;
struct ivpu_bo *mem_rx;
+ struct kmem_cache *rx_msg_cache;
atomic_t rx_msg_count;
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] accel/ivpu: use kmem_cache for IPC rx_msg allocations
2026-06-11 5:52 [PATCH] accel/ivpu: use kmem_cache for IPC rx_msg allocations Karol Wachowski
@ 2026-06-11 6:04 ` sashiko-bot
2026-06-11 7:58 ` Wachowski, Karol
0 siblings, 1 reply; 3+ messages in thread
From: sashiko-bot @ 2026-06-11 6:04 UTC (permalink / raw)
To: Karol Wachowski; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Duplicate kmem_cache name on multi-device systems
--
commit 41c16409be6704d2ef5ab21270390fee65dcf7aa
Author: Karol Wachowski <karol.wachowski@linux.intel.com>
accel/ivpu: use kmem_cache for IPC rx_msg allocations
This commit introduces a dedicated kmem_cache for allocating IPC rx_msg
objects to reduce allocator overhead in IRQ handlers.
> diff --git a/drivers/accel/ivpu/ivpu_ipc.c b/drivers/accel/ivpu/ivpu_ipc.c
> --- a/drivers/accel/ivpu/ivpu_ipc.c
> +++ b/drivers/accel/ivpu/ivpu_ipc.c
[ ... ]
> @@ -490,10 +490,18 @@ int ivpu_ipc_init(struct ivpu_device *vdev)
> struct ivpu_ipc_info *ipc = vdev->ipc;
> int ret;
>
> + ipc->rx_msg_cache = kmem_cache_create("ivpu_ipc_rx_msg", sizeof(struct ivpu_ipc_rx_msg), 0,
> + SLAB_HWCACHE_ALIGN, NULL);
[Severity: Medium]
Will this cause a name collision if there are multiple ivpu devices in the
same system?
Since this is initialized per-device in ivpu_ipc_init(), calling
kmem_cache_create() multiple times with the same hardcoded string
"ivpu_ipc_rx_msg" can trigger a kernel WARN in kmem_cache_sanity_check()
when CONFIG_DEBUG_VM is enabled.
Furthermore, if SLUB merging is disabled via boot parameters or config,
the duplicate name causes a sysfs kobject collision, leading to a sysfs
warning and a failure to register the cache in sysfs.
Should this cache name be made unique per device using dev_name(), or
should the cache be a global singleton?
> + if (!ipc->rx_msg_cache) {
> + ivpu_err(vdev, "Failed to create rx_msg_cache\n");
> + return -ENOMEM;
> + }
> +
> ipc->mem_tx = ivpu_bo_create_global(vdev, SZ_16K, DRM_IVPU_BO_WC | DRM_IVPU_BO_MAPPABLE);
> if (!ipc->mem_tx) {
> ivpu_err(vdev, "Failed to allocate mem_tx\n");
> - return -ENOMEM;
> + ret = -ENOMEM;
> + goto err_destroy_cache;
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260611055214.948748-1-karol.wachowski@linux.intel.com?part=1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] accel/ivpu: use kmem_cache for IPC rx_msg allocations
2026-06-11 6:04 ` sashiko-bot
@ 2026-06-11 7:58 ` Wachowski, Karol
0 siblings, 0 replies; 3+ messages in thread
From: Wachowski, Karol @ 2026-06-11 7:58 UTC (permalink / raw)
To: sashiko-reviews; +Cc: dri-devel
On 11-Jun-26 8:04, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] Duplicate kmem_cache name on multi-device systems
> --
>
> commit 41c16409be6704d2ef5ab21270390fee65dcf7aa
> Author: Karol Wachowski <karol.wachowski@linux.intel.com>
>
> accel/ivpu: use kmem_cache for IPC rx_msg allocations
>
> This commit introduces a dedicated kmem_cache for allocating IPC rx_msg
> objects to reduce allocator overhead in IRQ handlers.
>
>> diff --git a/drivers/accel/ivpu/ivpu_ipc.c b/drivers/accel/ivpu/ivpu_ipc.c
>> --- a/drivers/accel/ivpu/ivpu_ipc.c
>> +++ b/drivers/accel/ivpu/ivpu_ipc.c
>
> [ ... ]
>
>> @@ -490,10 +490,18 @@ int ivpu_ipc_init(struct ivpu_device *vdev)
>> struct ivpu_ipc_info *ipc = vdev->ipc;
>> int ret;
>>
>> + ipc->rx_msg_cache = kmem_cache_create("ivpu_ipc_rx_msg", sizeof(struct ivpu_ipc_rx_msg), 0,
>> + SLAB_HWCACHE_ALIGN, NULL);
>
> [Severity: Medium]
> Will this cause a name collision if there are multiple ivpu devices in the
> same system?
In practice, no:
1. There is a single NPU instance per system, so ivpu_ipc_init()
runs once and the cache is created once
2. Even with multiple instances it's safe, because the cache is
mergeable (only SLAB_HWCACHE_ALIGN flag). On the merge path the name is
registered only as a sysfs alias via sysfs_slab_alias(). So the
CONFIG_DEBUG_VM duplicate-name check (which scans slab_caches by name)
shouldn't fire.
The WARN and sysfs collision require slab_nomerge and more than one
device which doesn't occur for this driver.
>
> Since this is initialized per-device in ivpu_ipc_init(), calling
> kmem_cache_create() multiple times with the same hardcoded string
> "ivpu_ipc_rx_msg" can trigger a kernel WARN in kmem_cache_sanity_check()
> when CONFIG_DEBUG_VM is enabled.
>
> Furthermore, if SLUB merging is disabled via boot parameters or config,
> the duplicate name causes a sysfs kobject collision, leading to a sysfs
> warning and a failure to register the cache in sysfs.
>
> Should this cache name be made unique per device using dev_name(), or
> should the cache be a global singleton?
>
>> + if (!ipc->rx_msg_cache) {
>> + ivpu_err(vdev, "Failed to create rx_msg_cache\n");
>> + return -ENOMEM;
>> + }
>> +
>> ipc->mem_tx = ivpu_bo_create_global(vdev, SZ_16K, DRM_IVPU_BO_WC | DRM_IVPU_BO_MAPPABLE);
>> if (!ipc->mem_tx) {
>> ivpu_err(vdev, "Failed to allocate mem_tx\n");
>> - return -ENOMEM;
>> + ret = -ENOMEM;
>> + goto err_destroy_cache;
>> }
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-06-11 7:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-11 5:52 [PATCH] accel/ivpu: use kmem_cache for IPC rx_msg allocations Karol Wachowski
2026-06-11 6:04 ` sashiko-bot
2026-06-11 7:58 ` Wachowski, Karol
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.