Skip to content

Commit b6faa9c

Browse files
committed
Merge branch 'for-6.15/guard_cleanups' into cxl-for-next2
A series of CXL refactoring using scope based resource management to remove goto patterns on the cleanup paths.
2 parents 17218b0 + 5ec6759 commit b6faa9c

File tree

5 files changed

+88
-118
lines changed

5 files changed

+88
-118
lines changed

drivers/cxl/core/hdm.c

Lines changed: 28 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,12 @@ void cxl_dpa_debug(struct seq_file *file, struct cxl_dev_state *cxlds)
213213
{
214214
struct resource *p1, *p2;
215215

216-
down_read(&cxl_dpa_rwsem);
216+
guard(rwsem_read)(&cxl_dpa_rwsem);
217217
for (p1 = cxlds->dpa_res.child; p1; p1 = p1->sibling) {
218218
__cxl_dpa_debug(file, p1, 0);
219219
for (p2 = p1->child; p2; p2 = p2->sibling)
220220
__cxl_dpa_debug(file, p2, 1);
221221
}
222-
up_read(&cxl_dpa_rwsem);
223222
}
224223
EXPORT_SYMBOL_NS_GPL(cxl_dpa_debug, "CXL");
225224

@@ -281,9 +280,8 @@ static void __cxl_dpa_release(struct cxl_endpoint_decoder *cxled)
281280

282281
static void cxl_dpa_release(void *cxled)
283282
{
284-
down_write(&cxl_dpa_rwsem);
283+
guard(rwsem_write)(&cxl_dpa_rwsem);
285284
__cxl_dpa_release(cxled);
286-
up_write(&cxl_dpa_rwsem);
287285
}
288286

289287
/*
@@ -530,14 +528,11 @@ EXPORT_SYMBOL_NS_GPL(devm_cxl_dpa_reserve, "CXL");
530528

531529
resource_size_t cxl_dpa_size(struct cxl_endpoint_decoder *cxled)
532530
{
533-
resource_size_t size = 0;
534-
535-
down_read(&cxl_dpa_rwsem);
531+
guard(rwsem_read)(&cxl_dpa_rwsem);
536532
if (cxled->dpa_res)
537-
size = resource_size(cxled->dpa_res);
538-
up_read(&cxl_dpa_rwsem);
533+
return resource_size(cxled->dpa_res);
539534

540-
return size;
535+
return 0;
541536
}
542537

543538
resource_size_t cxl_dpa_resource_start(struct cxl_endpoint_decoder *cxled)
@@ -555,35 +550,27 @@ int cxl_dpa_free(struct cxl_endpoint_decoder *cxled)
555550
{
556551
struct cxl_port *port = cxled_to_port(cxled);
557552
struct device *dev = &cxled->cxld.dev;
558-
int rc;
559553

560-
down_write(&cxl_dpa_rwsem);
561-
if (!cxled->dpa_res) {
562-
rc = 0;
563-
goto out;
564-
}
554+
guard(rwsem_write)(&cxl_dpa_rwsem);
555+
if (!cxled->dpa_res)
556+
return 0;
565557
if (cxled->cxld.region) {
566558
dev_dbg(dev, "decoder assigned to: %s\n",
567559
dev_name(&cxled->cxld.region->dev));
568-
rc = -EBUSY;
569-
goto out;
560+
return -EBUSY;
570561
}
571562
if (cxled->cxld.flags & CXL_DECODER_F_ENABLE) {
572563
dev_dbg(dev, "decoder enabled\n");
573-
rc = -EBUSY;
574-
goto out;
564+
return -EBUSY;
575565
}
576566
if (cxled->cxld.id != port->hdm_end) {
577567
dev_dbg(dev, "expected decoder%d.%d\n", port->id,
578568
port->hdm_end);
579-
rc = -EBUSY;
580-
goto out;
569+
return -EBUSY;
581570
}
571+
582572
devm_cxl_dpa_release(cxled);
583-
rc = 0;
584-
out:
585-
up_write(&cxl_dpa_rwsem);
586-
return rc;
573+
return 0;
587574
}
588575

589576
int cxl_dpa_set_part(struct cxl_endpoint_decoder *cxled,
@@ -616,36 +603,32 @@ int cxl_dpa_set_part(struct cxl_endpoint_decoder *cxled,
616603
return 0;
617604
}
618605

619-
int cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
606+
static int __cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
620607
{
621608
struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
622-
struct cxl_port *port = cxled_to_port(cxled);
623609
struct cxl_dev_state *cxlds = cxlmd->cxlds;
624610
struct device *dev = &cxled->cxld.dev;
625611
struct resource *res, *prev = NULL;
626612
resource_size_t start, avail, skip, skip_start;
627613
struct resource *p, *last;
628-
int part, rc;
614+
int part;
629615

630-
down_write(&cxl_dpa_rwsem);
616+
guard(rwsem_write)(&cxl_dpa_rwsem);
631617
if (cxled->cxld.region) {
632618
dev_dbg(dev, "decoder attached to %s\n",
633619
dev_name(&cxled->cxld.region->dev));
634-
rc = -EBUSY;
635-
goto out;
620+
return -EBUSY;
636621
}
637622

638623
if (cxled->cxld.flags & CXL_DECODER_F_ENABLE) {
639624
dev_dbg(dev, "decoder enabled\n");
640-
rc = -EBUSY;
641-
goto out;
625+
return -EBUSY;
642626
}
643627

644628
part = cxled->part;
645629
if (part < 0) {
646630
dev_dbg(dev, "partition not set\n");
647-
rc = -EBUSY;
648-
goto out;
631+
return -EBUSY;
649632
}
650633

651634
res = &cxlds->part[part].res;
@@ -685,14 +668,18 @@ int cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
685668
if (size > avail) {
686669
dev_dbg(dev, "%pa exceeds available %s capacity: %pa\n", &size,
687670
res->name, &avail);
688-
rc = -ENOSPC;
689-
goto out;
671+
return -ENOSPC;
690672
}
691673

692-
rc = __cxl_dpa_reserve(cxled, start, size, skip);
693-
out:
694-
up_write(&cxl_dpa_rwsem);
674+
return __cxl_dpa_reserve(cxled, start, size, skip);
675+
}
676+
677+
int cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
678+
{
679+
struct cxl_port *port = cxled_to_port(cxled);
680+
int rc;
695681

682+
rc = __cxl_dpa_alloc(cxled, size);
696683
if (rc)
697684
return rc;
698685

drivers/cxl/core/mbox.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,23 +1218,19 @@ int cxl_mem_sanitize(struct cxl_memdev *cxlmd, u16 cmd)
12181218
{
12191219
struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds);
12201220
struct cxl_port *endpoint;
1221-
int rc;
12221221

12231222
/* synchronize with cxl_mem_probe() and decoder write operations */
12241223
guard(device)(&cxlmd->dev);
12251224
endpoint = cxlmd->endpoint;
1226-
down_read(&cxl_region_rwsem);
1225+
guard(rwsem_read)(&cxl_region_rwsem);
12271226
/*
12281227
* Require an endpoint to be safe otherwise the driver can not
12291228
* be sure that the device is unmapped.
12301229
*/
12311230
if (endpoint && cxl_num_decoders_committed(endpoint) == 0)
1232-
rc = __cxl_mem_sanitize(mds, cmd);
1233-
else
1234-
rc = -EBUSY;
1235-
up_read(&cxl_region_rwsem);
1231+
return __cxl_mem_sanitize(mds, cmd);
12361232

