Seems good to me. I wouldn't bother with disabling this in SMALL_KERNEL. Space is not short enough to complicate the code for ~200 bytes.
> To make syslog reliable, I want to see log messages about failed > log atempts. sendsyslog(2) seems a good place to detect and report > the problem. > > ok? > > bluhm > > Index: kern/subr_log.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/kern/subr_log.c,v > retrieving revision 1.30 > diff -u -p -r1.30 subr_log.c > --- kern/subr_log.c 6 May 2015 08:52:17 -0000 1.30 > +++ kern/subr_log.c 14 Aug 2015 18:11:47 -0000 > @@ -83,6 +83,8 @@ int filt_logread(struct knote *kn, long > struct filterops logread_filtops = > { 1, NULL, filt_logrdetach, filt_logread}; > > +int dosendsyslog(struct proc *, const char *, size_t, enum uio_seg); > + > void > initmsgbuf(caddr_t buf, size_t bufsize) > { > @@ -354,6 +356,40 @@ sys_sendsyslog(struct proc *p, void *v, > syscallarg(const void *) buf; > syscallarg(size_t) nbyte; > } */ *uap = v; > + int error; > +#ifndef SMALL_KERNEL > + static int dropped_count, orig_error; > + int len; > + char buf[64]; > + > + if (dropped_count) { > + len = snprintf(buf, sizeof(buf), > + "<%d> sendsyslog: dropped %d message%s, error %d", > + LOG_KERN|LOG_WARNING, dropped_count, > + dropped_count == 1 ? "" : "s", orig_error); > + error = dosendsyslog(p, buf, MIN((size_t)len, sizeof(buf) - 1), > + UIO_SYSSPACE); > + if (error) { > + dropped_count++; > + return (error); > + } > + dropped_count = 0; > + } > +#endif > + error = dosendsyslog(p, SCARG(uap, buf), SCARG(uap, nbyte), > + UIO_USERSPACE); > +#ifndef SMALL_KERNEL > + if (error) { > + dropped_count++; > + orig_error = error; > + } > +#endif > + return (error); > +} > + > +int > +dosendsyslog(struct proc *p, const char *buf, size_t nbyte, enum uio_seg > sflg) > +{ > #ifdef KTRACE > struct iovec *ktriov = NULL; > int iovlen; > @@ -369,11 +405,11 @@ sys_sendsyslog(struct proc *p, void *v, > f = syslogf; > FREF(f); > > - aiov.iov_base = (char *)SCARG(uap, buf); > - aiov.iov_len = SCARG(uap, nbyte); > + aiov.iov_base = (char *)buf; > + aiov.iov_len = nbyte; > auio.uio_iov = &aiov; > auio.uio_iovcnt = 1; > - auio.uio_segflg = UIO_USERSPACE; > + auio.uio_segflg = sflg; > auio.uio_rw = UIO_WRITE; > auio.uio_procp = p; > auio.uio_offset = 0; >