This is an automated email from the ASF dual-hosted git repository.
archer pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 064eb5fd35 rpmsg services: should release the tx buffer when
rpmsg_send_nocopy failed
064eb5fd35 is described below
commit 064eb5fd35d6a92f850b0676f5926f9dcbeb9cd7
Author: Bowen Wang <[email protected]>
AuthorDate: Wed Jul 17 12:21:26 2024 +0800
rpmsg services: should release the tx buffer when rpmsg_send_nocopy failed
Otherwise, the tx buffer will be discarded and can no longer be obtained
Signed-off-by: Bowen Wang <[email protected]>
---
drivers/clk/clk_rpmsg.c | 4 ++++
drivers/misc/rpmsgblk.c | 6 ++++++
drivers/misc/rpmsgblk_server.c | 24 ++++++++++++++++++++----
drivers/mtd/rpmsgmtd_server.c | 6 ++++--
drivers/net/rpmsgdrv.c | 5 +++++
drivers/note/noterpmsg_driver.c | 6 +++++-
drivers/power/supply/regulator_rpmsg.c | 4 ++++
drivers/rpmsg/rpmsg_ping.c | 5 +++++
drivers/sensors/sensor_rpmsg.c | 16 ++++++++++++++--
drivers/serial/uart_rpmsg.c | 5 ++++-
drivers/syslog/syslog_rpmsg.c | 6 +++++-
drivers/usrsock/usrsock_rpmsg.c | 5 +++++
drivers/usrsock/usrsock_rpmsg_server.c | 19 +++++++++++++++++--
drivers/wireless/bluetooth/bt_rpmsghci.c | 1 +
drivers/wireless/bluetooth/bt_rpmsghci_server.c | 1 +
fs/rpmsgfs/rpmsgfs_client.c | 6 ++++++
fs/rpmsgfs/rpmsgfs_server.c | 6 +++++-
17 files changed, 111 insertions(+), 14 deletions(-)
diff --git a/drivers/clk/clk_rpmsg.c b/drivers/clk/clk_rpmsg.c
index 69f86a65e4..4f7d669342 100644
--- a/drivers/clk/clk_rpmsg.c
+++ b/drivers/clk/clk_rpmsg.c
@@ -497,6 +497,10 @@ static int64_t clk_rpmsg_sendrecv(FAR struct
rpmsg_endpoint *ept,
ret = cookie.result;
}
}
+ else
+ {
+ rpmsg_release_tx_buffer(ept, msg);
+ }
nxsem_destroy(&cookie.sem);
return ret;
diff --git a/drivers/misc/rpmsgblk.c b/drivers/misc/rpmsgblk.c
index 4a4214fd81..28e2638b09 100644
--- a/drivers/misc/rpmsgblk.c
+++ b/drivers/misc/rpmsgblk.c
@@ -395,6 +395,7 @@ static ssize_t rpmsgblk_write(FAR struct inode *inode,
sizeof(*msg) - 1 + msg->nsectors * sectorsize);
if (ret < 0)
{
+ rpmsg_release_tx_buffer(&priv->ept, msg);
goto out;
}
}
@@ -859,6 +860,11 @@ static int rpmsgblk_send_recv(FAR struct rpmsgblk_s *priv,
if (ret < 0)
{
+ if (copy == false)
+ {
+ rpmsg_release_tx_buffer(&priv->ept, msg);
+ }
+
goto fail;
}
diff --git a/drivers/misc/rpmsgblk_server.c b/drivers/misc/rpmsgblk_server.c
index 69b3deec12..2638b04729 100644
--- a/drivers/misc/rpmsgblk_server.c
+++ b/drivers/misc/rpmsgblk_server.c
@@ -224,8 +224,12 @@ static int rpmsgblk_read_handler(FAR struct rpmsg_endpoint
*ept,
(FAR unsigned char *)rsp->buf,
msg->startsector, nsectors);
rsp->header.result = ret;
- rpmsg_send_nocopy(ept, rsp, (ret < 0 ? 0 : ret * msg->sectorsize) +
- sizeof(*rsp) - 1);
+ if (rpmsg_send_nocopy(ept, rsp, (ret < 0 ? 0 : ret * msg->sectorsize) +
+ sizeof(*rsp) - 1) < 0)
+ {
+ rpmsg_release_tx_buffer(ept, rsp);
+ }
+
if (ret <= 0)
{
ferr("mtd block read failed\n");
@@ -327,6 +331,7 @@ static int rpmsgblk_mmc_cmd_handler(FAR struct
rpmsg_endpoint *ept,
size_t rsplen;
size_t arglen;
uint32_t space;
+ int ret;
arglen = sizeof(struct mmc_ioc_cmd);
if (!ioc->write_flag)
@@ -358,8 +363,13 @@ static int rpmsgblk_mmc_cmd_handler(FAR struct
rpmsg_endpoint *ept,
rsp->header.result = server->bops->ioctl(server->blknode, rsp->request,
(unsigned long)rsp->buf);
+ ret = rpmsg_send_nocopy(ept, rsp, rsplen);
+ if (ret < 0)
+ {
+ rpmsg_release_tx_buffer(ept, rsp);
+ }
- return rpmsg_send_nocopy(ept, rsp, rsplen);
+ return ret;
}
/****************************************************************************
@@ -380,6 +390,7 @@ static int rpmsgblk_mmc_multi_cmd_handler(FAR struct
rpmsg_endpoint *ept,
size_t rsp_off;
uint32_t space;
uint64_t i;
+ int ret;
arglen = sizeof(struct mmc_ioc_multi_cmd) +
mioc->num_of_cmds * sizeof(struct mmc_ioc_cmd);
@@ -427,8 +438,13 @@ static int rpmsgblk_mmc_multi_cmd_handler(FAR struct
rpmsg_endpoint *ept,
rsp->header.result = server->bops->ioctl(server->blknode, rsp->request,
(unsigned long)rsp->buf);
+ ret = rpmsg_send_nocopy(ept, rsp, rsplen);
+ if (ret < 0)
+ {
+ rpmsg_release_tx_buffer(ept, rsp);
+ }
- return rpmsg_send_nocopy(ept, rsp, rsplen);
+ return ret;
}
/****************************************************************************
diff --git a/drivers/mtd/rpmsgmtd_server.c b/drivers/mtd/rpmsgmtd_server.c
index d583c1a790..9cfeb4dad8 100644
--- a/drivers/mtd/rpmsgmtd_server.c
+++ b/drivers/mtd/rpmsgmtd_server.c
@@ -166,8 +166,9 @@ static int rpmsgmtd_bread_handler(FAR struct rpmsg_endpoint
*ept,
rsp->header.result = ret;
rpmsg_send_nocopy(ept, rsp, (ret < 0 ? 0 : ret * msg->blocksize) +
sizeof(*rsp) - 1);
- if (ret <= 0)
+ if (ret < 0)
{
+ rpmsg_release_tx_buffer(ept, rsp);
ferr("mtd block read failed\n");
break;
}
@@ -246,8 +247,9 @@ static int rpmsgmtd_read_handler(FAR struct rpmsg_endpoint
*ept,
rsp->header.result = ret;
rpmsg_send_nocopy(ept, rsp, (ret < 0 ? 0 : ret) + sizeof(*rsp) - 1);
- if (ret <= 0)
+ if (ret < 0)
{
+ rpmsg_release_tx_buffer(ept, rsp);
break;
}
diff --git a/drivers/net/rpmsgdrv.c b/drivers/net/rpmsgdrv.c
index 17dd734fa4..1a4c9910eb 100644
--- a/drivers/net/rpmsgdrv.c
+++ b/drivers/net/rpmsgdrv.c
@@ -214,6 +214,11 @@ static int net_rpmsg_drv_transmit(FAR struct net_driver_s
*dev, bool nocopy)
if (ret < 0)
{
+ if (nocopy)
+ {
+ rpmsg_release_tx_buffer(&priv->ept, msg);
+ }
+
NETDEV_TXERRORS(dev);
return ret;
}
diff --git a/drivers/note/noterpmsg_driver.c b/drivers/note/noterpmsg_driver.c
index 67fbbcc9d4..d1029ec7b5 100644
--- a/drivers/note/noterpmsg_driver.c
+++ b/drivers/note/noterpmsg_driver.c
@@ -151,7 +151,11 @@ static bool noterpmsg_transfer(FAR struct
noterpmsg_driver_s *drv,
memcpy(buffer, drv->buffer + drv->tail, space);
memcpy(buffer + space, drv->buffer, len - space);
- rpmsg_send_nocopy(&drv->ept, buffer, len);
+ if (rpmsg_send_nocopy(&drv->ept, buffer, len) < 0)
+ {
+ rpmsg_release_tx_buffer(&drv->ept, buffer);
+ }
+
drv->tail = noterpmsg_next(drv, drv->tail, len);
}
}
diff --git a/drivers/power/supply/regulator_rpmsg.c
b/drivers/power/supply/regulator_rpmsg.c
index ba6f431e5d..19de90bab5 100644
--- a/drivers/power/supply/regulator_rpmsg.c
+++ b/drivers/power/supply/regulator_rpmsg.c
@@ -546,6 +546,10 @@ static int regulator_rpmsg_sendrecv(FAR struct
rpmsg_endpoint *ept,
ret = cookie.result;
}
}
+ else
+ {
+ rpmsg_release_tx_buffer(ept, msg);
+ }
nxsem_destroy(&cookie.sem);
return ret;
diff --git a/drivers/rpmsg/rpmsg_ping.c b/drivers/rpmsg/rpmsg_ping.c
index 654a5ebb91..5321f8719d 100644
--- a/drivers/rpmsg/rpmsg_ping.c
+++ b/drivers/rpmsg/rpmsg_ping.c
@@ -168,6 +168,11 @@ static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept,
ret = rpmsg_send_nocopy(ept, msg, len);
}
+ if (ret < 0)
+ {
+ rpmsg_release_tx_buffer(ept, msg);
+ }
+
return ret;
}
diff --git a/drivers/sensors/sensor_rpmsg.c b/drivers/sensors/sensor_rpmsg.c
index 5ad5790607..24f41bbc0c 100644
--- a/drivers/sensors/sensor_rpmsg.c
+++ b/drivers/sensors/sensor_rpmsg.c
@@ -328,6 +328,7 @@ static void sensor_rpmsg_advsub_one(FAR struct
sensor_rpmsg_dev_s *dev,
ret = rpmsg_send_nocopy(ept, msg, sizeof(*msg) + len);
if (ret < 0)
{
+ rpmsg_release_tx_buffer(ept, msg);
snerr("ERROR: advsub:%d rpmsg send failed:%s, %d, %s\n",
command, dev->path, ret, rpmsg_get_cpuname(ept->rdev));
}
@@ -406,6 +407,7 @@ static int sensor_rpmsg_ioctl(FAR struct sensor_rpmsg_dev_s
*dev,
ret = rpmsg_send_nocopy(ept, msg, sizeof(*msg) + len);
if (ret < 0)
{
+ rpmsg_release_tx_buffer(ept, msg);
snerr("ERROR: ioctl rpmsg send failed:%s, %d, %s\n",
dev->path, ret, rpmsg_get_cpuname(ept->rdev));
break;
@@ -803,11 +805,19 @@ static int sensor_rpmsg_control(FAR struct
sensor_lowerhalf_s *lower,
static void sensor_rpmsg_data_worker(FAR void *arg)
{
FAR struct sensor_rpmsg_ept_s *sre = arg;
+ int ret;
nxrmutex_lock(&sre->lock);
if (sre->buffer)
{
- rpmsg_send_nocopy(&sre->ept, sre->buffer, sre->written);
+ ret = rpmsg_send_nocopy(&sre->ept, sre->buffer, sre->written);
+ if (ret < 0)
+ {
+ rpmsg_release_tx_buffer(&sre->ept, sre->buffer);
+ snerr("ERROR: push event rpmsg send failed:%d, %s\n",
+ ret, rpmsg_get_cpuname(sre->ept.rdev));
+ }
+
sre->buffer = NULL;
}
@@ -916,12 +926,14 @@ static void sensor_rpmsg_push_event_one(FAR struct
sensor_rpmsg_dev_s *dev,
if (sre->expire <= now && sre->buffer)
{
ret = rpmsg_send_nocopy(&sre->ept, sre->buffer, sre->written);
- sre->buffer = NULL;
if (ret < 0)
{
+ rpmsg_release_tx_buffer(&sre->ept, sre->buffer);
snerr("ERROR: push event rpmsg send failed:%d, %s\n",
ret, rpmsg_get_cpuname(sre->ept.rdev));
}
+
+ sre->buffer = NULL;
}
else
{
diff --git a/drivers/serial/uart_rpmsg.c b/drivers/serial/uart_rpmsg.c
index a3e9e7adb8..54e3777906 100644
--- a/drivers/serial/uart_rpmsg.c
+++ b/drivers/serial/uart_rpmsg.c
@@ -217,7 +217,10 @@ static void uart_rpmsg_dmasend(FAR struct uart_dev_s *dev)
msg->header.result = -ENXIO;
msg->header.cookie = (uintptr_t)dev;
- rpmsg_send_nocopy(&priv->ept, msg, sizeof(*msg) + len);
+ if (rpmsg_send_nocopy(&priv->ept, msg, sizeof(*msg) + len) < 0)
+ {
+ rpmsg_release_tx_buffer(&priv->ept, msg);
+ }
}
static void uart_rpmsg_dmareceive(FAR struct uart_dev_s *dev)
diff --git a/drivers/syslog/syslog_rpmsg.c b/drivers/syslog/syslog_rpmsg.c
index d7b7ceeba9..e5450a7b85 100644
--- a/drivers/syslog/syslog_rpmsg.c
+++ b/drivers/syslog/syslog_rpmsg.c
@@ -168,7 +168,11 @@ static bool syslog_rpmsg_transfer(FAR struct
syslog_rpmsg_s *priv, bool wait)
msg->count = len;
priv->tail += len;
msg->header.command = SYSLOG_RPMSG_TRANSFER;
- rpmsg_send_nocopy(&priv->ept, msg, sizeof(*msg) + len);
+ if (rpmsg_send_nocopy(&priv->ept, msg, sizeof(*msg) + len) < 0)
+ {
+ rpmsg_release_tx_buffer(&priv->ept, msg);
+ }
+
len = SYSLOG_RPMSG_COUNT(priv);
leave_critical_section(flags);
diff --git a/drivers/usrsock/usrsock_rpmsg.c b/drivers/usrsock/usrsock_rpmsg.c
index dca23d4204..01c5b417d9 100644
--- a/drivers/usrsock/usrsock_rpmsg.c
+++ b/drivers/usrsock/usrsock_rpmsg.c
@@ -100,6 +100,10 @@ static int usrsock_rpmsg_send_dns_request(FAR void *arg,
net_lock();
ret = rpmsg_send_nocopy(ept, dns, sizeof(*dns) + addrlen);
net_unlock();
+ if (ret < 0)
+ {
+ rpmsg_release_tx_buffer(ept, dns);
+ }
return ret;
}
@@ -225,6 +229,7 @@ int usrsock_request(FAR struct iovec *iov, unsigned int
iovcnt)
ret = rpmsg_send_nocopy(&priv->ept, buf, ret);
if (ret < 0)
{
+ rpmsg_release_tx_buffer(&priv->ept, buf);
break;
}
diff --git a/drivers/usrsock/usrsock_rpmsg_server.c
b/drivers/usrsock/usrsock_rpmsg_server.c
index 1b9d77ecd2..97c50e3181 100644
--- a/drivers/usrsock/usrsock_rpmsg_server.c
+++ b/drivers/usrsock/usrsock_rpmsg_server.c
@@ -228,6 +228,8 @@ static int usrsock_rpmsg_send_data_ack(FAR struct
rpmsg_endpoint *ept,
uint16_t valuelen_nontrunc,
int32_t datalen)
{
+ int ret;
+
ack->reqack.head.msgid = USRSOCK_MESSAGE_RESPONSE_DATA_ACK;
ack->reqack.head.flags = 0;
ack->reqack.head.events = events;
@@ -249,7 +251,13 @@ static int usrsock_rpmsg_send_data_ack(FAR struct
rpmsg_endpoint *ept,
ack->valuelen = valuelen;
ack->valuelen_nontrunc = valuelen_nontrunc;
- return rpmsg_send_nocopy(ept, ack, sizeof(*ack) + valuelen + datalen);
+ ret = rpmsg_send_nocopy(ept, ack, sizeof(*ack) + valuelen + datalen);
+ if (ret < 0)
+ {
+ rpmsg_release_tx_buffer(ept, ack);
+ }
+
+ return ret;
}
static int usrsock_rpmsg_send_frag_ack(FAR struct rpmsg_endpoint *ept,
@@ -980,6 +988,7 @@ static int usrsock_rpmsg_send_dns_event(FAR void *arg,
FAR struct rpmsg_endpoint *ept = arg;
FAR struct usrsock_rpmsg_dns_event_s *dns;
uint32_t len;
+ int ret;
dns = rpmsg_get_tx_payload_buffer(ept, &len, true);
if (dns == NULL)
@@ -993,7 +1002,13 @@ static int usrsock_rpmsg_send_dns_event(FAR void *arg,
dns->addrlen = addrlen;
memcpy(dns + 1, addr, addrlen);
- return rpmsg_send_nocopy(ept, dns, sizeof(*dns) + addrlen);
+ ret = rpmsg_send_nocopy(ept, dns, sizeof(*dns) + addrlen);
+ if (ret < 0)
+ {
+ rpmsg_release_tx_buffer(ept, dns);
+ }
+
+ return ret;
}
#endif
diff --git a/drivers/wireless/bluetooth/bt_rpmsghci.c
b/drivers/wireless/bluetooth/bt_rpmsghci.c
index 1936354bb1..72aa10b3fd 100644
--- a/drivers/wireless/bluetooth/bt_rpmsghci.c
+++ b/drivers/wireless/bluetooth/bt_rpmsghci.c
@@ -130,6 +130,7 @@ static int rpmsghci_send(FAR struct rpmsghci_s *priv,
uint32_t command,
ret = rpmsg_send_nocopy(&priv->ept, msg, len);
if (ret < 0)
{
+ rpmsg_release_tx_buffer(&priv->ept, msg);
goto errout;
}
diff --git a/drivers/wireless/bluetooth/bt_rpmsghci_server.c
b/drivers/wireless/bluetooth/bt_rpmsghci_server.c
index bbebb13096..56eab7d7ff 100644
--- a/drivers/wireless/bluetooth/bt_rpmsghci_server.c
+++ b/drivers/wireless/bluetooth/bt_rpmsghci_server.c
@@ -132,6 +132,7 @@ static int rpmsghci_send(FAR struct rpmsghci_server_s *priv,
ret = rpmsg_send_nocopy(&priv->ept, msg, len);
if (ret < 0)
{
+ rpmsg_release_tx_buffer(&priv->ept, msg);
goto errout;
}
diff --git a/fs/rpmsgfs/rpmsgfs_client.c b/fs/rpmsgfs/rpmsgfs_client.c
index 99dcdf4b57..2d425f0a77 100644
--- a/fs/rpmsgfs/rpmsgfs_client.c
+++ b/fs/rpmsgfs/rpmsgfs_client.c
@@ -373,6 +373,11 @@ static int rpmsgfs_send_recv(FAR struct rpmsgfs_s *priv,
if (ret < 0)
{
+ if (copy == false)
+ {
+ rpmsg_release_tx_buffer(&priv->ept, msg);
+ }
+
goto fail;
}
@@ -550,6 +555,7 @@ ssize_t rpmsgfs_client_write(FAR void *handle, int fd,
ret = rpmsg_send_nocopy(&priv->ept, msg, sizeof(*msg) + space);
if (ret < 0)
{
+ rpmsg_release_tx_buffer(&priv->ept, msg);
goto out;
}
diff --git a/fs/rpmsgfs/rpmsgfs_server.c b/fs/rpmsgfs/rpmsgfs_server.c
index e03e4cf03f..7fa9cd76f5 100644
--- a/fs/rpmsgfs/rpmsgfs_server.c
+++ b/fs/rpmsgfs/rpmsgfs_server.c
@@ -391,7 +391,11 @@ static int rpmsgfs_read_handler(FAR struct rpmsg_endpoint
*ept,
}
rsp->header.result = ret;
- rpmsg_send_nocopy(ept, rsp, (ret < 0 ? 0 : ret) + sizeof(*rsp));
+ if (rpmsg_send_nocopy(ept, rsp, (ret < 0 ? 0 : ret) + sizeof(*rsp))
+ < 0)
+ {
+ rpmsg_release_tx_buffer(ept, rsp);
+ }
if (ret <= 0)
{