1237-
return rc;
1233+
return -EBUSY;
12381234
}
12391235

12401236
static void add_part(struct cxl_dpa_info *info, u64 start, u64 size, enum cxl_partition_mode mode)

drivers/cxl/core/memdev.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -580,10 +580,9 @@ EXPORT_SYMBOL_NS_GPL(is_cxl_memdev, "CXL");
580580
void set_exclusive_cxl_commands(struct cxl_memdev_state *mds,
581581
unsigned long *cmds)
582582
{
583-
down_write(&cxl_memdev_rwsem);
583+
guard(rwsem_write)(&cxl_memdev_rwsem);
584584
bitmap_or(mds->exclusive_cmds, mds->exclusive_cmds, cmds,
585585
CXL_MEM_COMMAND_ID_MAX);
586-
up_write(&cxl_memdev_rwsem);
587586
}
588587
EXPORT_SYMBOL_NS_GPL(set_exclusive_cxl_commands, "CXL");
589588

@@ -595,20 +594,18 @@ EXPORT_SYMBOL_NS_GPL(set_exclusive_cxl_commands, "CXL");
595594
void clear_exclusive_cxl_commands(struct cxl_memdev_state *mds,
596595
unsigned long *cmds)
597596
{
598-
down_write(&cxl_memdev_rwsem);
597+
guard(rwsem_write)(&cxl_memdev_rwsem);
599598
bitmap_andnot(mds->exclusive_cmds, mds->exclusive_cmds, cmds,
600599
CXL_MEM_COMMAND_ID_MAX);
601-
up_write(&cxl_memdev_rwsem);
602600
}
603601
EXPORT_SYMBOL_NS_GPL(clear_exclusive_cxl_commands, "CXL");
604602

605603
static void cxl_memdev_shutdown(struct device *dev)
606604
{
607605
struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
608606

609-
down_write(&cxl_memdev_rwsem);
607+
guard(rwsem_write)(&cxl_memdev_rwsem);
610608
cxlmd->cxlds = NULL;
611-
up_write(&cxl_memdev_rwsem);
612609
}
613610

614611
static void cxl_memdev_unregister(void *_cxlmd)
@@ -687,15 +684,13 @@ static long cxl_memdev_ioctl(struct file *file, unsigned int cmd,
687684
{
688685
struct cxl_memdev *cxlmd = file->private_data;
689686
struct cxl_dev_state *cxlds;
690-
int rc = -ENXIO;
691687

692-
down_read(&cxl_memdev_rwsem);
688+
guard(rwsem_read)(&cxl_memdev_rwsem);
693689
cxlds = cxlmd->cxlds;
694690
if (cxlds && cxlds->type == CXL_DEVTYPE_CLASSMEM)
695-
rc = __cxl_memdev_ioctl(cxlmd, cmd, arg);
696-
up_read(&cxl_memdev_rwsem);
691+
return __cxl_memdev_ioctl(cxlmd, cmd, arg);
697692

698-
return rc;
693+
return -ENXIO;
699694
}
700695

701696
static int cxl_memdev_open(struct inode *inode, struct file *file)

drivers/cxl/core/port.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -559,13 +559,9 @@ static ssize_t decoders_committed_show(struct device *dev,
559559
struct device_attribute *attr, char *buf)
560560
{
561561
struct cxl_port *port = to_cxl_port(dev);
562-
int rc;
563-
564-
down_read(&cxl_region_rwsem);
565-
rc = sysfs_emit(buf, "%d\n", cxl_num_decoders_committed(port));
566-
up_read(&cxl_region_rwsem);
567562

568-
return rc;
563+
guard(rwsem_read)(&cxl_region_rwsem);
564+
return sysfs_emit(buf, "%d\n", cxl_num_decoders_committed(port));
569565
}
570566

571567
static DEVICE_ATTR_RO(decoders_committed);

0 commit comments

Comments
 (0)