On Mon, Feb 9, 2026 at 5:44 PM <[email protected]> wrote: > > From: Jassi Brar <[email protected]> > > Clients sometimes need to know whether the mailbox TX queue has room > before posting a new message. Rather than exposing internal queue state > through a struct field, provide a proper accessor function that returns > the number of available slots for a given channel. > > This lets clients choose to back off when the queue is full instead of > hitting the -ENOBUFS error path and the misleading "Try increasing > MBOX_TX_QUEUE_LEN" warning. > > Signed-off-by: Jassi Brar <[email protected]> > --- > drivers/mailbox/mailbox.c | 23 +++++++++++++++++++++++ > include/linux/mailbox_client.h | 1 + > 2 files changed, 24 insertions(+) > > diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c > index 2acc6ec229a4..22eb8f3213be 100644 > --- a/drivers/mailbox/mailbox.c > +++ b/drivers/mailbox/mailbox.c > @@ -218,6 +218,29 @@ bool mbox_client_peek_data(struct mbox_chan *chan) > } > EXPORT_SYMBOL_GPL(mbox_client_peek_data); > > +/** > + * mbox_chan_tx_slots_available - Query the number of available TX queue > slots. > + * @chan: Mailbox channel to query. > + * > + * Clients may call this to check how many messages can be queued via > + * mbox_send_message() before the channel's TX queue is full. This helps > + * clients avoid the -ENOBUFS error without needing to increase > + * MBOX_TX_QUEUE_LEN. > + * This can be called from atomic context. > + * > + * Return: Number of available slots in the channel's TX queue. > + */ > +unsigned int mbox_chan_tx_slots_available(struct mbox_chan *chan) > +{ > + unsigned int ret; > + > + guard(spinlock_irqsave)(&chan->lock); > + ret = MBOX_TX_QUEUE_LEN - chan->msg_count; > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(mbox_chan_tx_slots_available); > + > /** > * mbox_send_message - For client to submit a message to be > * sent to the remote. > diff --git a/include/linux/mailbox_client.h b/include/linux/mailbox_client.h > index c6eea9afb943..e5997120f45c 100644 > --- a/include/linux/mailbox_client.h > +++ b/include/linux/mailbox_client.h > @@ -45,6 +45,7 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg); > int mbox_flush(struct mbox_chan *chan, unsigned long timeout); > void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */ > bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */ > +unsigned int mbox_chan_tx_slots_available(struct mbox_chan *chan); /* atomic > */ > void mbox_free_channel(struct mbox_chan *chan); /* may sleep */ > > #endif /* __MAILBOX_CLIENT_H */ > -- > 2.43.0 > Applied to mailbox/for-next

