svn commit: r339468 - in head/sys: kern sys

Conrad Meyer cem at FreeBSD.org
Sat Oct 20 18:31:39 UTC 2018


Author: cem
Date: Sat Oct 20 18:31:36 2018
New Revision: 339468
URL: https://svnweb.freebsd.org/changeset/base/339468

Log:
  Replace ttyprintf with sbuf_printf and tty drain routine
  
  Add string variants of cnputc and tty_putchar, and use them from the tty
  sbuf drain routine.
  
  Suggested by:	ed@
  Sponsored by:	Dell EMC Isilon

Modified:
  head/sys/kern/kern_cons.c
  head/sys/kern/subr_prf.c
  head/sys/kern/tty_info.c
  head/sys/kern/tty_ttydisc.c
  head/sys/sys/cons.h
  head/sys/sys/systm.h
  head/sys/sys/tty.h

Modified: head/sys/kern/kern_cons.c
==============================================================================
--- head/sys/kern/kern_cons.c	Sat Oct 20 18:30:13 2018	(r339467)
+++ head/sys/kern/kern_cons.c	Sat Oct 20 18:31:36 2018	(r339468)
@@ -522,9 +522,9 @@ cnputc(int c)
 }
 
 void
-cnputs(char *p)
+cnputsn(const char *p, size_t n)
 {
-	int c;
+	size_t i;
 	int unlock_reqd = 0;
 
 	if (use_cnputs_mtx) {
@@ -539,11 +539,17 @@ cnputs(char *p)
 		unlock_reqd = 1;
 	}
 
-	while ((c = *p++) != '\0')
-		cnputc(c);
+	for (i = 0; i < n; i++)
+		cnputc(p[i]);
 
 	if (unlock_reqd)
 		mtx_unlock_spin(&cnputs_mtx);
+}
+
+void
+cnputs(char *p)
+{
+	cnputsn(p, strlen(p));
 }
 
 static int consmsgbuf_size = 8192;

Modified: head/sys/kern/subr_prf.c
==============================================================================
--- head/sys/kern/subr_prf.c	Sat Oct 20 18:30:13 2018	(r339467)
+++ head/sys/kern/subr_prf.c	Sat Oct 20 18:31:36 2018	(r339468)
@@ -258,27 +258,6 @@ vtprintf(struct proc *p, int pri, const char *fmt, va_
 	msgbuftrigger = 1;
 }
 
-/*
- * Ttyprintf displays a message on a tty; it should be used only by
- * the tty driver, or anything that knows the underlying tty will not
- * be revoke(2)'d away.  Other callers should use tprintf.
- */
-int
-ttyprintf(struct tty *tp, const char *fmt, ...)
-{
-	va_list ap;
-	struct putchar_arg pca;
-	int retval;
-
-	va_start(ap, fmt);
-	pca.tty = tp;
-	pca.flags = TOTTY;
-	pca.p_bufr = NULL;
-	retval = kvprintf(fmt, putchar, &pca, 10, ap);
-	va_end(ap);
-	return (retval);
-}
-
 static int
 _vprintf(int level, int flags, const char *fmt, va_list ap)
 {

Modified: head/sys/kern/tty_info.c
==============================================================================
--- head/sys/kern/tty_info.c	Sat Oct 20 18:30:13 2018	(r339467)
+++ head/sys/kern/tty_info.c	Sat Oct 20 18:31:36 2018	(r339468)
@@ -46,10 +46,13 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
+#include <sys/cons.h>
+#include <sys/kdb.h>
 #include <sys/lock.h>
 #include <sys/mutex.h>
 #include <sys/proc.h>
 #include <sys/resourcevar.h>
+#include <sys/sbuf.h>
 #include <sys/sched.h>
 #include <sys/systm.h>
 #include <sys/tty.h>
@@ -209,6 +212,27 @@ proc_compare(struct proc *p1, struct proc *p2)
 	return (p2->p_pid > p1->p_pid);		/* tie - return highest pid */
 }
 
+static int
+sbuf_tty_drain(void *a, const char *d, int len)
+{
+	struct tty *tp;
+	int rc;
+
+	tp = a;
+
+	if (kdb_active) {
+		cnputsn(d, len);
+		return (len);
+	}
+	if (tp != NULL && panicstr == NULL) {
+		rc = tty_putstrn(tp, d, len);
+		if (rc != 0)
+			return (-ENXIO);
+		return (len);
+	}
+	return (-ENXIO);
+}
+
 /*
  * Report on state of foreground process group.
  */
@@ -219,6 +243,7 @@ tty_info(struct tty *tp)
 	struct proc *p, *ppick;
 	struct thread *td, *tdpick;
 	const char *stateprefix, *state;
+	struct sbuf sb;
 	long rss;
 	int load, pctcpu;
 	pid_t pid;
@@ -230,24 +255,27 @@ tty_info(struct tty *tp)
 	if (tty_checkoutq(tp) == 0)
 		return;
 
+	(void)sbuf_new(&sb, tp->t_prbuf, sizeof(tp->t_prbuf), SBUF_FIXEDLEN);
+	sbuf_set_drain(&sb, sbuf_tty_drain, tp);
+
 	/* Print load average. */
 	load = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
