mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Shah, Tanmay" <tanmays@amd.com>
To: Mathieu Poirier <mathieu.poirier@linaro.org>,
	Tanmay Shah <tanmay.shah@amd.com>
Cc: <andersson@kernel.org>, <arnaud.pouliquen@foss.st.com>,
	<linux-kernel@vger.kernel.org>,
	<linux-remoteproc@vger.kernel.org>
Subject: Re: [PATCH v2 1/3] rpmsg: virtio_rpmsg_bus: allow different size of tx and rx bufs
Date: Wed, 20 May 2026 09:12:58 -0500	[thread overview]
Message-ID: <e430925d-08ee-4e23-9912-5bf7132a7f62@amd.com> (raw)
In-Reply-To: <agyWX-y2GShRXQ_J@p14s>

Hello,

Thanks for the reviews.

On 5/19/2026 11:57 AM, Mathieu Poirier wrote:
> Hi Tanmay
> 
> (Apologies for the late review)
> 

No problem.

> On Wed, Apr 29, 2026 at 09:10:51AM -0700, Tanmay Shah wrote:
>> Current design allocates memory for tx and rx buffers equally. The
>> throughput can be increased if the user is allowed to configure number
>> of tx and rx buffers as required. Hence, do not split number of tx & rx
>> buffers into half, but decide based on respective vring size.
>>
>> Signed-off-by: Tanmay Shah <tanmay.shah@amd.com>
>> ---
>>
>> Test performed:
>>   - Test this patch with existing firmware as it is, rpmsg working.
>>
>> Changes in v2:
>>   - Change author
>>   - fix commit message with better explanation
>>   - %s/sbuf/tx_buf
>>   - %s/rbuf/rx_buf
>>   - %s/num_rbuf/num_rx_buf/
>>   - %s/num_sbuf/num_tx_buf/
> 
> Please split this patch in two parts - one to do the refactoring of the
> tx/rx_buf and another one for the varying size.

Ack.

