Skip to content

Commit

Permalink
tools/testing/cxl: Add Dynamic Capacity events
Browse files Browse the repository at this point in the history
OS software needs to be alerted when new extents arrive on a Dynamic
Capacity Device (DCD).  On test DCDs extents are added through sysfs.

Add events on DCD extent injection.  Directly call the event irq
callback to simulate irqs to process the test extents.

Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Jonathan.Cameron@huawei.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
---
Changes for v1
[Jonathan: s/send_dc_event/log_dc_event/]
[Jonathan: use devm_kmemdup]
[iweiny: adjust structure definitions based on earlier patch rework]
  • Loading branch information
weiny2 committed Oct 31, 2023
1 parent 4f8e0b8 commit d3da9e8
Showing 1 changed file with 51 additions and 0 deletions.
51 changes: 51 additions & 0 deletions tools/testing/cxl/test/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -2080,6 +2080,41 @@ static bool new_extent_valid(struct device *dev, size_t new_start,
return false;
}

struct cxl_event_dcd dcd_event_rec_template = {
.hdr = {
.id = UUID_INIT(0xca95afa7, 0xf183, 0x4018,
0x8c, 0x2f, 0x95, 0x26, 0x8e, 0x10, 0x1a, 0x2a),
.length = sizeof(struct cxl_event_dcd),
},
};

static int log_dc_event(struct mock_event_store *mes, enum dc_event type,
u64 start, u64 length, const char *tag_str)
{
struct device *dev = mes->mds->cxlds.dev;
struct cxl_event_dcd *dcd_event_rec;

dcd_event_rec = devm_kmemdup(dev, &dcd_event_rec_template,
sizeof(*dcd_event_rec), GFP_KERNEL);
if (!dcd_event_rec)
return -ENOMEM;

dcd_event_rec->event_type = type;
dcd_event_rec->extent.start_dpa = cpu_to_le64(start);
dcd_event_rec->extent.length = cpu_to_le64(length);
memcpy(dcd_event_rec->extent.tag, tag_str,
min(sizeof(dcd_event_rec->extent.tag),
strlen(tag_str)));

mes_add_event(mes, CXL_EVENT_TYPE_DCD,
(struct cxl_event_record_raw *)dcd_event_rec);

/* Fake the irq */
cxl_mem_get_event_records(mes->mds, CXLDEV_EVENT_STATUS_DCD);

return 0;
}

/*
* Format <start>:<length>:<tag>
*
Expand All @@ -2093,6 +2128,7 @@ static ssize_t dc_inject_extent_store(struct device *dev,
const char *buf, size_t count)
{
char *start_str __free(kfree) = kstrdup(buf, GFP_KERNEL);
struct cxl_mockmem_data *mdata = dev_get_drvdata(dev);
unsigned long long start, length;
char *len_str, *tag_str;
size_t buf_len = count;
Expand Down Expand Up @@ -2139,6 +2175,13 @@ static ssize_t dc_inject_extent_store(struct device *dev,
return rc;
}

rc = log_dc_event(&mdata->mes, DCD_ADD_CAPACITY, start, length,
tag_str);
if (rc) {
dev_err(dev, "Failed to add event %d\n", rc);
return rc;
}

return count;
}
static DEVICE_ATTR_WO(dc_inject_extent);
Expand All @@ -2149,8 +2192,10 @@ static ssize_t __dc_del_extent_store(struct device *dev,
enum dc_event type)
{
char *start_str __free(kfree) = kstrdup(buf, GFP_KERNEL);
struct cxl_mockmem_data *mdata = dev_get_drvdata(dev);
unsigned long long start, length;
char *len_str;
int rc;

if (!start_str)
return -ENOMEM;
Expand Down Expand Up @@ -2179,6 +2224,12 @@ static ssize_t __dc_del_extent_store(struct device *dev,
dev_dbg(dev, "Forcing delete of extent %#llx len:%#llx\n",
start, length);

rc = log_dc_event(&mdata->mes, type, start, length, "");
if (rc) {
dev_err(dev, "Failed to add event %d\n", rc);
return rc;
}

return count;
}

Expand Down

0 comments on commit d3da9e8

Please sign in to comment.