Skip to content

Commit

Permalink
Merge branch 'cxl/for-6.13/dcd-prep' into cxl-for-next
Browse files Browse the repository at this point in the history
Add preparation patches for coming soon DCD changes.

- Add range_overlaps()
- Add CDAT/DSMAS shared and read only flag in ACPICA
- Add documentation to struct dev_dax_range
- Delay event buffer allocation in CXL PCI
- Use guard() in cxl_dpa_set_mode()
- Refactor common create region code to reduce redudant code
  • Loading branch information
Dave Jiang committed Nov 8, 2024
2 parents 86bcd81 + a90326c commit a83383e
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 47 deletions.
21 changes: 6 additions & 15 deletions drivers/cxl/core/hdm.c
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,6 @@ int cxl_dpa_set_mode(struct cxl_endpoint_decoder *cxled,
struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
struct cxl_dev_state *cxlds = cxlmd->cxlds;
struct device *dev = &cxled->cxld.dev;
int rc;

switch (mode) {
case CXL_DECODER_RAM:
Expand All @@ -435,33 +434,25 @@ int cxl_dpa_set_mode(struct cxl_endpoint_decoder *cxled,
return -EINVAL;
}

down_write(&cxl_dpa_rwsem);
if (cxled->cxld.flags & CXL_DECODER_F_ENABLE) {
rc = -EBUSY;
goto out;
}
guard(rwsem_write)(&cxl_dpa_rwsem);
if (cxled->cxld.flags & CXL_DECODER_F_ENABLE)
return -EBUSY;

/*
* Only allow modes that are supported by the current partition
* configuration
*/
if (mode == CXL_DECODER_PMEM && !resource_size(&cxlds->pmem_res)) {
dev_dbg(dev, "no available pmem capacity\n");
rc = -ENXIO;
goto out;
return -ENXIO;
}
if (mode == CXL_DECODER_RAM && !resource_size(&cxlds->ram_res)) {
dev_dbg(dev, "no available ram capacity\n");
rc = -ENXIO;
goto out;
return -ENXIO;
}

cxled->mode = mode;
rc = 0;
out:
up_write(&cxl_dpa_rwsem);

return rc;
return 0;
}

int cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
Expand Down
28 changes: 11 additions & 17 deletions drivers/cxl/core/region.c
Original file line number Diff line number Diff line change
Expand Up @@ -2536,9 +2536,8 @@ static struct cxl_region *__create_region(struct cxl_root_decoder *cxlrd,
return devm_cxl_add_region(cxlrd, id, mode, CXL_DECODER_HOSTONLYMEM);
}

static ssize_t create_pmem_region_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t len)
static ssize_t create_region_store(struct device *dev, const char *buf,
size_t len, enum cxl_decoder_mode mode)
{
struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev);
struct cxl_region *cxlr;
Expand All @@ -2548,31 +2547,26 @@ static ssize_t create_pmem_region_store(struct device *dev,
if (rc != 1)
return -EINVAL;

cxlr = __create_region(cxlrd, CXL_DECODER_PMEM, id);
cxlr = __create_region(cxlrd, mode, id);
if (IS_ERR(cxlr))
return PTR_ERR(cxlr);

return len;
}

static ssize_t create_pmem_region_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t len)
{
return create_region_store(dev, buf, len, CXL_DECODER_PMEM);
}
DEVICE_ATTR_RW(create_pmem_region);

static ssize_t create_ram_region_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t len)
{
struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev);
struct cxl_region *cxlr;
int rc, id;

rc = sscanf(buf, "region%d\n", &id);
if (rc != 1)
return -EINVAL;

cxlr = __create_region(cxlrd, CXL_DECODER_RAM, id);
if (IS_ERR(cxlr))
return PTR_ERR(cxlr);

return len;
return create_region_store(dev, buf, len, CXL_DECODER_RAM);
}
DEVICE_ATTR_RW(create_ram_region);

Expand Down
8 changes: 4 additions & 4 deletions drivers/cxl/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -777,10 +777,6 @@ static int cxl_event_config(struct pci_host_bridge *host_bridge,
return 0;
}

rc = cxl_mem_alloc_event_buf(mds);
if (rc)
return rc;

rc = cxl_event_get_int_policy(mds, &policy);
if (rc)
return rc;
Expand All @@ -794,6 +790,10 @@ static int cxl_event_config(struct pci_host_bridge *host_bridge,
return -EBUSY;
}

