Commit c2f156bf authored by Dave Jiang's avatar Dave Jiang Committed by Vinod Koul
Browse files

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: default avatarTony Zhu <tony.zhu@intel.com>
Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
Co-developed-by: default avatarFenghua Yu <fenghua.yu@intel.com>
Signed-off-by: default avatarFenghua Yu <fenghua.yu@intel.com>
Link: https://lore.kernel.org/r/20230407203143.2189681-8-fenghua.yu@intel.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 2f30decd
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -274,6 +274,15 @@ struct idxd_evl {
	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_dev idxd_dev;
	struct idxd_driver_data *data;
@@ -331,6 +340,7 @@ struct idxd_device {

	unsigned long *opcap_bmap;
	struct idxd_evl *evl;
	struct kmem_cache *evl_cache;

	struct dentry *dbgfs_dir;
	struct dentry *dbgfs_evl_file;
+9 −0
Original line number Diff line number Diff line
@@ -345,6 +345,15 @@ static int idxd_init_evl(struct idxd_device *idxd)

	spin_lock_init(&evl->lock);
	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;
	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -1718,6 +1718,7 @@ static void idxd_conf_device_release(struct device *dev)
	kfree(idxd->wqs);
	kfree(idxd->engines);
	kfree(idxd->evl);
	kmem_cache_destroy(idxd->evl_cache);
	ida_free(&idxd_ida, idxd->id);
	bitmap_free(idxd->opcap_bmap);
	kfree(idxd);