From: Greg Kroah-Hartman Date: Tue, 26 Oct 2021 06:48:09 +0000 (+0200) Subject: Revert "tty: hvc: pass DMA capable memory to put_chars()" X-Git-Tag: v6.6.17~8911^2~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=60f41e8484926c2a82fe6fe0585edfccaf1208f5;p=platform%2Fkernel%2Flinux-rpi.git Revert "tty: hvc: pass DMA capable memory to put_chars()" This reverts commit 0986d7bc5598f5df30e3db777d00e73890c97627. It still has some issues and needs to be dropped at this point in time. Link: https://lore.kernel.org/r/208f7a41-a9fa-630c-cb44-c37c503f3a72@kernel.org Reported-by: Jiri Slaby Cc: Xianting Tian Cc: Shile Zhang Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c index 5bdb3df..4802cfa 100644 --- a/drivers/tty/hvc/hvc_console.c +++ b/drivers/tty/hvc/hvc_console.c @@ -41,6 +41,16 @@ */ #define HVC_CLOSE_WAIT (HZ/100) /* 1/10 of a second */ +/* + * These sizes are most efficient for vio, because they are the + * native transfer size. We could make them selectable in the + * future to better deal with backends that want other buffer sizes. + */ +#define N_OUTBUF 16 +#define N_INBUF 16 + +#define __ALIGNED__ __attribute__((__aligned__(L1_CACHE_BYTES))) + static struct tty_driver *hvc_driver; static struct task_struct *hvc_task; @@ -132,7 +142,6 @@ static int hvc_flush(struct hvc_struct *hp) static const struct hv_ops *cons_ops[MAX_NR_HVC_CONSOLES]; static uint32_t vtermnos[MAX_NR_HVC_CONSOLES] = {[0 ... MAX_NR_HVC_CONSOLES - 1] = -1}; -static struct hvc_struct *cons_hvcs[MAX_NR_HVC_CONSOLES]; /* * Console APIs, NOT TTY. These APIs are available immediately when @@ -142,11 +151,9 @@ static struct hvc_struct *cons_hvcs[MAX_NR_HVC_CONSOLES]; static void hvc_console_print(struct console *co, const char *b, unsigned count) { - char *c; + char c[N_OUTBUF] __ALIGNED__; unsigned i = 0, n = 0; int r, donecr = 0, index = co->index; - unsigned long flags; - struct hvc_struct *hp; /* Console access attempt outside of acceptable console range. */ if (index >= MAX_NR_HVC_CONSOLES) @@ -156,13 +163,6 @@ static void hvc_console_print(struct console *co, const char *b, if (vtermnos[index] == -1) return; - hp = cons_hvcs[index]; - if (!hp) - return; - - c = hp->cons_outbuf; - - spin_lock_irqsave(&hp->cons_outbuf_lock, flags); while (count > 0 || i > 0) { if (count > 0 && i < sizeof(c)) { if (b[n] == '\n' && !donecr) { @@ -191,7 +191,6 @@ static void hvc_console_print(struct console *co, const char *b, } } } - spin_unlock_irqrestore(&hp->cons_outbuf_lock, flags); hvc_console_flush(cons_ops[index], vtermnos[index]); } @@ -879,13 +878,9 @@ static void hvc_poll_put_char(struct tty_driver *driver, int line, char ch) struct tty_struct *tty = driver->ttys[0]; struct hvc_struct *hp = tty->driver_data; int n; - unsigned long flags; do { - spin_lock_irqsave(&hp->cons_outbuf_lock, flags); - hp->cons_outbuf[0] = ch; - n = hp->ops->put_chars(hp->vtermno, &hp->cons_outbuf[0], 1); - spin_unlock_irqrestore(&hp->cons_outbuf_lock, flags); + n = hp->ops->put_chars(hp->vtermno, &ch, 1); } while (n <= 0); } #endif @@ -927,7 +922,8 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data, return ERR_PTR(err); } - hp = kzalloc(struct_size(hp, outbuf, outbuf_size), GFP_KERNEL); + hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size, + GFP_KERNEL); if (!hp) return ERR_PTR(-ENOMEM); @@ -935,13 +931,13 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data, hp->data = data; hp->ops = ops; hp->outbuf_size = outbuf_size; + hp->outbuf = &((char *)hp)[ALIGN(sizeof(*hp), sizeof(long))]; tty_port_init(&hp->port); hp->port.ops = &hvc_port_ops; INIT_WORK(&hp->tty_resize, hvc_set_winsz); spin_lock_init(&hp->lock); - spin_lock_init(&hp->cons_outbuf_lock); mutex_lock(&hvc_structs_mutex); /* @@ -968,7 +964,6 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data, if (i < MAX_NR_HVC_CONSOLES) { cons_ops[i] = ops; vtermnos[i] = vtermno; - cons_hvcs[i] = hp; } list_add_tail(&(hp->next), &hvc_structs); @@ -993,7 +988,6 @@ int hvc_remove(struct hvc_struct *hp) if (hp->index < MAX_NR_HVC_CONSOLES) { vtermnos[hp->index] = -1; cons_ops[hp->index] = NULL; - cons_hvcs[hp->index] = NULL; } /* Don't whack hp->irq because tty_hangup() will need to free the irq. */ diff --git a/drivers/tty/hvc/hvc_console.h b/drivers/tty/hvc/hvc_console.h index 2c32ab6..18d0058 100644 --- a/drivers/tty/hvc/hvc_console.h +++ b/drivers/tty/hvc/hvc_console.h @@ -32,21 +32,12 @@ */ #define HVC_ALLOC_TTY_ADAPTERS 8 -/* - * These sizes are most efficient for vio, because they are the - * native transfer size. We could make them selectable in the - * future to better deal with backends that want other buffer sizes. - */ -#define N_OUTBUF 16 -#define N_INBUF 16 - -#define __ALIGNED__ __attribute__((__aligned__(L1_CACHE_BYTES))) - struct hvc_struct { struct tty_port port; spinlock_t lock; int index; int do_wakeup; + char *outbuf; int outbuf_size; int n_outbuf; uint32_t vtermno; @@ -57,16 +48,6 @@ struct hvc_struct { struct work_struct tty_resize; struct list_head next; unsigned long flags; - - /* - * the buf and its lock are used in hvc console api for putting chars, - * and also used in hvc_poll_put_char() for putting single char. - */ - spinlock_t cons_outbuf_lock; - char cons_outbuf[N_OUTBUF] __ALIGNED__; - - /* the buf is used for putting chars to tty */ - char outbuf[] __ALIGNED__; }; /* implemented by a low level driver */