rc = cxl_mem_alloc_event_buf(mds);
if (rc)
return rc;

rc = cxl_event_irqsetup(mds);
if (rc)
return rc;
Expand Down
26 changes: 20 additions & 6 deletions drivers/dax/dax-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,30 @@ struct dax_region {
struct device *youngest;
};

/**
* struct dax_mapping - device to display mapping range attributes
* @dev: device representing this range
* @range_id: index within dev_dax ranges array
* @id: ida of this mapping
*/
struct dax_mapping {
struct device dev;
int range_id;
int id;
};

/**
* struct dev_dax_range - tuple represenging a range of memory used by dev_dax
* @pgoff: page offset
* @range: resource-span
* @mapping: reference to the dax_mapping for this range
*/
struct dev_dax_range {
unsigned long pgoff;
struct range range;
struct dax_mapping *mapping;
};

/**
* struct dev_dax - instance data for a subdivision of a dax region, and
* data while the device is activated in the driver.
Expand All @@ -58,7 +76,7 @@ struct dax_mapping {
* @dev - device core
* @pgmap - pgmap for memmap setup / lifetime (driver owned)
* @nr_range: size of @ranges
* @ranges: resource-span + pgoff tuples for the instance
* @ranges: range tuples of memory used
*/
struct dev_dax {
struct dax_region *region;
Expand All @@ -72,11 +90,7 @@ struct dev_dax {
struct dev_pagemap *pgmap;
bool memmap_on_memory;
int nr_range;
struct dev_dax_range {
unsigned long pgoff;
struct range range;
struct dax_mapping *mapping;
} *ranges;
struct dev_dax_range *ranges;
};

/*
Expand Down
10 changes: 5 additions & 5 deletions fs/btrfs/ordered-data.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ static struct rb_node *__tree_search(struct rb_root *root, u64 file_offset,
return NULL;
}

static int range_overlaps(struct btrfs_ordered_extent *entry, u64 file_offset,
u64 len)
static int btrfs_range_overlaps(struct btrfs_ordered_extent *entry, u64 file_offset,
u64 len)
{
if (file_offset + len <= entry->file_offset ||
entry->file_offset + entry->num_bytes <= file_offset)
Expand Down Expand Up @@ -985,7 +985,7 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_range(

while (1) {
entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
if (range_overlaps(entry, file_offset, len))
if (btrfs_range_overlaps(entry, file_offset, len))
break;

if (entry->file_offset >= file_offset + len) {
Expand Down Expand Up @@ -1114,12 +1114,12 @@ struct btrfs_ordered_extent *btrfs_lookup_first_ordered_range(
}
if (prev) {
entry = rb_entry(prev, struct btrfs_ordered_extent, rb_node);
if (range_overlaps(entry, file_offset, len))
if (btrfs_range_overlaps(entry, file_offset, len))
goto out;
}
if (next) {
entry = rb_entry(next, struct btrfs_ordered_extent, rb_node);
if (range_overlaps(entry, file_offset, len))
if (btrfs_range_overlaps(entry, file_offset, len))
goto out;
}
/* No ordered extent in the range */
Expand Down
2 changes: 2 additions & 0 deletions include/acpi/actbl1.h
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,8 @@ struct acpi_cdat_dsmas {
/* Flags for subtable above */

#define ACPI_CDAT_DSMAS_NON_VOLATILE (1 << 2)
#define ACPI_CDAT_DSMAS_SHAREABLE (1 << 3)
#define ACPI_CDAT_DSMAS_READ_ONLY (1 << 6)

/* Subtable 1: Device scoped Latency and Bandwidth Information Structure (DSLBIS) */

Expand Down
8 changes: 8 additions & 0 deletions include/linux/range.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,20 @@ static inline u64 range_len(const struct range *range)
return range->end - range->start + 1;
}

/* True if r1 completely contains r2 */
static inline bool range_contains(const struct range *r1,
const struct range *r2)
{
return r1->start <= r2->start && r1->end >= r2->end;
}

/* True if any part of r1 overlaps r2 */
static inline bool range_overlaps(const struct range *r1,
const struct range *r2)
{
return r1->start <= r2->end && r1->end >= r2->start;
}

int add_range(struct range *range, int az, int nr_range,
u64 start, u64 end);

Expand Down

0 comments on commit a83383e

Please sign in to comment.