Skip to content

Commit c726876

Browse files
committed
Merge tag 'rpmsg-v5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux
Pull rpmsg updates from Bjorn Andersson: "This contains fixes and cleanups in the rpmsg core, Qualcomm SMD and GLINK drivers, a circular lock dependency in the Mediatek driver and a possible race condition in the rpmsg_char driver is resolved" * tag 'rpmsg-v5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux: rpmsg: convert sysfs snprintf to sysfs_emit rpmsg: qcom_smd: Fix refcount leak in qcom_smd_parse_edge rpmsg: qcom: correct kerneldoc rpmsg: qcom: glink: remove unused name rpmsg: qcom: glink: replace strncpy() with strscpy_pad() rpmsg: Strcpy is not safe, use strscpy_pad() instead rpmsg: Fix possible refcount leak in rpmsg_register_device_override() rpmsg: Fix parameter naming for announce_create/destroy ops rpmsg: mtk_rpmsg: Fix circular locking dependency rpmsg: char: Add mutex protection for rpmsg_eptdev_open()
2 parents e6cc0b5 + 7113ac8 commit c726876

File tree

7 files changed

+20
-17
lines changed

7 files changed

+20
-17
lines changed

drivers/rpmsg/mtk_rpmsg.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ static void mtk_register_device_work_function(struct work_struct *register_work)
234234
if (info->registered)
235235
continue;
236236

