@@ -370,6 +370,34 @@ __packed __aligned(4)
370
370
*/
371
371
DEFINE_RAW_SPINLOCK (logbuf_lock );
372
372
373
+ /*
374
+ * Helper macros to lock/unlock logbuf_lock and switch between
375
+ * printk-safe/unsafe modes.
376
+ */
377
+ #define logbuf_lock_irq () \
378
+ do { \
379
+ printk_safe_enter_irq(); \
380
+ raw_spin_lock(&logbuf_lock); \
381
+ } while (0)
382
+
383
+ #define logbuf_unlock_irq () \
384
+ do { \
385
+ raw_spin_unlock(&logbuf_lock); \
386
+ printk_safe_exit_irq(); \
387
+ } while (0)
388
+
389
+ #define logbuf_lock_irqsave (flags ) \
390
+ do { \
391
+ printk_safe_enter_irqsave(flags); \
392
+ raw_spin_lock(&logbuf_lock); \
393
+ } while (0)
394
+
395
+ #define logbuf_unlock_irqrestore (flags ) \
396
+ do { \
397
+ raw_spin_unlock(&logbuf_lock); \
398
+ printk_safe_exit_irqrestore(flags); \
399
+ } while (0)
400
+
373
401
#ifdef CONFIG_PRINTK
374
402
DECLARE_WAIT_QUEUE_HEAD (log_wait );
375
403
/* the next printk record to read by syslog(READ) or /proc/kmsg */
@@ -801,28 +829,29 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
801
829
ret = mutex_lock_interruptible (& user -> lock );
802
830
if (ret )
803
831
return ret ;
804
- raw_spin_lock_irq (& logbuf_lock );
832
+
833
+ logbuf_lock_irq ();
805
834
while (user -> seq == log_next_seq ) {
806
835
if (file -> f_flags & O_NONBLOCK ) {
807
836
ret = - EAGAIN ;
808
- raw_spin_unlock_irq ( & logbuf_lock );
837
+ logbuf_unlock_irq ( );
809
838
goto out ;
810
839
}
811
840
812
- raw_spin_unlock_irq ( & logbuf_lock );
841
+ logbuf_unlock_irq ( );
813
842
ret = wait_event_interruptible (log_wait ,
814
843
user -> seq != log_next_seq );
815
844
if (ret )
816
845
goto out ;
817
- raw_spin_lock_irq ( & logbuf_lock );
846
+ logbuf_lock_irq ( );
818
847
}
819
848
820
849
if (user -> seq < log_first_seq ) {
821
850
/* our last seen message is gone, return error and reset */
822
851
user -> idx = log_first_idx ;
823
852
user -> seq = log_first_seq ;
824
853
ret = - EPIPE ;
825
- raw_spin_unlock_irq ( & logbuf_lock );
854
+ logbuf_unlock_irq ( );
826
855
goto out ;
827
856
}
828
857
@@ -835,7 +864,7 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
835
864
836
865
user -> idx = log_next (user -> idx );
837
866
user -> seq ++ ;
838
- raw_spin_unlock_irq ( & logbuf_lock );
867
+ logbuf_unlock_irq ( );
839
868
840
869
if (len > count ) {
841
870
ret = - EINVAL ;
@@ -862,7 +891,7 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
862
891
if (offset )
863
892
return - ESPIPE ;
864
893
865
- raw_spin_lock_irq ( & logbuf_lock );
894
+ logbuf_lock_irq ( );
866
895
switch (whence ) {
867
896
case SEEK_SET :
868
897
/* the first record */
@@ -886,7 +915,7 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
886
915
default :
887
916
ret = - EINVAL ;
888
917
}
889
- raw_spin_unlock_irq ( & logbuf_lock );
918
+ logbuf_unlock_irq ( );
890
919
return ret ;
891
920
}
892
921
@@ -900,15 +929,15 @@ static unsigned int devkmsg_poll(struct file *file, poll_table *wait)
900
929
901
930
poll_wait (file , & log_wait , wait );
902
931
903
- raw_spin_lock_irq ( & logbuf_lock );
932
+ logbuf_lock_irq ( );
904
933
if (user -> seq < log_next_seq ) {
905
934
/* return error when data has vanished underneath us */
906
935
if (user -> seq < log_first_seq )
907
936
ret = POLLIN |POLLRDNORM |POLLERR |POLLPRI ;
908
937
else
909
938
ret = POLLIN |POLLRDNORM ;
910
939
}
911
- raw_spin_unlock_irq ( & logbuf_lock );
940
+ logbuf_unlock_irq ( );
912
941
913
942
return ret ;
914
943
}
@@ -938,10 +967,10 @@ static int devkmsg_open(struct inode *inode, struct file *file)
938
967
939
968
mutex_init (& user -> lock );
940
969
941
- raw_spin_lock_irq ( & logbuf_lock );
970
+ logbuf_lock_irq ( );
942
971
user -> idx = log_first_idx ;
943
972
user -> seq = log_first_seq ;
944
- raw_spin_unlock_irq ( & logbuf_lock );
973
+ logbuf_unlock_irq ( );
945
974
946
975
file -> private_data = user ;
947
976
return 0 ;
@@ -1083,13 +1112,13 @@ void __init setup_log_buf(int early)
1083
1112
return ;
1084
1113
}
1085
1114
1086
- raw_spin_lock_irqsave ( & logbuf_lock , flags );
1115
+ logbuf_lock_irqsave ( flags );
1087
1116
log_buf_len = new_log_buf_len ;
1088
1117
log_buf = new_log_buf ;
1089
1118
new_log_buf_len = 0 ;
1090
1119
free = __LOG_BUF_LEN - log_next_idx ;
1091
1120
memcpy (log_buf , __log_buf , __LOG_BUF_LEN );
1092
- raw_spin_unlock_irqrestore ( & logbuf_lock , flags );
1121
+ logbuf_unlock_irqrestore ( flags );
1093
1122
1094
1123
pr_info ("log_buf_len: %d bytes\n" , log_buf_len );
1095
1124
pr_info ("early log buf free: %d(%d%%)\n" ,
@@ -1267,15 +1296,15 @@ static int syslog_print(char __user *buf, int size)
1267
1296
size_t n ;
1268
1297
size_t skip ;
1269
1298
1270
- raw_spin_lock_irq ( & logbuf_lock );
1299
+ logbuf_lock_irq ( );
1271
1300
if (syslog_seq < log_first_seq ) {
1272
1301
/* messages are gone, move to first one */
1273
1302
syslog_seq = log_first_seq ;
1274
1303
syslog_idx = log_first_idx ;
1275
1304
syslog_partial = 0 ;
1276
1305
}
1277
1306
if (syslog_seq == log_next_seq ) {
1278
- raw_spin_unlock_irq ( & logbuf_lock );
1307
+ logbuf_unlock_irq ( );
1279
1308
break ;
1280
1309
}
1281
1310
@@ -1294,7 +1323,7 @@ static int syslog_print(char __user *buf, int size)
1294
1323
syslog_partial += n ;
1295
1324
} else
1296
1325
n = 0 ;
1297
- raw_spin_unlock_irq ( & logbuf_lock );
1326
+ logbuf_unlock_irq ( );
1298
1327
1299
1328
if (!n )
1300
1329
break ;
@@ -1323,7 +1352,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
1323
1352
if (!text )
1324
1353
return - ENOMEM ;
1325
1354
1326
- raw_spin_lock_irq ( & logbuf_lock );
1355
+ logbuf_lock_irq ( );
1327
1356
if (buf ) {
1328
1357
u64 next_seq ;
1329
1358
u64 seq ;
@@ -1371,12 +1400,12 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
1371
1400
idx = log_next (idx );
1372
1401
seq ++ ;
1373
1402
1374
- raw_spin_unlock_irq ( & logbuf_lock );
1403
+ logbuf_unlock_irq ( );
1375
1404
if (copy_to_user (buf + len , text , textlen ))
1376
1405
len = - EFAULT ;
1377
1406
else
1378
1407
len += textlen ;
1379
- raw_spin_lock_irq ( & logbuf_lock );
1408
+ logbuf_lock_irq ( );
1380
1409
1381
1410
if (seq < log_first_seq ) {
1382
1411
/* messages are gone, move to next one */
@@ -1390,7 +1419,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
1390
1419
clear_seq = log_next_seq ;
1391
1420
clear_idx = log_next_idx ;
1392
1421
}
1393
- raw_spin_unlock_irq ( & logbuf_lock );
1422
+ logbuf_unlock_irq ( );
1394
1423
1395
1424
kfree (text );
1396
1425
return len ;
@@ -1477,7 +1506,7 @@ int do_syslog(int type, char __user *buf, int len, int source)
1477
1506
break ;
1478
1507
/* Number of chars in the log buffer */
1479
1508
case SYSLOG_ACTION_SIZE_UNREAD :
1480
- raw_spin_lock_irq ( & logbuf_lock );
1509
+ logbuf_lock_irq ( );
1481
1510
if (syslog_seq < log_first_seq ) {
1482
1511
/* messages are gone, move to first one */
1483
1512
syslog_seq = log_first_seq ;
@@ -1505,7 +1534,7 @@ int do_syslog(int type, char __user *buf, int len, int source)
1505
1534
}
1506
1535
error -= syslog_partial ;
1507
1536
}
1508
- raw_spin_unlock_irq ( & logbuf_lock );
1537
+ logbuf_unlock_irq ( );
1509
1538
break ;
1510
1539
/* Size of the log buffer */
1511
1540
case SYSLOG_ACTION_SIZE_BUFFER :
@@ -1682,9 +1711,8 @@ asmlinkage int vprintk_emit(int facility, int level,
1682
1711
boot_delay_msec (level );
1683
1712
printk_delay ();
1684
1713
1685
- printk_safe_enter_irqsave (flags );
1686
1714
/* This stops the holder of console_sem just where we want him */
1687
- raw_spin_lock ( & logbuf_lock );
1715
+ logbuf_lock_irqsave ( flags );
1688
1716
/*
1689
1717
* The printf needs to come first; we need the syslog
1690
1718
* prefix which might be passed-in as a parameter.
@@ -1727,8 +1755,7 @@ asmlinkage int vprintk_emit(int facility, int level,
1727
1755
1728
1756
printed_len += log_output (facility , level , lflags , dict , dictlen , text , text_len );
1729
1757
1730
- raw_spin_unlock (& logbuf_lock );
1731
- printk_safe_exit_irqrestore (flags );
1758
+ logbuf_unlock_irqrestore (flags );
1732
1759
1733
1760
/* If called from the scheduler, we can not call up(). */
1734
1761
if (!in_sched ) {
@@ -2501,10 +2528,10 @@ void register_console(struct console *newcon)
2501
2528
* console_unlock(); will print out the buffered messages
2502
2529
* for us.
2503
2530
*/
2504
- raw_spin_lock_irqsave ( & logbuf_lock , flags );
2531
+ logbuf_lock_irqsave ( flags );
2505
2532
console_seq = syslog_seq ;
2506
2533
console_idx = syslog_idx ;
2507
- raw_spin_unlock_irqrestore ( & logbuf_lock , flags );
2534
+ logbuf_unlock_irqrestore ( flags );
2508
2535
/*
2509
2536
* We're about to replay the log buffer. Only do this to the
2510
2537
* just-registered console to avoid excessive message spam to
@@ -2803,12 +2830,12 @@ void kmsg_dump(enum kmsg_dump_reason reason)
2803
2830
/* initialize iterator with data about the stored records */
2804
2831
dumper -> active = true;
2805
2832
2806
- raw_spin_lock_irqsave ( & logbuf_lock , flags );
2833
+ logbuf_lock_irqsave ( flags );
2807
2834
dumper -> cur_seq = clear_seq ;
2808
2835
dumper -> cur_idx = clear_idx ;
2809
2836
dumper -> next_seq = log_next_seq ;
2810
2837
dumper -> next_idx = log_next_idx ;
2811
- raw_spin_unlock_irqrestore ( & logbuf_lock , flags );
2838
+ logbuf_unlock_irqrestore ( flags );
2812
2839
2813
2840
/* invoke dumper which will iterate over records */
2814
2841
dumper -> dump (dumper , reason );
@@ -2893,9 +2920,9 @@ bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
2893
2920
unsigned long flags ;
2894
2921
bool ret ;
2895
2922
2896
- raw_spin_lock_irqsave ( & logbuf_lock , flags );
2923
+ logbuf_lock_irqsave ( flags );
2897
2924
ret = kmsg_dump_get_line_nolock (dumper , syslog , line , size , len );
2898
- raw_spin_unlock_irqrestore ( & logbuf_lock , flags );
2925
+ logbuf_unlock_irqrestore ( flags );
2899
2926
2900
2927
return ret ;
2901
2928
}
@@ -2934,7 +2961,7 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
2934
2961
if (!dumper -> active )
2935
2962
goto out ;
2936
2963
2937
- raw_spin_lock_irqsave ( & logbuf_lock , flags );
2964
+ logbuf_lock_irqsave ( flags );
2938
2965
if (dumper -> cur_seq < log_first_seq ) {
2939
2966
/* messages are gone, move to first available one */
2940
2967
dumper -> cur_seq = log_first_seq ;
@@ -2943,7 +2970,7 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
2943
2970
2944
2971
/* last entry */
2945
2972
if (dumper -> cur_seq >= dumper -> next_seq ) {
2946
- raw_spin_unlock_irqrestore ( & logbuf_lock , flags );
2973
+ logbuf_unlock_irqrestore ( flags );
2947
2974
goto out ;
2948
2975
}
2949
2976
@@ -2985,7 +3012,7 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
2985
3012
dumper -> next_seq = next_seq ;
2986
3013
dumper -> next_idx = next_idx ;
2987
3014
ret = true;
2988
- raw_spin_unlock_irqrestore ( & logbuf_lock , flags );
3015
+ logbuf_unlock_irqrestore ( flags );
2989
3016
out :
2990
3017
if (len )
2991
3018
* len = l ;
@@ -3023,9 +3050,9 @@ void kmsg_dump_rewind(struct kmsg_dumper *dumper)
3023
3050
{
3024
3051
unsigned long flags ;
3025
3052
3026
- raw_spin_lock_irqsave ( & logbuf_lock , flags );
3053
+ logbuf_lock_irqsave ( flags );
3027
3054
kmsg_dump_rewind_nolock (dumper );
3028
- raw_spin_unlock_irqrestore ( & logbuf_lock , flags );
3055
+ logbuf_unlock_irqrestore ( flags );
3029
3056
}
3030
3057
EXPORT_SYMBOL_GPL (kmsg_dump_rewind );
3031
3058
0 commit comments