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;
         }