@@ -695,16 +695,15 @@ static ssize_t msg_print_ext_body(char *buf, size_t size,
695
695
return len ;
696
696
}
697
697
698
+ static bool printk_get_next_message (struct printk_message * pmsg , u64 seq ,
699
+ bool is_extended , bool may_supress );
700
+
698
701
/* /dev/kmsg - userspace message inject/listen interface */
699
702
struct devkmsg_user {
700
703
atomic64_t seq ;
701
704
struct ratelimit_state rs ;
702
705
struct mutex lock ;
703
- char buf [CONSOLE_EXT_LOG_MAX ];
704
-
705
- struct printk_info info ;
706
- char text_buf [CONSOLE_EXT_LOG_MAX ];
707
- struct printk_record record ;
706
+ struct printk_buffers pbufs ;
708
707
};
709
708
710
709
static __printf (3 , 4 ) __cold
@@ -786,8 +785,10 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
786
785
size_t count , loff_t * ppos )
787
786
{
788
787
struct devkmsg_user * user = file -> private_data ;
789
- struct printk_record * r = & user -> record ;
790
- size_t len ;
788
+ char * outbuf = & user -> pbufs .outbuf [0 ];
789
+ struct printk_message pmsg = {
790
+ .pbufs = & user -> pbufs ,
791
+ };
791
792
ssize_t ret ;
792
793
793
794
if (!user )
@@ -797,7 +798,7 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
797
798
if (ret )
798
799
return ret ;
799
800
800
- if (!prb_read_valid ( prb , atomic64_read (& user -> seq ), r )) {
801
+ if (!printk_get_next_message ( & pmsg , atomic64_read (& user -> seq ), true, false )) {
801
802
if (file -> f_flags & O_NONBLOCK ) {
802
803
ret = - EAGAIN ;
803
804
goto out ;
@@ -814,36 +815,31 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
814
815
* This pairs with __wake_up_klogd:A.
815
816
*/
816
817
ret = wait_event_interruptible (log_wait ,
817
- prb_read_valid ( prb ,
818
- atomic64_read ( & user -> seq ), r )); /* LMM(devkmsg_read:A) */
818
+ printk_get_next_message ( & pmsg , atomic64_read ( & user -> seq ), true ,
819
+ false )); /* LMM(devkmsg_read:A) */
819
820
if (ret )
820
821
goto out ;
821
822
}
822
823
823
- if (r -> info -> seq != atomic64_read ( & user -> seq ) ) {
824
+ if (pmsg . dropped ) {
824
825
/* our last seen message is gone, return error and reset */
825
- atomic64_set (& user -> seq , r -> info -> seq );
826
+ atomic64_set (& user -> seq , pmsg . seq );
826
827
ret = - EPIPE ;
827
828
goto out ;
828
829
}
829
830
830
- len = info_print_ext_header (user -> buf , sizeof (user -> buf ), r -> info );
831
- len += msg_print_ext_body (user -> buf + len , sizeof (user -> buf ) - len ,
832
- & r -> text_buf [0 ], r -> info -> text_len ,
833
- & r -> info -> dev_info );
834
-
835
- atomic64_set (& user -> seq , r -> info -> seq + 1 );
831
+ atomic64_set (& user -> seq , pmsg .seq + 1 );
836
832
837
- if (len > count ) {
833
+ if (pmsg . outbuf_len > count ) {
838
834
ret = - EINVAL ;
839
835
goto out ;
840
836
}
841
837
842
- if (copy_to_user (buf , user -> buf , len )) {
838
+ if (copy_to_user (buf , outbuf , pmsg . outbuf_len )) {
843
839
ret = - EFAULT ;
844
840
goto out ;
845
841
}
846
- ret = len ;
842
+ ret = pmsg . outbuf_len ;
847
843
out :
848
844
mutex_unlock (& user -> lock );
849
845
return ret ;
@@ -937,9 +933,6 @@ static int devkmsg_open(struct inode *inode, struct file *file)
937
933
938
934
mutex_init (& user -> lock );
939
935
940
- prb_rec_init_rd (& user -> record , & user -> info ,
941
- & user -> text_buf [0 ], sizeof (user -> text_buf ));
942
-
943
936
atomic64_set (& user -> seq , prb_first_valid_seq (prb ));
944
937
945
938
file -> private_data = user ;
@@ -2762,12 +2755,14 @@ static void console_prepend_dropped(struct printk_message *pmsg, unsigned long d
2762
2755
* @is_extended specifies if the message should be formatted for extended
2763
2756
* console output.
2764
2757
*
2758
+ * @may_supress specifies if records may be skipped based on loglevel.
2759
+ *
2765
2760
* Returns false if no record is available. Otherwise true and all fields
2766
2761
* of @pmsg are valid. (See the documentation of struct printk_message
2767
2762
* for information about the @pmsg fields.)
2768
2763
*/
2769
2764
static bool printk_get_next_message (struct printk_message * pmsg , u64 seq ,
2770
- bool is_extended )
2765
+ bool is_extended , bool may_suppress )
2771
2766
{
2772
2767
static int panic_console_dropped ;
2773
2768
@@ -2810,7 +2805,7 @@ static bool printk_get_next_message(struct printk_message *pmsg, u64 seq,
2810
2805
}
2811
2806
2812
2807
/* Skip record that has level above the console loglevel. */
2813
- if (suppress_message_printing (r .info -> level ))
2808
+ if (may_suppress && suppress_message_printing (r .info -> level ))
2814
2809
goto out ;
2815
2810
2816
2811
if (is_extended ) {
@@ -2853,7 +2848,7 @@ static bool console_emit_next_record(struct console *con, bool *handover, int co
2853
2848
2854
2849
* handover = false;
2855
2850
2856
- if (!printk_get_next_message (& pmsg , con -> seq , is_extended ))
2851
+ if (!printk_get_next_message (& pmsg , con -> seq , is_extended , true ))
2857
2852
return false;
2858
2853
2859
2854
con -> dropped += pmsg .dropped ;
0 commit comments