在 2021/8/2 下午3:25, Jiri Slaby 写道: > Hi, > > why is this 2/2? I seem (Lore neither) to find 1/2. You didn't receive 1/2? [PATCH 1/2] tty: hvc: pass DMA capable memory to put_chars() https://lkml.org/lkml/2021/8/1/8 > > On 01. 08. 21, 7:16, Xianting Tian wrote: >> hvc framework will never pass stack memory to the put_chars() function, > > Am I blind or missing something? > > hvc_console_print(...) > { >   char c[N_OUTBUF] > ... >   cons_ops[index]->put_chars(vtermnos[index], c, i); > > The same here: > > hvc_poll_put_char(..., char ch) > { > ... >    n = hp->ops->put_chars(hp->vtermno, &ch, 1); > > AFAICS both of them *pass* a pointer to stack variable. yes, I discussed the issue with Arnd before in below thread,  you can get the history, thanks https://lkml.org/lkml/2021/7/27/494 > >> So the calling of kmemdup() is unnecessary, remove it. >> >> Fixes: c4baad5029 ("virtio-console: avoid DMA from stack") > > This patch doesn't "Fix" -- it reverts the commit. You should've CCed > the author too. yes, we discussed ther issue in above thread, which we CCed the author. > >> Signed-off-by: Xianting Tian >> --- >>   drivers/char/virtio_console.c | 12 ++---------- >>   1 file changed, 2 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/char/virtio_console.c >> b/drivers/char/virtio_console.c >> index 7eaf303a7..4ed3ffb1d 100644 >> --- a/drivers/char/virtio_console.c >> +++ b/drivers/char/virtio_console.c >> @@ -1117,8 +1117,6 @@ static int put_chars(u32 vtermno, const char >> *buf, int count) >>   { >>       struct port *port; >>       struct scatterlist sg[1]; >> -    void *data; >> -    int ret; >>         if (unlikely(early_put_chars)) >>           return early_put_chars(vtermno, buf, count); >> @@ -1127,14 +1125,8 @@ static int put_chars(u32 vtermno, const char >> *buf, int count) >>       if (!port) >>           return -EPIPE; >>   -    data = kmemdup(buf, count, GFP_ATOMIC); >> -    if (!data) >> -        return -ENOMEM; >> - >> -    sg_init_one(sg, data, count); >> -    ret = __send_to_port(port, sg, 1, count, data, false); >> -    kfree(data); >> -    return ret; >> +    sg_init_one(sg, buf, count); >> +    return __send_to_port(port, sg, 1, count, (void *)buf, false); >>   } >>     /* >> > >