> 
>>
>>  drivers/rpmsg/virtio_rpmsg_bus.c | 68 ++++++++++++++++----------------
>>  1 file changed, 34 insertions(+), 34 deletions(-)
>>
>> diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
>> index 5ae15111fb4f..e59d8cf9b975 100644
>> --- a/drivers/rpmsg/virtio_rpmsg_bus.c
>> +++ b/drivers/rpmsg/virtio_rpmsg_bus.c
>> @@ -35,13 +35,14 @@
>>   * @vdev:	the virtio device
>>   * @rvq:	rx virtqueue
>>   * @svq:	tx virtqueue
>> - * @rbufs:	kernel address of rx buffers
>> - * @sbufs:	kernel address of tx buffers
>> - * @num_bufs:	total number of buffers for rx and tx
>> - * @buf_size:   size of one rx or tx buffer
>> + * @rx_bufs:	kernel address of rx buffers
>> + * @tx_bufs:	kernel address of tx buffers
>> + * @num_rx_buf:	total number of buffers for rx
>> + * @num_tx_buf:	total number of buffers for tx
>> + * @buf_size:	size of one rx or tx buffer
>>   * @last_sbuf:	index of last tx buffer used
>>   * @bufs_dma:	dma base addr of the buffers
>> - * @tx_lock:	protects svq and sbufs, to allow concurrent senders.
>> + * @tx_lock:	protects svq and tx_bufs, to allow concurrent senders.
>>   *		sending a message might require waking up a dozing remote
>>   *		processor, which involves sleeping, hence the mutex.
>>   * @endpoints:	idr of local endpoints, allows fast retrieval
>> @@ -55,8 +56,9 @@
>>  struct virtproc_info {
>>  	struct virtio_device *vdev;
>>  	struct virtqueue *rvq, *svq;
>> -	void *rbufs, *sbufs;
>> -	unsigned int num_bufs;
>> +	void *rx_bufs, *tx_bufs;
>> +	unsigned int num_rx_buf;
>> +	unsigned int num_tx_buf;
>>  	unsigned int buf_size;
>>  	int last_sbuf;
>>  	dma_addr_t bufs_dma;
>> @@ -110,7 +112,7 @@ struct virtio_rpmsg_channel {
>>  /*
>>   * We're allocating buffers of 512 bytes each for communications. The
>>   * number of buffers will be computed from the number of buffers supported
>> - * by the vring, upto a maximum of 512 buffers (256 in each direction).
>> + * by the vring, up to a maximum of 256 in each direction.
>>   *
>>   * Each buffer will have 16 bytes for the msg header and 496 bytes for
>>   * the payload.
>> @@ -125,7 +127,7 @@ struct virtio_rpmsg_channel {
>>   * can change this without changing anything in the firmware of the remote
>>   * processor.
>>   */
>> -#define MAX_RPMSG_NUM_BUFS	(512)
>> +#define MAX_RPMSG_NUM_BUFS	(256)
>>  #define MAX_RPMSG_BUF_SIZE	(512)
>>  
>>  /*
>> @@ -440,12 +442,9 @@ static void *get_a_tx_buf(struct virtproc_info *vrp)
>>  
>>  	mutex_lock(&vrp->tx_lock);
>>  
>> -	/*
>> -	 * either pick the next unused tx buffer
>> -	 * (half of our buffers are used for sending messages)
>> -	 */
>> -	if (vrp->last_sbuf < vrp->num_bufs / 2)
>> -		ret = vrp->sbufs + vrp->buf_size * vrp->last_sbuf++;
>> +	/* either pick the next unused tx buffer */
>> +	if (vrp->last_sbuf < vrp->num_tx_buf)
>> +		ret = vrp->tx_bufs + vrp->buf_size * vrp->last_sbuf++;
>>  	/* or recycle a used one */
>>  	else
>>  		ret = virtqueue_get_buf(vrp->svq, &len);
>> @@ -631,11 +630,10 @@ static __poll_t virtio_rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp,
>>  
>>  	/*
>>  	 * check for a free buffer, either:
>> -	 * - we haven't used all of the available transmit buffers (half of the
>> -	 *   allocated buffers are used for transmit, hence num_bufs / 2), or,
>> +	 * - we haven't used all of the available transmit buffers or,
>>  	 * - we ask the virtqueue if there's a buffer available
>>  	 */
>> -	if (vrp->last_sbuf < vrp->num_bufs / 2 ||
>> +	if (vrp->last_sbuf < vrp->num_tx_buf ||
>>  	    !virtqueue_enable_cb(vrp->svq))
>>  		mask |= EPOLLOUT;
>>  
>> @@ -846,19 +844,20 @@ static int rpmsg_probe(struct virtio_device *vdev)
>>  	vrp->rvq = vqs[0];
>>  	vrp->svq = vqs[1];
>>  
>> -	/* we expect symmetric tx/rx vrings */
>> -	WARN_ON(virtqueue_get_vring_size(vrp->rvq) !=
>> -		virtqueue_get_vring_size(vrp->svq));
>> -
>>  	/* we need less buffers if vrings are small */
>> -	if (virtqueue_get_vring_size(vrp->rvq) < MAX_RPMSG_NUM_BUFS / 2)
>> -		vrp->num_bufs = virtqueue_get_vring_size(vrp->rvq) * 2;
>> +	if (virtqueue_get_vring_size(vrp->rvq) < MAX_RPMSG_NUM_BUFS)
>> +		vrp->num_rx_buf = virtqueue_get_vring_size(vrp->rvq);
>> +	else
>> +		vrp->num_rx_buf = MAX_RPMSG_NUM_BUFS;
>> +
>> +	if (virtqueue_get_vring_size(vrp->svq) < MAX_RPMSG_NUM_BUFS)
>> +		vrp->num_tx_buf = virtqueue_get_vring_size(vrp->svq);
>>  	else
>> -		vrp->num_bufs = MAX_RPMSG_NUM_BUFS;
>> +		vrp->num_tx_buf = MAX_RPMSG_NUM_BUFS;
>>  
>>  	vrp->buf_size = MAX_RPMSG_BUF_SIZE;
>>  
>> -	total_buf_space = vrp->num_bufs * vrp->buf_size;
>> +	total_buf_space = (vrp->num_rx_buf + vrp->num_tx_buf) * vrp->buf_size;
>>  
>>  	/* allocate coherent memory for the buffers */
>>  	bufs_va = dma_alloc_coherent(vdev->dev.parent,
>> @@ -872,16 +871,16 @@ static int rpmsg_probe(struct virtio_device *vdev)
>>  	dev_dbg(&vdev->dev, "buffers: va %p, dma %pad\n",
>>  		bufs_va, &vrp->bufs_dma);
>>  
>> -	/* half of the buffers is dedicated for RX */
>> -	vrp->rbufs = bufs_va;
>> +	/* first part of the buffers is dedicated for RX */
>> +	vrp->rx_bufs = bufs_va;
>>  
>> -	/* and half is dedicated for TX */
>> -	vrp->sbufs = bufs_va + total_buf_space / 2;
>> +	/* and second part is dedicated for TX */
>> +	vrp->tx_bufs = bufs_va + vrp->num_rx_buf * vrp->buf_size;
>>  
>>  	/* set up the receive buffers */
>> -	for (i = 0; i < vrp->num_bufs / 2; i++) {
>> +	for (i = 0; i < vrp->num_rx_buf; i++) {
>>  		struct scatterlist sg;
>> -		void *cpu_addr = vrp->rbufs + i * vrp->buf_size;
>> +		void *cpu_addr = vrp->rx_bufs + i * vrp->buf_size;
>>  
>>  		rpmsg_sg_init(&sg, cpu_addr, vrp->buf_size);
>>  
>> @@ -966,7 +965,8 @@ static int rpmsg_remove_device(struct device *dev, void *data)
>>  static void rpmsg_remove(struct virtio_device *vdev)
>>  {
>>  	struct virtproc_info *vrp = vdev->priv;
>> -	size_t total_buf_space = vrp->num_bufs * vrp->buf_size;
>> +	unsigned int num_bufs = vrp->num_rx_buf + vrp->num_tx_buf;
>> +	size_t total_buf_space = num_bufs * vrp->buf_size;
>>  	int ret;
>>  
>>  	virtio_reset_device(vdev);
>> @@ -980,7 +980,7 @@ static void rpmsg_remove(struct virtio_device *vdev)
>>  	vdev->config->del_vqs(vrp->vdev);
>>  
>>  	dma_free_coherent(vdev->dev.parent, total_buf_space,
>> -			  vrp->rbufs, vrp->bufs_dma);
>> +			  vrp->rx_bufs, vrp->bufs_dma);
>>  
>>  	kfree(vrp);
>>  }
>> -- 
>> 2.34.1
>>


  reply	other threads:[~2026-05-20 14:13 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-29 16:10 [PATCH v2 0/3] Enhance RPMsg buffer management Tanmay Shah
2026-04-29 16:10 ` [PATCH v2 1/3] rpmsg: virtio_rpmsg_bus: allow different size of tx and rx bufs Tanmay Shah
2026-05-19 16:57   ` Mathieu Poirier
2026-05-20 14:12     ` Shah, Tanmay [this message]
2026-04-29 16:10 ` [PATCH v2 2/3] rpmsg: virtio_rpmsg_bus: get buffer size from config space Tanmay Shah
2026-05-19 17:36   ` Mathieu Poirier
2026-05-19 17:37     ` Mathieu Poirier
2026-05-20  7:44     ` Arnaud POULIQUEN
2026-05-20 14:55       ` Shah, Tanmay
2026-05-20 15:43         ` Arnaud POULIQUEN
2026-05-21 15:07           ` Shah, Tanmay
2026-05-21 16:58             ` Mathieu Poirier
2026-05-21 17:29               ` Shah, Tanmay
2026-05-20 17:51         ` Mathieu Poirier
2026-05-21 13:23           ` Shah, Tanmay
2026-05-21 16:55             ` Mathieu Poirier
2026-04-29 16:10 ` [PATCH v2 3/3] samples: rpmsg: add mtu size info Tanmay Shah

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e430925d-08ee-4e23-9912-5bf7132a7f62@amd.com \
    --to=tanmays@amd.com \
    --cc=andersson@kernel.org \
    --cc=arnaud.pouliquen@foss.st.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=tanmay.shah@amd.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®