From 0f3f00d2ecb1f7de470e6eaeeb74ba0ba9b66eea Mon Sep 17 00:00:00 2001 From: ligd Date: Mon, 13 Feb 2023 20:34:56 +0800 Subject: [PATCH 4/6] rpmsg: add cache flash when hold rx buffer Assume we have 2 cpus, and use cached shram buffer CPU0 CPU1 1. send tx bufferX 2. recv rx bufferX 3. set idx to hdr->reserved 4. handled rx bufferX 5. return bufferX 6. reuse tx bufferX 7. dirty cache auto flushed, hdr changed 8. buffer X meet error Change-Id: If6c347d121ced0c59b6172a490098689b9b7ffd7 --- lib/rpmsg/rpmsg_virtio.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c index fcf24cd..1a510e6 100644 --- a/lib/rpmsg/rpmsg_virtio.c +++ open-amp/lib/rpmsg/rpmsg_virtio.c @@ -321,7 +321,7 @@ static void rpmsg_virtio_hold_rx_buffer(struct rpmsg_device *rdev, void *rxbuf) rp_hdr = RPMSG_LOCATE_HDR(rxbuf); /* Set held status to keep buffer */ - rp_hdr->reserved |= RPMSG_BUF_HELD; + rp_hdr->reserved = RPMSG_BUF_HELD; } static void rpmsg_virtio_release_rx_buffer(struct rpmsg_device *rdev, @@ -553,8 +553,6 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq) metal_mutex_release(&rdev->lock); while (rp_hdr) { - rp_hdr->reserved = idx; - /* Get the channel node from the remote device channels list. */ metal_mutex_acquire(&rdev->lock); ept = rpmsg_get_ept_from_addr(rdev, rp_hdr->dst); @@ -578,7 +576,15 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq) metal_mutex_acquire(&rdev->lock); /* Check whether callback wants to hold buffer */ - if (!(rp_hdr->reserved & RPMSG_BUF_HELD)) { + if (rp_hdr->reserved & RPMSG_BUF_HELD) { + /* Yes, save idx. */ + rp_hdr->reserved |= idx; + +#ifdef VIRTIO_CACHED_BUFFERS + metal_cache_flush(rp_hdr, sizeof(struct rpmsg_hdr)); +#endif + + } else { /* No, return used buffers. */ rpmsg_virtio_return_buffer(rvdev, rp_hdr, len, idx); } -- 2.25.1