On Thu, Jan 07, 2021 at 11:51:02AM -0000, Miod Vallat wrote:
> 
> >> Indeed. Wrappinge the mutex operations in msgbuf_putchar with if (!cold)
> >> makes the kernel boot again.
> >
> > Here is a diff for that.
> 
> After a bit more thinking, it might be worth introduce a
> msgbuf_putchar_unlocked() routine for the inner part only, and have
> initmsgbuf() use it, since:
> - it has made sure the magic value test will suceed.
> - this is the only use of msgbuf_putchar() on sparc64 until the proper
>   curcpu mappings are set up; all output from pmap_bootstrap() carefully
>   uses the prom routines (and do not end up in the message buffer).

Here is a diff.

However, are there any other similar fallouts outside this initmsgbuf()
situation?

Index: kern/subr_log.c
===================================================================
RCS file: src/sys/kern/subr_log.c,v
retrieving revision 1.70
diff -u -p -r1.70 subr_log.c
--- kern/subr_log.c     25 Dec 2020 12:59:52 -0000      1.70
+++ kern/subr_log.c     7 Jan 2021 13:21:45 -0000
@@ -109,6 +109,7 @@ const struct filterops logread_filtops =
 int dosendsyslog(struct proc *, const char *, size_t, int, enum uio_seg);
 void logtick(void *);
 size_t msgbuf_getlen(struct msgbuf *);
+void msgbuf_putchar_locked(struct msgbuf *, const char);
 
 void
 initmsgbuf(caddr_t buf, size_t bufsize)
@@ -137,9 +138,13 @@ initmsgbuf(caddr_t buf, size_t bufsize)
                mbp->msg_bufs = new_bufs;
        }
 
-       /* Always start new buffer data on a new line. */
+       /*
+        * Always start new buffer data on a new line.
+        * Avoid using log_mtx because mutexes do not work during early boot
+        * on some architectures.
+        */
        if (mbp->msg_bufx > 0 && mbp->msg_bufc[mbp->msg_bufx - 1] != '\n')
-               msgbuf_putchar(msgbufp, '\n');
+               msgbuf_putchar_locked(mbp, '\n');
 
        /* mark it as ready for use. */
        msgbufmapped = 1;
@@ -162,6 +167,13 @@ msgbuf_putchar(struct msgbuf *mbp, const
                return;
 
        mtx_enter(&log_mtx);
+       msgbuf_putchar_locked(mbp, c);
+       mtx_leave(&log_mtx);
+}
+
+void
+msgbuf_putchar_locked(struct msgbuf *mbp, const char c)
+{
        mbp->msg_bufc[mbp->msg_bufx++] = c;
        if (mbp->msg_bufx < 0 || mbp->msg_bufx >= mbp->msg_bufs)
                mbp->msg_bufx = 0;
@@ -171,7 +183,6 @@ msgbuf_putchar(struct msgbuf *mbp, const
                        mbp->msg_bufr = 0;
                mbp->msg_bufd++;
        }
-       mtx_leave(&log_mtx);
 }
 
 size_t

Reply via email to