dmaengine: idxd: create kmem cache for event log fault items
Add a kmem cache per device for allocating event log fault context. The context allows an event log entry to be copied and passed to a software workqueue to be processed. Due to each device can have different sized event log entry depending on device type, it's not possible to have a global kmem cache. Tested-by: Tony Zhu <tony.zhu@intel.com> Signed-off-by: Dave Jiang <dave.jiang@intel.com> Co-developed-by: Fenghua Yu <fenghua.yu@intel.com> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> Link: https://lore.kernel.org/r/20230407203143.2189681-8-fenghua.yu@intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
2f30decd2f
commit
c2f156bf16
|
@ -274,6 +274,15 @@ struct idxd_evl {
|
||||||
u16 head;
|
u16 head;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct idxd_evl_fault {
|
||||||
|
struct work_struct work;
|
||||||
|
struct idxd_wq *wq;
|
||||||
|
u8 status;
|
||||||
|
|
||||||
|
/* make this last member always */
|
||||||
|
struct __evl_entry entry[];
|
||||||
|
};
|
||||||
|
|
||||||
struct idxd_device {
|
struct idxd_device {
|
||||||
struct idxd_dev idxd_dev;
|
struct idxd_dev idxd_dev;
|
||||||
struct idxd_driver_data *data;
|
struct idxd_driver_data *data;
|
||||||
|
@ -331,6 +340,7 @@ struct idxd_device {
|
||||||
|
|
||||||
unsigned long *opcap_bmap;
|
unsigned long *opcap_bmap;
|
||||||
struct idxd_evl *evl;
|
struct idxd_evl *evl;
|
||||||
|
struct kmem_cache *evl_cache;
|
||||||
|
|
||||||
struct dentry *dbgfs_dir;
|
struct dentry *dbgfs_dir;
|
||||||
struct dentry *dbgfs_evl_file;
|
struct dentry *dbgfs_evl_file;
|
||||||
|
|
|
@ -345,6 +345,15 @@ static int idxd_init_evl(struct idxd_device *idxd)
|
||||||
|
|
||||||
spin_lock_init(&evl->lock);
|
spin_lock_init(&evl->lock);
|
||||||
evl->size = IDXD_EVL_SIZE_MIN;
|
evl->size = IDXD_EVL_SIZE_MIN;
|
||||||
|
|
||||||
|
idxd->evl_cache = kmem_cache_create(dev_name(idxd_confdev(idxd)),
|
||||||
|
sizeof(struct idxd_evl_fault) + evl_ent_size(idxd),
|
||||||
|
0, 0, NULL);
|
||||||
|
if (!idxd->evl_cache) {
|
||||||
|
kfree(evl);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
idxd->evl = evl;
|
idxd->evl = evl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1718,6 +1718,7 @@ static void idxd_conf_device_release(struct device *dev)
|
||||||
kfree(idxd->wqs);
|
kfree(idxd->wqs);
|
||||||
kfree(idxd->engines);
|
kfree(idxd->engines);
|
||||||
kfree(idxd->evl);
|
kfree(idxd->evl);
|
||||||
|
kmem_cache_destroy(idxd->evl_cache);
|
||||||
ida_free(&idxd_ida, idxd->id);
|
ida_free(&idxd_ida, idxd->id);
|
||||||
bitmap_free(idxd->opcap_bmap);
|
bitmap_free(idxd->opcap_bmap);
|
||||||
kfree(idxd);
|
kfree(idxd);
|
||||||
|
|
Loading…
Reference in New Issue