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:
parent
303c356245
commit
9837947b07
sys
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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_ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user