237+
mutex_unlock(&subdev->channels_lock);
237238
ret = mtk_rpmsg_register_device(subdev, &info->info);
239+
mutex_lock(&subdev->channels_lock);
238240
if (ret) {
239241
dev_err(&pdev->dev, "Can't create rpmsg_device\n");
240242
continue;

drivers/rpmsg/qcom_glink_native.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,6 @@ struct glink_core_rx_intent {
9898
struct qcom_glink {
9999
struct device *dev;
100100

101-
const char *name;
102-
103101
struct mbox_client mbox_client;
104102
struct mbox_chan *mbox_chan;
105103

@@ -1546,7 +1544,7 @@ static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid)
15461544
cancel_work_sync(&channel->intent_work);
15471545

15481546
if (channel->rpdev) {
1549-
strncpy(chinfo.name, channel->name, sizeof(chinfo.name));
1547+
strscpy_pad(chinfo.name, channel->name, sizeof(chinfo.name));
15501548
chinfo.src = RPMSG_ADDR_ANY;
15511549
chinfo.dst = RPMSG_ADDR_ANY;
15521550

@@ -1674,7 +1672,7 @@ static ssize_t rpmsg_name_show(struct device *dev,
16741672
if (ret < 0)
16751673
name = dev->of_node->name;
16761674

1677-
return snprintf(buf, RPMSG_NAME_SIZE, "%s\n", name);
1675+
return sysfs_emit(buf, "%s\n", name);
16781676
}
16791677
static DEVICE_ATTR_RO(rpmsg_name);
16801678

@@ -1755,10 +1753,6 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev,
17551753
if (ret)
17561754
dev_err(dev, "failed to add groups\n");
17571755

1758-
ret = of_property_read_string(dev->of_node, "label", &glink->name);
1759-
if (ret < 0)
1760-
glink->name = dev->of_node->name;
1761-
17621756
glink->mbox_client.dev = dev;
17631757
glink->mbox_client.knows_txdone = true;
17641758
glink->mbox_chan = mbox_request_channel(&glink->mbox_client, 0);

drivers/rpmsg/qcom_glink_ssr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ struct cleanup_done_msg {
3939
__le32 seq_num;
4040
};
4141

42-
/**
42+
/*
4343
* G-Link SSR protocol commands
4444
*/
4545
#define GLINK_SSR_DO_CLEANUP 0

drivers/rpmsg/qcom_smd.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -729,11 +729,11 @@ static int qcom_smd_write_fifo(struct qcom_smd_channel *channel,
729729
}
730730

731731
/**
732-
* qcom_smd_send - write data to smd channel
732+
* __qcom_smd_send - write data to smd channel
733733
* @channel: channel handle
734734
* @data: buffer of data to write
735735
* @len: number of bytes to write
736-
* @wait: flag to indicate if write has ca wait
736+
* @wait: flag to indicate if write can wait
737737
*
738738
* This is a blocking write of len bytes into the channel's tx ring buffer and
739739
* signal the remote end. It will sleep until there is enough space available
@@ -1089,7 +1089,7 @@ static int qcom_smd_create_device(struct qcom_smd_channel *channel)
10891089

10901090
/* Assign public information to the rpmsg_device */
10911091
rpdev = &qsdev->rpdev;
1092-
strncpy(rpdev->id.name, channel->name, RPMSG_NAME_SIZE);
1092+
strscpy_pad(rpdev->id.name, channel->name, RPMSG_NAME_SIZE);
10931093
rpdev->src = RPMSG_ADDR_ANY;
10941094
rpdev->dst = RPMSG_ADDR_ANY;
10951095

@@ -1323,7 +1323,7 @@ static void qcom_channel_state_worker(struct work_struct *work)
13231323

13241324
spin_unlock_irqrestore(&edge->channels_lock, flags);
13251325

1326-
strncpy(chinfo.name, channel->name, sizeof(chinfo.name));
1326+
strscpy_pad(chinfo.name, channel->name, sizeof(chinfo.name));
13271327
chinfo.src = RPMSG_ADDR_ANY;
13281328
chinfo.dst = RPMSG_ADDR_ANY;
13291329
rpmsg_unregister_device(&edge->dev, &chinfo);
@@ -1383,6 +1383,7 @@ static int qcom_smd_parse_edge(struct device *dev,
13831383
}
13841384

13851385
edge->ipc_regmap = syscon_node_to_regmap(syscon_np);
1386+
of_node_put(syscon_np);
13861387
if (IS_ERR(edge->ipc_regmap)) {
13871388
ret = PTR_ERR(edge->ipc_regmap);
13881389
goto put_node;

drivers/rpmsg/rpmsg_char.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,11 @@ static int rpmsg_eptdev_open(struct inode *inode, struct file *filp)
120120
struct rpmsg_device *rpdev = eptdev->rpdev;
121121
struct device *dev = &eptdev->dev;
122122

123-
if (eptdev->ept)
123+
mutex_lock(&eptdev->ept_lock);
124+
if (eptdev->ept) {
125+
mutex_unlock(&eptdev->ept_lock);
124126
return -EBUSY;
127+
}
125128

126129
get_device(dev);
127130

@@ -137,11 +140,13 @@ static int rpmsg_eptdev_open(struct inode *inode, struct file *filp)
137140
if (!ept) {
138141
dev_err(dev, "failed to open %s\n", eptdev->chinfo.name);
139142
put_device(dev);
143+
mutex_unlock(&eptdev->ept_lock);
140144
return -EINVAL;
141145
}
142146

143147
eptdev->ept = ept;
144148
filp->private_data = eptdev;
149+
mutex_unlock(&eptdev->ept_lock);
145150

146151
return 0;
147152
}

drivers/rpmsg/rpmsg_core.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ int rpmsg_register_device_override(struct rpmsg_device *rpdev,
604604
int ret;
605605

606606
if (driver_override)
607-
strcpy(rpdev->id.name, driver_override);
607+
strscpy_pad(rpdev->id.name, driver_override, RPMSG_NAME_SIZE);
608608

609609
dev_set_name(dev, "%s.%s.%d.%d", dev_name(dev->parent),
610610
rpdev->id.name, rpdev->src, rpdev->dst);
@@ -618,6 +618,7 @@ int rpmsg_register_device_override(struct rpmsg_device *rpdev,
618618
strlen(driver_override));
619619
if (ret) {
620620
dev_err(dev, "device_set_override failed: %d\n", ret);
621+
put_device(dev);
621622
return ret;
622623
}
623624
}

drivers/rpmsg/rpmsg_internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ struct rpmsg_device_ops {
4141
rpmsg_rx_cb_t cb, void *priv,
4242
struct rpmsg_channel_info chinfo);
4343

44-
int (*announce_create)(struct rpmsg_device *ept);
45-
int (*announce_destroy)(struct rpmsg_device *ept);
44+
int (*announce_create)(struct rpmsg_device *rpdev);
45+
int (*announce_destroy)(struct rpmsg_device *rpdev);
4646
};
4747

4848
/**

0 commit comments

Comments
 (0)