diff options
-rw-r--r-- | drivers/char/tty_buffer.c | 6 | ||||
-rw-r--r-- | include/linux/tty.h | 10 |
2 files changed, 14 insertions, 2 deletions
diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c index 66fa4e10d76b..f27c4d6d956e 100644 --- a/drivers/char/tty_buffer.c +++ b/drivers/char/tty_buffer.c | |||
@@ -247,7 +247,8 @@ int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars, | |||
247 | { | 247 | { |
248 | int copied = 0; | 248 | int copied = 0; |
249 | do { | 249 | do { |
250 | int space = tty_buffer_request_room(tty, size - copied); | 250 | int goal = min(size - copied, TTY_BUFFER_PAGE); |
251 | int space = tty_buffer_request_room(tty, goal); | ||
251 | struct tty_buffer *tb = tty->buf.tail; | 252 | struct tty_buffer *tb = tty->buf.tail; |
252 | /* If there is no space then tb may be NULL */ | 253 | /* If there is no space then tb may be NULL */ |
253 | if (unlikely(space == 0)) | 254 | if (unlikely(space == 0)) |
@@ -283,7 +284,8 @@ int tty_insert_flip_string_flags(struct tty_struct *tty, | |||
283 | { | 284 | { |
284 | int copied = 0; | 285 | int copied = 0; |
285 | do { | 286 | do { |
286 | int space = tty_buffer_request_room(tty, size - copied); | 287 | int goal = min(size - copied, TTY_BUFFER_PAGE); |
288 | int space = tty_buffer_request_room(tty, goal); | ||
287 | struct tty_buffer *tb = tty->buf.tail; | 289 | struct tty_buffer *tb = tty->buf.tail; |
288 | /* If there is no space then tb may be NULL */ | 290 | /* If there is no space then tb may be NULL */ |
289 | if (unlikely(space == 0)) | 291 | if (unlikely(space == 0)) |
diff --git a/include/linux/tty.h b/include/linux/tty.h index 6abfcf5b5887..d96e5882f129 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -68,6 +68,16 @@ struct tty_buffer { | |||
68 | unsigned long data[0]; | 68 | unsigned long data[0]; |
69 | }; | 69 | }; |
70 | 70 | ||
71 | /* | ||
72 | * We default to dicing tty buffer allocations to this many characters | ||
73 | * in order to avoid multiple page allocations. We assume tty_buffer itself | ||
74 | * is under 256 bytes. See tty_buffer_find for the allocation logic this | ||
75 | * must match | ||
76 | */ | ||
77 | |||
78 | #define TTY_BUFFER_PAGE ((PAGE_SIZE - 256) / 2) | ||
79 | |||
80 | |||
71 | struct tty_bufhead { | 81 | struct tty_bufhead { |
72 | struct delayed_work work; | 82 | struct delayed_work work; |
73 | spinlock_t lock; | 83 | spinlock_t lock; |