diff options
| author | Namit Gupta <gupta.namit@samsung.com> | 2018-06-20 09:56:19 -0400 |
|---|---|---|
| committer | Petr Mladek <pmladek@suse.com> | 2018-06-27 10:16:28 -0400 |
| commit | 63842c21347ecf4685d6ec008e667e61b0ead6e5 (patch) | |
| tree | 54ddba7dade806fd43715c11bd4c2816042c3a3e | |
| parent | 22eceb8bf3e8f1f9b2f566062d06b25807725d7f (diff) | |
printk: Remove unnecessary kmalloc() from syslog during clear
When the request is only for clearing logs, there is no need for
allocation/deallocation. Only the indexes need to be reset and returned.
Rest of the patch is mostly made up of changes because of indention.
Link: http://lkml.kernel.org/r/20180620135951epcas5p3bd2a8f25ec689ca333bce861b527dba2~54wyKcT0_3155531555epcas5p3y@epcas5p3.samsung.com
Cc: linux-kernel@vger.kernel.org
Cc: pankaj.m@samsung.com
Cc: a.sahrawat@samsung.com
Signed-off-by: Namit Gupta <gupta.namit@samsung.com>
Signed-off-by: Himanshu Maithani <himanshu.m@samsung.com>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
| -rw-r--r-- | kernel/printk/printk.c | 109 |
1 files changed, 58 insertions, 51 deletions
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 3999c295d6f7..16b02cc51a14 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c | |||
| @@ -1352,71 +1352,78 @@ static int syslog_print_all(char __user *buf, int size, bool clear) | |||
| 1352 | { | 1352 | { |
| 1353 | char *text; | 1353 | char *text; |
| 1354 | int len = 0; | 1354 | int len = 0; |
| 1355 | u64 next_seq; | ||
| 1356 | u64 seq; | ||
| 1357 | u32 idx; | ||
| 1358 | |||
| 1359 | if (!buf) { | ||
| 1360 | if (clear) { | ||
| 1361 | logbuf_lock_irq(); | ||
| 1362 | clear_seq = log_next_seq; | ||
| 1363 | clear_idx = log_next_idx; | ||
| 1364 | logbuf_unlock_irq(); | ||
| 1365 | } | ||
| 1366 | return 0; | ||
| 1367 | } | ||
| 1355 | 1368 | ||
| 1356 | text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); | 1369 | text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); |
| 1357 | if (!text) | 1370 | if (!text) |
| 1358 | return -ENOMEM; | 1371 | return -ENOMEM; |
| 1359 | 1372 | ||
| 1360 | logbuf_lock_irq(); | 1373 | logbuf_lock_irq(); |
| 1361 | if (buf) { | 1374 | /* |
| 1362 | u64 next_seq; | 1375 | * Find first record that fits, including all following records, |
| 1363 | u64 seq; | 1376 | * into the user-provided buffer for this dump. |
| 1364 | u32 idx; | 1377 | */ |
| 1378 | seq = clear_seq; | ||
| 1379 | idx = clear_idx; | ||
| 1380 | while (seq < log_next_seq) { | ||
| 1381 | struct printk_log *msg = log_from_idx(idx); | ||
| 1365 | 1382 | ||
| 1366 | /* | 1383 | len += msg_print_text(msg, true, NULL, 0); |
| 1367 | * Find first record that fits, including all following records, | 1384 | idx = log_next(idx); |
| 1368 | * into the user-provided buffer for this dump. | 1385 | seq++; |
| 1369 | */ | 1386 | } |
| 1370 | seq = clear_seq; | ||
| 1371 | idx = clear_idx; | ||
| 1372 | while (seq < log_next_seq) { | ||
| 1373 | struct printk_log *msg = log_from_idx(idx); | ||
| 1374 | |||
| 1375 | len += msg_print_text(msg, true, NULL, 0); | ||
| 1376 | idx = log_next(idx); | ||
| 1377 | seq++; | ||
| 1378 | } | ||
| 1379 | 1387 | ||
| 1380 | /* move first record forward until length fits into the buffer */ | 1388 | /* move first record forward until length fits into the buffer */ |
| 1381 | seq = clear_seq; | 1389 | seq = clear_seq; |
| 1382 | idx = clear_idx; | 1390 | idx = clear_idx; |
| 1383 | while (len > size && seq < log_next_seq) { | 1391 | while (len > size && seq < log_next_seq) { |
| 1384 | struct printk_log *msg = log_from_idx(idx); | 1392 | struct printk_log *msg = log_from_idx(idx); |
| 1385 | 1393 | ||
| 1386 | len -= msg_print_text(msg, true, NULL, 0); | 1394 | len -= msg_print_text(msg, true, NULL, 0); |
| 1387 | idx = log_next(idx); | 1395 | idx = log_next(idx); |
| 1388 | seq++; | 1396 | seq++; |
| 1389 | } | 1397 | } |
| 1390 | 1398 | ||
| 1391 | /* last message fitting into this dump */ | 1399 | /* last message fitting into this dump */ |
| 1392 | next_seq = log_next_seq; | 1400 | next_seq = log_next_seq; |
| 1393 | 1401 | ||
| 1394 | len = 0; | 1402 | len = 0; |
| 1395 | while (len >= 0 && seq < next_seq) { | 1403 | while (len >= 0 && seq < next_seq) { |
| 1396 | struct printk_log *msg = log_from_idx(idx); | 1404 | struct printk_log *msg = log_from_idx(idx); |
| 1397 | int textlen; | 1405 | int textlen; |
| 1398 | 1406 | ||
| 1399 | textlen = msg_print_text(msg, true, text, | 1407 | textlen = msg_print_text(msg, true, text, |
| 1400 | LOG_LINE_MAX + PREFIX_MAX); | 1408 | LOG_LINE_MAX + PREFIX_MAX); |
| 1401 | if (textlen < 0) { | 1409 | if (textlen < 0) { |
| 1402 | len = textlen; | 1410 | len = textlen; |
| 1403 | break; | 1411 | break; |
| 1404 | } | 1412 | } |
| 1405 | idx = log_next(idx); | 1413 | idx = log_next(idx); |
| 1406 | seq++; | 1414 | seq++; |
| 1407 | 1415 | ||
| 1408 | logbuf_unlock_irq(); | 1416 | logbuf_unlock_irq(); |
| 1409 | if (copy_to_user(buf + len, text, textlen)) | 1417 | if (copy_to_user(buf + len, text, textlen)) |
| 1410 | len = -EFAULT; | 1418 | len = -EFAULT; |
| 1411 | else | 1419 | else |
| 1412 | len += textlen; | 1420 | len += textlen; |
| 1413 | logbuf_lock_irq(); | 1421 | logbuf_lock_irq(); |
| 1414 | 1422 | ||
| 1415 | if (seq < log_first_seq) { | 1423 | if (seq < log_first_seq) { |
| 1416 | /* messages are gone, move to next one */ | 1424 | /* messages are gone, move to next one */ |
| 1417 | seq = log_first_seq; | 1425 | seq = log_first_seq; |
| 1418 | idx = log_first_idx; | 1426 | idx = log_first_idx; |
| 1419 | } | ||
| 1420 | } | 1427 | } |
| 1421 | } | 1428 | } |
| 1422 | 1429 | ||
