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;
>