On Mon, Aug 31, 2026 at 05:02:54AM +0200, Jiri Slaby wrote:
> On 30. 08. 26, 9:49, Mike Rapoport (Microsoft) wrote:
> > uart_alloc_xmit_buf() allocates the transmit buffer of a serial port. The
> > buffer only backs the port's kfifo, the data being sent is copied in and
> > out of it.
> > 
> > This buffer can be allocated with kmalloc() as there's nothing special
> > about it to go directly to the page allocator.
> > 
> > kmalloc() provides a better API that does not require ugly casts and
> > kfree() does not need to know the size of the freed object.
> > 
> > Performance difference between kmalloc() and __get_free_pages() is not
> > measurable as both allocators take an object/page from a per-CPU list for
> > fast path allocations.
> > 
> > For the slow path the performance is anyway determined by the amount of
> > reclaim involved rather than by what allocator is used.
> > 
> > While on it, make the local variable holding the buffer a pointer to get
> > rid of the casts.
> > 
> > Replace use of get_zeroed_page() with kzalloc() and free_page() with
> > kfree().
> > 
> > Link: 
> > https://lore.kernel.org/all/[email protected]
> > Assisted-by: copilot:claude-opus
> > Signed-off-by: Mike Rapoport (Microsoft) <[email protected]>
> > ---
> >   drivers/tty/serial/serial_core.c | 16 ++++++++--------
> >   1 file changed, 8 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/tty/serial/serial_core.c 
> > b/drivers/tty/serial/serial_core.c
> > index 95774b0f1484..f12ce7d190fe 100644
> > --- a/drivers/tty/serial/serial_core.c
> > +++ b/drivers/tty/serial/serial_core.c
> > @@ -247,29 +247,29 @@ static int uart_alloc_xmit_buf(struct tty_port *port)
> >     struct uart_state *state = container_of(port, struct uart_state, port);
> >     struct uart_port *uport;
> >     unsigned long flags;
> > -   unsigned long page;
> 
> 1:
> 
> > +   unsigned char *buf;
> >     /*
> >      * Initialise and allocate the transmit and temporary
> >      * buffer.
> >      */
> > -   page = get_zeroed_page(GFP_KERNEL);
> > -   if (!page)
> > +   buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
> > +   if (!buf)
> >             return -ENOMEM;
> >     uport = uart_port_ref_lock(state, &flags);
> >     if (!state->port.xmit_buf) {
> > -           state->port.xmit_buf = (unsigned char *)page;
> > +           state->port.xmit_buf = buf;
> 
> xmit_buf is u8 *. This uchar was omitted when I was changing the type back
> then. Could you use the right type at 1b now?

Sure, I also made this change in uart_free_xmit_buf().
 
> thanks,
> -- 
> js
> suse labs

-- 
Sincerely yours,
Mike.

Reply via email to