Skip to content

Commit b873adf

Browse files
committed
Merge branch 'for-6.17/cxl-acquire' into cxl-for-next
Introduce ACQUIRE() and ACQUIRE_ERR() for conditional locks. Convert CXL subsystem to use the new macros.
2 parents 12b3d69 + d03fcf5 commit b873adf

File tree

13 files changed

+480
-400
lines changed

13 files changed

+480
-400
lines changed

drivers/cxl/core/cdat.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ static int match_cxlrd_hb(struct device *dev, void *data)
336336
cxlrd = to_cxl_root_decoder(dev);
337337
cxlsd = &cxlrd->cxlsd;
338338

339-
guard(rwsem_read)(&cxl_region_rwsem);
339+
guard(rwsem_read)(&cxl_rwsem.region);
340340
for (int i = 0; i < cxlsd->nr_targets; i++) {
341341
if (host_bridge == cxlsd->target[i]->dport_dev)
342342
return 1;
@@ -987,7 +987,7 @@ void cxl_region_shared_upstream_bandwidth_update(struct cxl_region *cxlr)
987987
bool is_root;
988988
int rc;
989989

990-
lockdep_assert_held(&cxl_dpa_rwsem);
990+
lockdep_assert_held(&cxl_rwsem.dpa);
991991

992992
struct xarray *usp_xa __free(free_perf_xa) =
993993
kzalloc(sizeof(*usp_xa), GFP_KERNEL);
@@ -1057,7 +1057,7 @@ void cxl_region_perf_data_calculate(struct cxl_region *cxlr,
10571057
{
10581058
struct cxl_dpa_perf *perf;
10591059

1060-
lockdep_assert_held(&cxl_dpa_rwsem);
1060+
lockdep_assert_held(&cxl_rwsem.dpa);
10611061

10621062
perf = cxled_get_dpa_perf(cxled);
10631063
if (IS_ERR(perf))

drivers/cxl/core/core.h

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@
55
#define __CXL_CORE_H__
66

77
#include <cxl/mailbox.h>
8+
#include <linux/rwsem.h>
89

910
extern const struct device_type cxl_nvdimm_bridge_type;
1011
extern const struct device_type cxl_nvdimm_type;
1112
extern const struct device_type cxl_pmu_type;
1213

1314
extern struct attribute_group cxl_base_attribute_group;
1415

16+
enum cxl_detach_mode {
17+
DETACH_ONLY,
18+
DETACH_INVALIDATE,
19+
};
20+
1521
#ifdef CONFIG_CXL_REGION
1622
extern struct device_attribute dev_attr_create_pmem_region;
1723
extern struct device_attribute dev_attr_create_ram_region;
@@ -20,7 +26,11 @@ extern struct device_attribute dev_attr_region;
2026
extern const struct device_type cxl_pmem_region_type;
2127
extern const struct device_type cxl_dax_region_type;
2228
extern const struct device_type cxl_region_type;
23-
void cxl_decoder_kill_region(struct cxl_endpoint_decoder *cxled);
29+
30+
int cxl_decoder_detach(struct cxl_region *cxlr,
31+
struct cxl_endpoint_decoder *cxled, int pos,
32+
enum cxl_detach_mode mode);
33+
2434
#define CXL_REGION_ATTR(x) (&dev_attr_##x.attr)
2535
#define CXL_REGION_TYPE(x) (&cxl_region_type)
2636
#define SET_CXL_REGION_ATTR(x) (&dev_attr_##x.attr),
@@ -48,7 +58,9 @@ static inline int cxl_get_poison_by_endpoint(struct cxl_port *port)
4858
{
4959
return 0;
5060
}
51-
static inline void cxl_decoder_kill_region(struct cxl_endpoint_decoder *cxled)
61+
static inline int cxl_decoder_detach(struct cxl_region *cxlr,
62+
struct cxl_endpoint_decoder *cxled,
63+
int pos, enum cxl_detach_mode mode)
5264
{
5365
}
5466
static inline int cxl_region_init(void)
@@ -97,8 +109,20 @@ u16 cxl_rcrb_to_aer(struct device *dev, resource_size_t rcrb);
97109
#define PCI_RCRB_CAP_HDR_NEXT_MASK GENMASK(15, 8)
98110
#define PCI_CAP_EXP_SIZEOF 0x3c
99111

100-
extern struct rw_semaphore cxl_dpa_rwsem;
101-
extern struct rw_semaphore cxl_region_rwsem;
112+
struct cxl_rwsem {
113+
/*
114+
* All changes to HPA (interleave configuration) occur with this
115+
* lock held for write.
116+
*/
117+
struct rw_semaphore region;
118+
/*
119+
* All changes to a device DPA space occur with this lock held
120+
* for write.
121+
*/
122+
struct rw_semaphore dpa;
123+
};
124+
125+
extern struct cxl_rwsem cxl_rwsem;
102126

103127
int cxl_memdev_init(void);
104128
void cxl_memdev_exit(void);

drivers/cxl/core/edac.c

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,9 @@ static int cxl_scrub_get_attrbs(struct cxl_patrol_scrub_context *cxl_ps_ctx,
115115
flags, min_cycle);
116116
}
117117

118-
struct rw_semaphore *region_lock __free(rwsem_read_release) =
119-
rwsem_read_intr_acquire(&cxl_region_rwsem);
120-
if (!region_lock)
121-
return -EINTR;
118+
ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region);
119+
if ((ret = ACQUIRE_ERR(rwsem_read_intr, &rwsem)))
120+
return ret;
122121

123122
cxlr = cxl_ps_ctx->cxlr;
124123
p = &cxlr->params;
@@ -158,10 +157,9 @@ static int cxl_scrub_set_attrbs_region(struct device *dev,
158157
struct cxl_region *cxlr;
159158
int ret, i;
160159

161-
struct rw_semaphore *region_lock __free(rwsem_read_release) =
162-
rwsem_read_intr_acquire(&cxl_region_rwsem);
163-
if (!region_lock)
164-
return -EINTR;
160+
ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region);
161+
if ((ret = ACQUIRE_ERR(rwsem_read_intr, &rwsem)))
162+
return ret;
165163

166164
cxlr = cxl_ps_ctx->cxlr;
167165
p = &cxlr->params;
@@ -1340,16 +1338,15 @@ cxl_mem_perform_sparing(struct device *dev,
13401338
struct cxl_memdev_sparing_in_payload sparing_pi;
13411339
struct cxl_event_dram *rec = NULL;
13421340
u16 validity_flags = 0;
1341+
int ret;
13431342

1344-
struct rw_semaphore *region_lock __free(rwsem_read_release) =
1345-
rwsem_read_intr_acquire(&cxl_region_rwsem);
1346-
if (!region_lock)
1347-
return -EINTR;
1343+
ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region);
1344+
if ((ret = ACQUIRE_ERR(rwsem_read_intr, &region_rwsem)))
1345+
return ret;
13481346

1349-
struct rw_semaphore *dpa_lock __free(rwsem_read_release) =
1350-
rwsem_read_intr_acquire(&cxl_dpa_rwsem);
1351-
if (!dpa_lock)
1352-
return -EINTR;
1347+
ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa);
1348+
if ((ret = ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem)))
1349+
return ret;
13531350

