aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNamit Gupta <gupta.namit@samsung.com>2018-06-20 09:56:19 -0400
committerPetr Mladek <pmladek@suse.com>2018-06-27 10:16:28 -0400
commit63842c21347ecf4685d6ec008e667e61b0ead6e5 (patch)
tree54ddba7dade806fd43715c11bd4c2816042c3a3e
parent22eceb8bf3e8f1f9b2f566062d06b25807725d7f (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.c109
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