All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] tty: Keep the default buffering to sub-page units
@ 2010-02-17 13:04 Alan Cox
  2010-02-17 23:11 ` Greg KH
  0 siblings, 1 reply; 2+ messages in thread
From: Alan Cox @ 2010-02-17 13:04 UTC (permalink / raw)
  To: greg, linux-kernel

We allocate during interrupts so while our buffering is normally diced up
small anyway on some hardware at speed we can pressure the VM excessively
for page pairs. We don't really need big buffers to be linear so don't try
so hard.

In order to make this work well we will tidy up excess callers to request_room,
which cannot itself enforce this break up.

Signed-off-by: Alan Cox <alan@linux.intel.com>
---

 drivers/char/tty_buffer.c |    5 +++--
 include/linux/tty.h       |   10 ++++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)


diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c
index 66fa4e1..8402eda 100644
--- a/drivers/char/tty_buffer.c
+++ b/drivers/char/tty_buffer.c
@@ -247,7 +247,7 @@ int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
 {
 	int copied = 0;
 	do {
-		int space = tty_buffer_request_room(tty, size - copied);
+		int space = tty_buffer_request_room(tty, goal);
 		struct tty_buffer *tb = tty->buf.tail;
 		/* If there is no space then tb may be NULL */
 		if (unlikely(space == 0))
@@ -283,7 +283,8 @@ int tty_insert_flip_string_flags(struct tty_struct *tty,
 {
 	int copied = 0;
 	do {
-		int space = tty_buffer_request_room(tty, size - copied);
+		int goal = min(size - copied, TTY_BUFFER_PAGE);
+		int space = tty_buffer_request_room(tty, goal);
 		struct tty_buffer *tb = tty->buf.tail;
 		/* If there is no space then tb may be NULL */
 		if (unlikely(space == 0))
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 6abfcf5..d96e588 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -68,6 +68,16 @@ struct tty_buffer {
 	unsigned long data[0];
 };
 
+/*
+ * We default to dicing tty buffer allocations to this many characters
+ * in order to avoid multiple page allocations. We assume tty_buffer itself
+ * is under 256 bytes. See tty_buffer_find for the allocation logic this
+ * must match
+ */
+
+#define TTY_BUFFER_PAGE		((PAGE_SIZE  - 256) / 2)
+
+
 struct tty_bufhead {
 	struct delayed_work work;
 	spinlock_t lock;


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] tty: Keep the default buffering to sub-page units
  2010-02-17 13:04 [PATCH] tty: Keep the default buffering to sub-page units Alan Cox
@ 2010-02-17 23:11 ` Greg KH
  0 siblings, 0 replies; 2+ messages in thread
From: Greg KH @ 2010-02-17 23:11 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel

On Wed, Feb 17, 2010 at 01:04:53PM +0000, Alan Cox wrote:
> We allocate during interrupts so while our buffering is normally diced up
> small anyway on some hardware at speed we can pressure the VM excessively
> for page pairs. We don't really need big buffers to be linear so don't try
> so hard.
> 
> In order to make this work well we will tidy up excess callers to request_room,
> which cannot itself enforce this break up.
> 
> Signed-off-by: Alan Cox <alan@linux.intel.com>
> ---
> 
>  drivers/char/tty_buffer.c |    5 +++--
>  include/linux/tty.h       |   10 ++++++++++
>  2 files changed, 13 insertions(+), 2 deletions(-)
> 
> 
> diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c
> index 66fa4e1..8402eda 100644
> --- a/drivers/char/tty_buffer.c
> +++ b/drivers/char/tty_buffer.c
> @@ -247,7 +247,7 @@ int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
>  {
>  	int copied = 0;
>  	do {
> -		int space = tty_buffer_request_room(tty, size - copied);
> +		int space = tty_buffer_request_room(tty, goal);

This causes the build error:

  CC      drivers/char/tty_buffer.o
drivers/char/tty_buffer.c: In function ‘tty_insert_flip_string’:
drivers/char/tty_buffer.c:250: error: ‘goal’ undeclared (first use in this function)
drivers/char/tty_buffer.c:250: error: (Each undeclared identifier is reported only once
drivers/char/tty_buffer.c:250: error: for each function it appears in.)

So I'll drop it for now.

Care to fix this?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-02-17 23:18 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-17 13:04 [PATCH] tty: Keep the default buffering to sub-page units Alan Cox
2010-02-17 23:11 ` Greg KH

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.