13541351
if (!cxl_sparing_ctx->cap_safe_when_in_use) {
13551352
/* Memory to repair must be offline */
@@ -1787,16 +1784,15 @@ static int cxl_mem_perform_ppr(struct cxl_ppr_context *cxl_ppr_ctx)
17871784
struct cxl_memdev_ppr_maintenance_attrbs maintenance_attrbs;
17881785
struct cxl_memdev *cxlmd = cxl_ppr_ctx->cxlmd;
17891786
struct cxl_mem_repair_attrbs attrbs = { 0 };
1787+
int ret;
17901788

1791-
struct rw_semaphore *region_lock __free(rwsem_read_release) =
1792-
rwsem_read_intr_acquire(&cxl_region_rwsem);
1793-
if (!region_lock)
1794-
return -EINTR;
1789+
ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region);
1790+
if ((ret = ACQUIRE_ERR(rwsem_read_intr, &region_rwsem)))
1791+
return ret;
17951792

1796-
struct rw_semaphore *dpa_lock __free(rwsem_read_release) =
1797-
rwsem_read_intr_acquire(&cxl_dpa_rwsem);
1798-
if (!dpa_lock)
1799-
return -EINTR;
1793+
ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa);
1794+
if ((ret = ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem)))
1795+
return ret;
18001796

18011797
if (!cxl_ppr_ctx->media_accessible || !cxl_ppr_ctx->data_retained) {
18021798
/* Memory to repair must be offline */

0 commit comments

Comments
 (0)