You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/07/22 14:10:25 UTC
[incubator-nuttx] branch master updated (344a9bc838 -> 1e5568b030)
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
from 344a9bc838 fs/hostfs: Change nuttx_dev_t from uint16_t to uint32_t
new 837c15dcb6 rpmsgfs: improve file read & write performance
new 5f60b7dc12 rpmsgfs: hande count <=0 when rpmsgfs_read&write
new 572d865034 rpmsgfs: cache statfs result in case of deadlock
new 1e5568b030 rpmsgfs: fix nx_style
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
fs/rpmsgfs/rpmsgfs.c | 10 ++++
fs/rpmsgfs/rpmsgfs_client.c | 117 ++++++++++++++++++++++++++++++++------------
fs/rpmsgfs/rpmsgfs_server.c | 68 ++++++++++++++++++-------
3 files changed, 144 insertions(+), 51 deletions(-)
[incubator-nuttx] 02/04: rpmsgfs: hande count <=0 when rpmsgfs_read&write
Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 5f60b7dc12fdeca403ec0a402288aa594e3eecfb
Author: ligd <li...@xiaomi.com>
AuthorDate: Thu May 19 12:15:24 2022 +0800
rpmsgfs: hande count <=0 when rpmsgfs_read&write
Signed-off-by: ligd <li...@xiaomi.com>
---
fs/rpmsgfs/rpmsgfs_client.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/fs/rpmsgfs/rpmsgfs_client.c b/fs/rpmsgfs/rpmsgfs_client.c
index c79586cab6..48d17e49d1 100644
--- a/fs/rpmsgfs/rpmsgfs_client.c
+++ b/fs/rpmsgfs/rpmsgfs_client.c
@@ -451,6 +451,11 @@ ssize_t rpmsgfs_client_read(FAR void *handle, int fd,
struct rpmsgfs_read_s msg;
int ret = 0;
+ if (!buf || count <= 0)
+ {
+ return 0;
+ }
+
memset(&cookie, 0, sizeof(cookie));
nxsem_init(&cookie.sem, 0, 0);
@@ -490,6 +495,11 @@ ssize_t rpmsgfs_client_write(FAR void *handle, int fd,
size_t written = 0;
int ret = 0;
+ if (!buf || count <= 0)
+ {
+ return 0;
+ }
+
memset(&cookie, 0, sizeof(cookie));
nxsem_init(&cookie.sem, 0, 0);
nxsem_set_protocol(&cookie.sem, SEM_PRIO_NONE);
[incubator-nuttx] 01/04: rpmsgfs: improve file read & write performance
Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 837c15dcb6e80dcd1e6beabb4b326675765a8a1e
Author: ligd <li...@xiaomi.com>
AuthorDate: Mon May 16 16:10:30 2022 +0800
rpmsgfs: improve file read & write performance
Signed-off-by: ligd <li...@xiaomi.com>
---
fs/rpmsgfs/rpmsgfs_client.c | 109 ++++++++++++++++++++++++++++++--------------
fs/rpmsgfs/rpmsgfs_server.c | 68 +++++++++++++++++++--------
2 files changed, 125 insertions(+), 52 deletions(-)
diff --git a/fs/rpmsgfs/rpmsgfs_client.c b/fs/rpmsgfs/rpmsgfs_client.c
index 97456ceb8f..c79586cab6 100644
--- a/fs/rpmsgfs/rpmsgfs_client.c
+++ b/fs/rpmsgfs/rpmsgfs_client.c
@@ -26,6 +26,7 @@
#include <string.h>
#include <stdio.h>
+#include <sys/uio.h>
#include <nuttx/kmalloc.h>
#include <nuttx/fs/ioctl.h>
@@ -48,9 +49,9 @@ struct rpmsgfs_s
struct rpmsgfs_cookie_s
{
- sem_t sem;
- int result;
- FAR void *data;
+ sem_t sem;
+ int result;
+ FAR void *data;
};
/****************************************************************************
@@ -148,14 +149,19 @@ static int rpmsgfs_read_handler(FAR struct rpmsg_endpoint *ept,
FAR struct rpmsgfs_cookie_s *cookie =
(struct rpmsgfs_cookie_s *)(uintptr_t)header->cookie;
FAR struct rpmsgfs_read_s *rsp = data;
+ FAR struct iovec *read = cookie->data;
cookie->result = header->result;
if (cookie->result > 0)
{
- memcpy(cookie->data, rsp->buf, cookie->result);
+ memcpy(read->iov_base + read->iov_len, rsp->buf, cookie->result);
+ read->iov_len += cookie->result;
}
- rpmsg_post(ept, &cookie->sem);
+ if (cookie->result <= 0 || read->iov_len >= rsp->count)
+ {
+ rpmsg_post(ept, &cookie->sem);
+ }
return 0;
}
@@ -434,38 +440,60 @@ int rpmsgfs_client_close(FAR void *handle, int fd)
ssize_t rpmsgfs_client_read(FAR void *handle, int fd,
FAR void *buf, size_t count)
{
- size_t read = 0;
+ FAR struct rpmsgfs_s *priv = handle;
+ struct iovec read =
+ {
+ .iov_base = buf,
+ .iov_len = 0,
+ };
+
+ struct rpmsgfs_cookie_s cookie;
+ struct rpmsgfs_read_s msg;
int ret = 0;
- while (read < count)
- {
- struct rpmsgfs_read_s msg =
- {
- .fd = fd,
- .count = count - read,
- };
+ memset(&cookie, 0, sizeof(cookie));
- ret = rpmsgfs_send_recv(handle, RPMSGFS_READ, true,
- (FAR struct rpmsgfs_header_s *)&msg, sizeof(msg), buf);
- if (ret <= 0)
- {
- break;
- }
+ nxsem_init(&cookie.sem, 0, 0);
+ nxsem_set_protocol(&cookie.sem, SEM_PRIO_NONE);
+ cookie.data = &read;
- read += ret;
- buf += ret;
+ msg.header.command = RPMSGFS_READ;
+ msg.header.result = -ENXIO;
+ msg.header.cookie = (uintptr_t)&cookie;
+ msg.fd = fd;
+ msg.count = count;
+
+ ret = rpmsg_send(&priv->ept, &msg, sizeof(msg));
+ if (ret < 0)
+ {
+ goto out;
}
- return read ? read : ret;
+ ret = rpmsg_wait(&priv->ept, &cookie.sem);
+ if (ret < 0)
+ {
+ goto out;
+ }
+
+ ret = cookie.result;
+
+out:
+ nxsem_destroy(&cookie.sem);
+ return read.iov_len ? read.iov_len : ret;
}
ssize_t rpmsgfs_client_write(FAR void *handle, int fd,
FAR const void *buf, size_t count)
{
FAR struct rpmsgfs_s *priv = handle;
+ struct rpmsgfs_cookie_s cookie;
size_t written = 0;
int ret = 0;
+ memset(&cookie, 0, sizeof(cookie));
+ nxsem_init(&cookie.sem, 0, 0);
+ nxsem_set_protocol(&cookie.sem, SEM_PRIO_NONE);
+
while (written < count)
{
FAR struct rpmsgfs_write_s *msg;
@@ -475,31 +503,46 @@ ssize_t rpmsgfs_client_write(FAR void *handle, int fd,
if (!msg)
{
ret = -ENOMEM;
- break;
+ goto out;
}
space -= sizeof(*msg);
- if (space > count - written)
+ if (space >= count - written)
{
space = count - written;
+ msg->header.cookie = (uintptr_t)&cookie;
+ }
+ else
+ {
+ msg->header.cookie = 0;
}
- msg->fd = fd;
- msg->count = space;
+ msg->header.command = RPMSGFS_WRITE;
+ msg->header.result = -ENXIO;
+ msg->fd = fd;
+ msg->count = space;
memcpy(msg->buf, buf + written, space);
- ret = rpmsgfs_send_recv(priv, RPMSGFS_WRITE, false,
- (FAR struct rpmsgfs_header_s *)msg,
- sizeof(*msg) + space, NULL);
- if (ret <= 0)
+ ret = rpmsg_send_nocopy(&priv->ept, msg, sizeof(*msg) + space);
+ if (ret < 0)
{
- break;
+ goto out;
}
- written += ret;
+ written += space;
+ }
+
+ ret = rpmsg_wait(&priv->ept, &cookie.sem);
+ if (ret < 0)
+ {
+ goto out;
}
- return written ? written : ret;
+ ret = cookie.result;
+
+out:
+ nxsem_destroy(&cookie.sem);
+ return ret < 0 ? ret : count;
}
off_t rpmsgfs_client_lseek(FAR void *handle, int fd,
diff --git a/fs/rpmsgfs/rpmsgfs_server.c b/fs/rpmsgfs/rpmsgfs_server.c
index 6698be31bf..a93da84335 100644
--- a/fs/rpmsgfs/rpmsgfs_server.c
+++ b/fs/rpmsgfs/rpmsgfs_server.c
@@ -370,30 +370,44 @@ static int rpmsgfs_read_handler(FAR struct rpmsg_endpoint *ept,
FAR struct rpmsgfs_read_s *rsp;
FAR struct file *filep;
int ret = -ENOENT;
+ size_t read = 0;
uint32_t space;
- rsp = rpmsg_get_tx_payload_buffer(ept, &space, true);
- if (!rsp)
+ filep = rpmsgfs_get_file(priv, msg->fd);
+
+ while (read < msg->count)
{
- return -ENOMEM;
- }
+ rsp = rpmsg_get_tx_payload_buffer(ept, &space, true);
+ if (!rsp)
+ {
+ return -ENOMEM;
+ }
- *rsp = *msg;
+ *rsp = *msg;
- space -= sizeof(*msg);
- if (space > msg->count)
- {
- space = msg->count;
- }
+ space -= sizeof(*msg);
+ if (space > msg->count - read)
+ {
+ space = msg->count - read;
+ }
- filep = rpmsgfs_get_file(priv, msg->fd);
- if (filep != NULL)
- {
- ret = file_read(filep, rsp->buf, space);
+ if (filep != NULL)
+ {
+ ret = file_read(filep, rsp->buf, space);
+ }
+
+ rsp->header.result = ret;
+ rpmsg_send_nocopy(ept, rsp, (ret < 0 ? 0 : ret) + sizeof(*rsp));
+
+ if (ret <= 0)
+ {
+ break;
+ }
+
+ read += ret;
}
- rsp->header.result = ret;
- return rpmsg_send_nocopy(ept, rsp, (ret < 0 ? 0 : ret) + sizeof(*rsp));
+ return 0;
}
static int rpmsgfs_write_handler(FAR struct rpmsg_endpoint *ept,
@@ -407,11 +421,27 @@ static int rpmsgfs_write_handler(FAR struct rpmsg_endpoint *ept,
filep = rpmsgfs_get_file(priv, msg->fd);
if (filep != NULL)
{
- ret = file_write(filep, msg->buf, msg->count);
+ size_t written = 0;
+
+ while (written < msg->count)
+ {
+ ret = file_write(filep, msg->buf + written, msg->count - written);
+ if (ret < 0)
+ {
+ break;
+ }
+
+ written += ret;
+ }
}
- msg->header.result = ret;
- return rpmsg_send(ept, msg, sizeof(*msg));
+ if (msg->header.cookie != 0)
+ {
+ msg->header.result = ret;
+ rpmsg_send(ept, msg, sizeof(*msg));
+ }
+
+ return 0;
}
static int rpmsgfs_lseek_handler(FAR struct rpmsg_endpoint *ept,
[incubator-nuttx] 03/04: rpmsgfs: cache statfs result in case of deadlock
Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 572d8650340550a467d4583eb7d5c2b184eb7475
Author: ligd <li...@xiaomi.com>
AuthorDate: Thu Jul 7 14:43:59 2022 +0800
rpmsgfs: cache statfs result in case of deadlock
rptun: msg from other cpu
[ap] [ 5] [<0x2c353768>] arm_switchcontext+0xc/0x10
[ap] [ 5] [<0x2c322266>] sem_wait+0x5a/0xbc
[ap] [ 5] [<0x2c7400a8>] inode_semtake+0x24/0x5c
[ap] [ 5] [<0x2c74087a>] inode_release+0x6/0x60
[ap] [ 5] [<0x2c741284>] file_close+0x18/0x44
[ap] [ 5] [<0x2c74fb06>] rpmsgfs_close_handler+0x86/0xe4
[ap] [ 5] [<0x2c75b8de>] rpmsg_virtio_rx_callback+0xba/0x1b4
[ap] [ 5] [<0x2c75af70>] rproc_virtio_notified+0x44/0x5c
[ap] [ 5] [<0x2c75a93c>] remoteproc_get_notification+0x1c/0x2c
[ap] [ 5] [<0x2c335a08>] rptun_thread+0x74/0x208
[ap] [ 5] [<0x2c323e72>] nxtask_start+0x3a/0x60
nsh: send msg to other cpu with inode lock
[ap] [10] [<0x2c353768>] arm_switchcontext+0xc/0x10
[ap] [10] [<0x2c3221b2>] nxsem_wait_uninterruptible+0x6e/0xc8
[ap] [10] [<0x2c74e498>] rpmsgfs_send_recv.constprop.0+0x78/0xc0
[ap] [10] [<0x2c74ebc0>] rpmsgfs_client_statfs+0x50/0x80
[ap] [10] [<0x2c3221ca>] nxsem_wait_uninterruptible+0x86/0xc8
[ap] [10] [<0x2c74da78>] rpmsgfs_statfs+0x28/0x50
[ap] [10] [<0x2c74534e>] mountpoint_filter+0x66/0x90
[ap] [10] [<0x2c740016>] foreach_inodelevel+0x66/0x88
[ap] [10] [<0x2c73fffa>] foreach_inodelevel+0x4a/0x88
[ap] [10] [<0x2c740062>] foreach_inode+0x2a/0x48
[ap] [10] [<0x2c745388>] foreach_mountpoint+0x10/0x20
[ap] [10] [<0x2c745606>] mount_read+0x36/0x70
[ap] [10] [<0x2c742a34>] read+0x30/0x5c
[ap] [10] [<0x2c371096>] nsh_catfile+0x36/0x140
[ap] [10] [<0x2c36d01a>] nsh_parse_command+0x7fe/0xc54
[ap] [10] [<0x2c370f92>] nsh_session+0x66/0x134
[ap] [10] [<0x2c3721a4>] nsh_consolemain+0x2c/0x44
[ap] [10] [<0x2c374fde>] nsh_main+0x2a/0x4c
[ap] [10] [<0x2c33f7f8>] lib_cxx_initialize+0x24/0x48
[ap] [10] [<0x2c34274a>] nxtask_startup+0x12/0x24
[ap] [10] [<0x2c323e7e>] nxtask_start+0x46/0x60
Signed-off-by: ligd <li...@xiaomi.com>
---
fs/rpmsgfs/rpmsgfs.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/fs/rpmsgfs/rpmsgfs.c b/fs/rpmsgfs/rpmsgfs.c
index 36ef3fd90a..e225d8e79d 100644
--- a/fs/rpmsgfs/rpmsgfs.c
+++ b/fs/rpmsgfs/rpmsgfs.c
@@ -78,6 +78,7 @@ struct rpmsgfs_mountpt_s
char fs_root[PATH_MAX];
void *handle;
int timeout; /* Connect timeout */
+ struct statfs statfs;
};
/****************************************************************************
@@ -1232,12 +1233,21 @@ static int rpmsgfs_statfs(FAR struct inode *mountpt, FAR struct statfs *buf)
return ret;
}
+ if (fs->statfs.f_type == RPMSGFS_MAGIC)
+ {
+ memcpy(buf, &fs->statfs, sizeof(struct statfs));
+ rpmsgfs_semgive(fs);
+ return 0;
+ }
+
/* Call the host fs to perform the statfs */
memset(buf, 0, sizeof(struct statfs));
ret = rpmsgfs_client_statfs(fs->handle, fs->fs_root, buf);
buf->f_type = RPMSGFS_MAGIC;
+ memcpy(&fs->statfs, buf, sizeof(struct statfs));
+
rpmsgfs_semgive(fs);
return ret;
}
[incubator-nuttx] 04/04: rpmsgfs: fix nx_style
Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 1e5568b030ba60910654e38f7db870d5bba789e2
Author: ligd <li...@xiaomi.com>
AuthorDate: Fri Jul 22 12:38:27 2022 +0800
rpmsgfs: fix nx_style
Signed-off-by: ligd <li...@xiaomi.com>
---
fs/rpmsgfs/rpmsgfs_client.c | 2 +-
fs/rpmsgfs/rpmsgfs_server.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/rpmsgfs/rpmsgfs_client.c b/fs/rpmsgfs/rpmsgfs_client.c
index 48d17e49d1..670031a557 100644
--- a/fs/rpmsgfs/rpmsgfs_client.c
+++ b/fs/rpmsgfs/rpmsgfs_client.c
@@ -484,7 +484,7 @@ ssize_t rpmsgfs_client_read(FAR void *handle, int fd,
out:
nxsem_destroy(&cookie.sem);
- return read.iov_len ? read.iov_len : ret;
+ return read.iov_len > 0 ? read.iov_len : ret;
}
ssize_t rpmsgfs_client_write(FAR void *handle, int fd,
diff --git a/fs/rpmsgfs/rpmsgfs_server.c b/fs/rpmsgfs/rpmsgfs_server.c
index a93da84335..23175ed49d 100644
--- a/fs/rpmsgfs/rpmsgfs_server.c
+++ b/fs/rpmsgfs/rpmsgfs_server.c
@@ -378,7 +378,7 @@ static int rpmsgfs_read_handler(FAR struct rpmsg_endpoint *ept,
while (read < msg->count)
{
rsp = rpmsg_get_tx_payload_buffer(ept, &space, true);
- if (!rsp)
+ if (rsp == NULL)
{
return -ENOMEM;
}