Skip to content

Commit 25a0207

Browse files
AlisonSchofielddavejiang
authored andcommitted
cxl/core: Add locked variants of the poison inject and clear funcs
The core functions that validate and send inject and clear commands to the memdev devices require holding both the dpa_rwsem and the region_rwsem. In preparation for another caller of these functions that must hold the locks upon entry, split the work into a locked and unlocked pair. Consideration was given to moving the locking to both callers, however, the existing caller is not in the core (mem.c) and cannot access the locks. Signed-off-by: Alison Schofield <alison.schofield@intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Link: https://patch.msgid.link/1d601f586975195733984ca63d1b5789bbe8690f.1754290144.git.alison.schofield@intel.com Signed-off-by: Dave Jiang <dave.jiang@intel.com>
1 parent dc18117 commit 25a0207

2 files changed

Lines changed: 38 additions & 16 deletions

File tree

drivers/cxl/core/memdev.c

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ static int cxl_validate_poison_dpa(struct cxl_memdev *cxlmd, u64 dpa)
276276
return 0;
277277
}
278278

279-
int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa)
279+
int cxl_inject_poison_locked(struct cxl_memdev *cxlmd, u64 dpa)
280280
{
281281
struct cxl_mailbox *cxl_mbox = &cxlmd->cxlds->cxl_mbox;
282282
struct cxl_mbox_inject_poison inject;
@@ -288,13 +288,8 @@ int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa)
288288
if (!IS_ENABLED(CONFIG_DEBUG_FS))
289289
return 0;
290290

291-
ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region);
292-
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &region_rwsem)))
293-
return rc;
294-
295-
ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa);
296-
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem)))
297-
return rc;
291+
lockdep_assert_held(&cxl_rwsem.dpa);
292+
lockdep_assert_held(&cxl_rwsem.region);
298293

299294
rc = cxl_validate_poison_dpa(cxlmd, dpa);
300295
if (rc)
@@ -324,9 +319,24 @@ int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa)
324319

325320
return 0;
326321
}
322+
323+
int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa)
324+
{
325+
int rc;
326+
327+
ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region);
328+
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &region_rwsem)))
329+
return rc;
330+
331+
ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa);
332+
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem)))
333+
return rc;
334+
335+
return cxl_inject_poison_locked(cxlmd, dpa);
336+
}
327337
EXPORT_SYMBOL_NS_GPL(cxl_inject_poison, "CXL");
328338

329-
int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa)
339+
int cxl_clear_poison_locked(struct cxl_memdev *cxlmd, u64 dpa)
330340
{
331341
struct cxl_mailbox *cxl_mbox = &cxlmd->cxlds->cxl_mbox;
332342
struct cxl_mbox_clear_poison clear;
@@ -338,13 +348,8 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa)
338348
if (!IS_ENABLED(CONFIG_DEBUG_FS))
339349
return 0;
340350

341-
ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region);
342-
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &region_rwsem)))
343-
return rc;
344-
345-
ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa);
346-
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem)))
347-
return rc;
351+
lockdep_assert_held(&cxl_rwsem.dpa);
352+
lockdep_assert_held(&cxl_rwsem.region);
348353

349354
rc = cxl_validate_poison_dpa(cxlmd, dpa);
350355
if (rc)
@@ -383,6 +388,21 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa)
383388

384389
return 0;
385390
}
391+
392+
int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa)
393+
{
394+
int rc;
395+
396+
ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region);
397+
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &region_rwsem)))
398+
return rc;
399+
400+
ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa);
401+
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem)))
402+
return rc;
403+
404+
return cxl_clear_poison_locked(cxlmd, dpa);
405+
}
386406
EXPORT_SYMBOL_NS_GPL(cxl_clear_poison, "CXL");
387407

388408
static struct attribute *cxl_memdev_attributes[] = {

drivers/cxl/cxlmem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,8 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,
869869
int cxl_trigger_poison_list(struct cxl_memdev *cxlmd);
870870
int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa);
871871
int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa);
872+
int cxl_inject_poison_locked(struct cxl_memdev *cxlmd, u64 dpa);
873+
int cxl_clear_poison_locked(struct cxl_memdev *cxlmd, u64 dpa);
872874

873875
#ifdef CONFIG_CXL_EDAC_MEM_FEATURES
874876
int devm_cxl_memdev_edac_register(struct cxl_memdev *cxlmd);

0 commit comments

Comments
 (0)