This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 59259eb7f2485023b78024e6fdf0ce3286b06b76 Author: Bowen Wang <[email protected]> AuthorDate: Wed Jan 28 11:07:35 2026 +0100 openamp/lib/rpmsg_virtio: release the name service messsage early To improve the share memory buffer utilization 1. Support release the rx buffer early, the ept->cb should return RPMSG_SUCCESS_BUFFER_RETURNED to tell the rpmsg virtio the rx buffer has been released; 2. Modifty name service callback to release the rx name service message early; Signed-off-by: Bowen Wang <[email protected]> --- ...irtio-support-release-the-name-service-me.patch | 148 +++++++++++++++++++++ openamp/open-amp.cmake | 2 + openamp/open-amp.defs | 1 + 3 files changed, 151 insertions(+) diff --git a/openamp/0016-lib-rpmsg_virtio-support-release-the-name-service-me.patch b/openamp/0016-lib-rpmsg_virtio-support-release-the-name-service-me.patch new file mode 100644 index 00000000000..62f8cfd82d3 --- /dev/null +++ b/openamp/0016-lib-rpmsg_virtio-support-release-the-name-service-me.patch @@ -0,0 +1,148 @@ +From abd23c3a7b02837b3200e94bb111c07c288466c5 Mon Sep 17 00:00:00 2001 +From: Bowen Wang <[email protected]> +Date: Fri, 19 Jul 2024 15:12:38 +0800 +Subject: [PATCH 16/17] lib/rpmsg_virtio: support release the name service + message early + +To improve the share memory buffer utilization +1. Support release the rx buffer early, the ept->cb should return + RPMSG_SUCCESS_BUFFER_RETURNED to tell the rpmsg virtio the + rx buffer has been released; +2. Modify name service callback to release the rx name service + message early; + +Signed-off-by: Bowen Wang <[email protected]> +--- + lib/include/openamp/rpmsg.h | 1 + + lib/rpmsg/rpmsg_virtio.c | 40 +++++++++++++++++++++---------------- + 2 files changed, 24 insertions(+), 17 deletions(-) + +diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h +index 3f4c6c7fc6..5b702339aa 100644 +--- a/lib/include/openamp/rpmsg.h ++++ open-amp/lib/include/openamp/rpmsg.h +@@ -41,6 +41,7 @@ extern "C" { + + /* Error macros. */ + #define RPMSG_SUCCESS 0 ++#define RPMSG_SUCCESS_BUFFER_RELEASED -1000 + #define RPMSG_ERROR_BASE -2000 + #define RPMSG_ERR_NO_MEM (RPMSG_ERROR_BASE - 1) + #define RPMSG_ERR_NO_BUFF (RPMSG_ERROR_BASE - 2) +diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c +index 8a72d8f8ef..9913d87081 100644 +--- a/lib/rpmsg/rpmsg_virtio.c ++++ open-amp/lib/rpmsg/rpmsg_virtio.c +@@ -559,7 +559,7 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq) + bool last = false; + uint32_t len; + uint16_t idx; +- int status; ++ int status = RPMSG_SUCCESS; + + while (!last) { + /* Process the received data from remote node */ +@@ -594,13 +594,15 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq) + status = ept->cb(ept, RPMSG_LOCATE_DATA(rp_hdr), + rp_hdr->len, rp_hdr->src, ept->priv); + +- RPMSG_ASSERT(status >= 0, ++ RPMSG_ASSERT(status >= 0 || ++ status == RPMSG_SUCCESS_BUFFER_RELEASED, + "unexpected callback status\r\n"); + } + + metal_mutex_acquire(&rdev->lock); + rpmsg_ept_decref(ept); +- if (rpmsg_virtio_buf_held_dec_test(rp_hdr)) { ++ if (status != RPMSG_SUCCESS_BUFFER_RELEASED && ++ rpmsg_virtio_buf_held_dec_test(rp_hdr)) { + rpmsg_virtio_release_rx_buffer_nolock(rvdev, rp_hdr); + if (VIRTIO_ENABLED(VQ_RX_EMPTY_NOTIFY)) + /* Kick will be sent only when last buffer is released */ +@@ -636,26 +638,30 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, + rdev); + struct metal_io_region *io = rvdev->shbuf_io; + struct rpmsg_endpoint *_ept; +- struct rpmsg_ns_msg *ns_msg; ++ struct rpmsg_ns_msg ns_msg; + uint32_t dest; + bool ept_to_release; +- char name[RPMSG_NAME_SIZE]; + + (void)ept; + (void)src; + +- ns_msg = data; +- if (len != sizeof(*ns_msg)) ++ if (len != sizeof(ns_msg)) + /* Returns as the message is corrupted */ + return RPMSG_SUCCESS; +- metal_io_block_read(io, +- metal_io_virt_to_offset(io, ns_msg->name), +- &name, sizeof(name)); +- dest = ns_msg->addr; ++ ++ /* ++ * copy buffer to local ns_msg and release the rx buffer early to ++ * improve the buffer utilization. ++ */ ++ metal_io_block_read(io, metal_io_virt_to_offset(io, data), ++ &ns_msg, sizeof(ns_msg)); ++ rpmsg_virtio_release_rx_buffer(rdev, data); ++ ++ dest = ns_msg.addr; + + /* check if a Ept has been locally registered */ + metal_mutex_acquire(&rdev->lock); +- _ept = rpmsg_get_endpoint(rdev, name, RPMSG_ADDR_ANY, dest); ++ _ept = rpmsg_get_endpoint(rdev, ns_msg.name, RPMSG_ADDR_ANY, dest); + + /* + * If ept-release callback is not implemented, ns_unbind_cb() can free the ept. +@@ -663,7 +669,7 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, + */ + ept_to_release = _ept && _ept->release_cb; + +- if (ns_msg->flags == RPMSG_NS_DESTROY) { ++ if (ns_msg.flags == RPMSG_NS_DESTROY) { + if (_ept) + _ept->dest_addr = RPMSG_ADDR_ANY; + if (ept_to_release) +@@ -672,13 +678,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, + if (_ept && _ept->ns_unbind_cb) + _ept->ns_unbind_cb(_ept); + if (rdev->ns_unbind_cb) +- rdev->ns_unbind_cb(rdev, name, dest); ++ rdev->ns_unbind_cb(rdev, ns_msg.name, dest); + if (ept_to_release) { + metal_mutex_acquire(&rdev->lock); + rpmsg_ept_decref(_ept); + metal_mutex_release(&rdev->lock); + } +- } else if (ns_msg->flags == RPMSG_NS_CREATE) { ++ } else if (ns_msg.flags == RPMSG_NS_CREATE) { + if (!_ept) { + /* + * send callback to application, that can +@@ -688,7 +694,7 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, + */ + metal_mutex_release(&rdev->lock); + if (rdev->ns_bind_cb) +- rdev->ns_bind_cb(rdev, name, dest); ++ rdev->ns_bind_cb(rdev, ns_msg.name, dest); + } else if (_ept->dest_addr == RPMSG_ADDR_ANY) { + _ept->dest_addr = dest; + metal_mutex_release(&rdev->lock); +@@ -713,7 +719,7 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, + metal_mutex_release(&rdev->lock); + } + +- return RPMSG_SUCCESS; ++ return RPMSG_SUCCESS_BUFFER_RELEASED; + } + + int rpmsg_virtio_get_tx_buffer_size(struct rpmsg_device *rdev) +-- +2.34.1 + diff --git a/openamp/open-amp.cmake b/openamp/open-amp.cmake index fff3af8817c..9cd9b8367a0 100644 --- a/openamp/open-amp.cmake +++ b/openamp/open-amp.cmake @@ -68,6 +68,8 @@ if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/open-amp) ${CMAKE_CURRENT_LIST_DIR}/0014-lib-rpmsg_virtio-use-virtio_alloc_buf-to-alloc-share.patch && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} < ${CMAKE_CURRENT_LIST_DIR}/0015-lib-remoteproc_virtio-optimize-virtqueue_notificatio.patch + && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} < + ${CMAKE_CURRENT_LIST_DIR}/0016-lib-rpmsg_virtio-support-release-the-name-service-me.patch DOWNLOAD_NO_PROGRESS true TIMEOUT 30) diff --git a/openamp/open-amp.defs b/openamp/open-amp.defs index d4eac382dbe..b36511fe77d 100644 --- a/openamp/open-amp.defs +++ b/openamp/open-amp.defs @@ -81,6 +81,7 @@ open-amp.zip: $(Q) patch -p0 < 0013-virtio.h-add-mm_priv-to-struct-virtio_deivce.patch $(Q) patch -p0 < 0014-lib-rpmsg_virtio-use-virtio_alloc_buf-to-alloc-share.patch $(Q) patch -p0 < 0015-lib-remoteproc_virtio-optimize-virtqueue_notificatio.patch + $(Q) patch -p0 < 0016-lib-rpmsg_virtio-support-release-the-name-service-me.patch .openamp_headers: open-amp.zip else
