Provide counter_warning(9) KPI which allows to issue limited number of

warnings for some kernel events, mostly intended for the use of
obsoleted or otherwise undersired interfaces.

This is an abstracted and race-expelled code from compat pty driver.

Requested and reviewed by:	jhb
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D7270
This commit is contained in:
Konstantin Belousov 2016-07-21 16:34:56 +00:00
parent 303c356245
commit 9837947b07
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=303151
3 changed files with 25 additions and 9 deletions

View File

@ -52,10 +52,10 @@ __FBSDID("$FreeBSD$");
* binary emulation.
*/
static unsigned int pty_warningcnt = 1;
static unsigned pty_warningcnt = 1;
SYSCTL_UINT(_kern, OID_AUTO, tty_pty_warningcnt, CTLFLAG_RW,
&pty_warningcnt, 0,
"Warnings that will be triggered upon legacy PTY allocation");
&pty_warningcnt, 0,
"Warnings that will be triggered upon legacy PTY allocation");
static int
ptydev_fdopen(struct cdev *dev, int fflags, struct thread *td, struct file *fp)
@ -77,12 +77,7 @@ ptydev_fdopen(struct cdev *dev, int fflags, struct thread *td, struct file *fp)
}
/* Raise a warning when a legacy PTY has been allocated. */
if (pty_warningcnt > 0) {
pty_warningcnt--;
log(LOG_INFO, "pid %d (%s) is using legacy pty devices%s\n",
td->td_proc->p_pid, td->td_name,
pty_warningcnt ? "" : " - not logging anymore");
}
counted_warning(&pty_warningcnt, "is using legacy pty devices");
return (0);
}

View File

@ -1196,3 +1196,22 @@ sbuf_hexdump(struct sbuf *sb, const void *ptr, int length, const char *hdr,
}
}
void
counted_warning(unsigned *counter, const char *msg)
{
struct thread *td;
unsigned c;
for (;;) {
c = *counter;
if (c == 0)
break;
if (atomic_cmpset_int(counter, c, c - 1)) {
td = curthread;
log(LOG_INFO, "pid %d (%s) %s%s\n",
td->td_proc->p_pid, td->td_name, msg,
c > 1 ? "" : " - not logging anymore");
break;
}
}
}

View File

@ -447,4 +447,6 @@ void intr_prof_stack_use(struct thread *td, struct trapframe *frame);
extern void (*softdep_ast_cleanup)(void);
void counted_warning(unsigned *counter, const char *msg);
#endif /* !_SYS_SYSTM_H_ */