-	ttyprintf(tp, "%sload: %d.%02d ", tp->t_column == 0 ? "" : "\n",
+	sbuf_printf(&sb, "%sload: %d.%02d ", tp->t_column == 0 ? "" : "\n",
 	    load / 100, load % 100);
 
 	if (tp->t_session == NULL) {
-		ttyprintf(tp, "not a controlling terminal\n");
-		return;
+		sbuf_printf(&sb, "not a controlling terminal\n");
+		goto out;
 	}
 	if (tp->t_pgrp == NULL) {
-		ttyprintf(tp, "no foreground process group\n");
-		return;
+		sbuf_printf(&sb, "no foreground process group\n");
+		goto out;
 	}
 	PGRP_LOCK(tp->t_pgrp);
 	if (LIST_EMPTY(&tp->t_pgrp->pg_members)) {
 		PGRP_UNLOCK(tp->t_pgrp);
-		ttyprintf(tp, "empty foreground process group\n");
-		return;
+		sbuf_printf(&sb, "empty foreground process group\n");
+		goto out;
 	}
 
 	/*
@@ -305,11 +333,15 @@ tty_info(struct tty *tp)
 	PROC_UNLOCK(p);
 
 	/* Print command, pid, state, rtime, utime, stime, %cpu, and rss. */
-	ttyprintf(tp,
+	sbuf_printf(&sb,
 	    " cmd: %s %d [%s%s] %ld.%02ldr %ld.%02ldu %ld.%02lds %d%% %ldk\n",
 	    comm, pid, stateprefix, state,
 	    (long)rtime.tv_sec, rtime.tv_usec / 10000,
 	    (long)utime.tv_sec, utime.tv_usec / 10000,
 	    (long)stime.tv_sec, stime.tv_usec / 10000,
 	    pctcpu / 100, rss);
+
+out:
+	sbuf_finish(&sb);
+	sbuf_delete(&sb);
 }

Modified: head/sys/kern/tty_ttydisc.c
==============================================================================
--- head/sys/kern/tty_ttydisc.c	Sat Oct 20 18:30:13 2018	(r339467)
+++ head/sys/kern/tty_ttydisc.c	Sat Oct 20 18:31:36 2018	(r339468)
@@ -1251,17 +1251,27 @@ ttydisc_getc_poll(struct tty *tp)
  */
 
 int
-tty_putchar(struct tty *tp, char c)
+tty_putstrn(struct tty *tp, const char *p, size_t n)
 {
+	size_t i;
+
 	tty_lock_assert(tp, MA_OWNED);
 
 	if (tty_gone(tp))
 		return (-1);
 
-	ttydisc_echo_force(tp, c, 0);
+	for (i = 0; i < n; i++)
+		ttydisc_echo_force(tp, p[i], 0);
+
 	tp->t_writepos = tp->t_column;
 	ttyinq_reprintpos_set(&tp->t_inq);
 
 	ttydevsw_outwakeup(tp);
 	return (0);
+}
+
+int
+tty_putchar(struct tty *tp, char c)
+{
+	return (tty_putstrn(tp, &c, 1));
 }

Modified: head/sys/sys/cons.h
==============================================================================
--- head/sys/sys/cons.h	Sat Oct 20 18:30:13 2018	(r339467)
+++ head/sys/sys/cons.h	Sat Oct 20 18:31:36 2018	(r339468)
@@ -137,6 +137,7 @@ int	cngetc(void);
 void	cngets(char *, size_t, int);
 void	cnputc(int);
 void	cnputs(char *);
+void	cnputsn(const char *, size_t);
 int	cnunavailable(void);
 void	constty_set(struct tty *tp);
 void	constty_clear(void);

Modified: head/sys/sys/systm.h
==============================================================================
--- head/sys/sys/systm.h	Sat Oct 20 18:30:13 2018	(r339467)
+++ head/sys/sys/systm.h	Sat Oct 20 18:31:36 2018	(r339468)
@@ -290,7 +290,6 @@ int	vasprintf(char **ret, struct malloc_type *mtp, con
 int	vsnprintf(char *, size_t, const char *, __va_list) __printflike(3, 0);
 int	vsnrprintf(char *, size_t, int, const char *, __va_list) __printflike(4, 0);
 int	vsprintf(char *buf, const char *, __va_list) __printflike(2, 0);
-int	ttyprintf(struct tty *, const char *, ...) __printflike(2, 3);
 int	sscanf(const char *, char const * _Nonnull, ...) __scanflike(2, 3);
 int	vsscanf(const char * _Nonnull, char const * _Nonnull, __va_list)  __scanflike(2, 0);
 long	strtol(const char *, char **, int);

Modified: head/sys/sys/tty.h
==============================================================================
--- head/sys/sys/tty.h	Sat Oct 20 18:30:13 2018	(r339467)
+++ head/sys/sys/tty.h	Sat Oct 20 18:31:36 2018	(r339468)
@@ -132,6 +132,13 @@ struct tty {
 	void		*t_devswsoftc;	/* (c) Soft config, for drivers. */
 	void		*t_hooksoftc;	/* (t) Soft config, for hooks. */
 	struct cdev	*t_dev;		/* (c) Primary character device. */
+
+#ifndef PRINTF_BUFR_SIZE
+#define TTY_PRINTF_SIZE 256
+#else
+#define TTY_PRINTF_SIZE PRINTF_BUFR_SIZE
+#endif
+	char		t_prbuf[TTY_PRINTF_SIZE]; /* (t) */
 };
 
 /*
@@ -194,6 +201,7 @@ void	tty_wakeup(struct tty *tp, int flags);
 /* System messages. */
 int	tty_checkoutq(struct tty *tp);
 int	tty_putchar(struct tty *tp, char c);
+int	tty_putstrn(struct tty *tp, const char *p, size_t n);
 
 int	tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag,
     struct thread *td);


More information about the svn-src-all mailing list