Download raw body.
move signal kqueue code to kern_event.c
On Fri, Jul 26, 2024 at 12:17:24PM +0200, Claudio Jeker wrote:
> Move the signal related kqueue filters to kern_event.c.
>
> Since proc and signal filters share the same klist it makes sense to keep
> them together. This is a preparation step towards making those filters
> MPSAFE.
>
ok mvs
> --
> :wq Claudio
>
> Index: kern/kern_event.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_event.c,v
> diff -u -p -r1.198 kern_event.c
> --- kern/kern_event.c 20 Aug 2023 15:13:43 -0000 1.198
> +++ kern/kern_event.c 26 Jul 2024 10:14:46 -0000
> @@ -124,6 +124,9 @@ int filt_kqueue_common(struct knote *kn,
> int filt_procattach(struct knote *kn);
> void filt_procdetach(struct knote *kn);
> int filt_proc(struct knote *kn, long hint);
> +int filt_sigattach(struct knote *kn);
> +void filt_sigdetach(struct knote *kn);
> +int filt_signal(struct knote *kn, long hint);
> int filt_fileattach(struct knote *kn);
> void filt_timerexpire(void *knx);
> int filt_timerattach(struct knote *kn);
> @@ -148,6 +151,13 @@ const struct filterops proc_filtops = {
> .f_event = filt_proc,
> };
>
> +const struct filterops sig_filtops = {
> + .f_flags = 0,
> + .f_attach = filt_sigattach,
> + .f_detach = filt_sigdetach,
> + .f_event = filt_signal,
> +};
> +
> const struct filterops file_filtops = {
> .f_flags = FILTEROP_ISFD | FILTEROP_MPSAFE,
> .f_attach = filt_fileattach,
> @@ -448,6 +458,55 @@ filt_proc(struct knote *kn, long hint)
> }
>
> return (kn->kn_fflags != 0);
> +}
> +
> +/*
> + * signal knotes are shared with proc knotes, so we apply a mask to
> + * the hint in order to differentiate them from process hints. This
> + * could be avoided by using a signal-specific knote list, but probably
> + * isn't worth the trouble.
> + */
> +int
> +filt_sigattach(struct knote *kn)
> +{
> + struct process *pr = curproc->p_p;
> + int s;
> +
> + if (kn->kn_id >= NSIG)
> + return EINVAL;
> +
> + kn->kn_ptr.p_process = pr;
> + kn->kn_flags |= EV_CLEAR; /* automatically set */
> +
> + s = splhigh();
> + klist_insert_locked(&pr->ps_klist, kn);
> + splx(s);
> +
> + return (0);
> +}
> +
> +void
> +filt_sigdetach(struct knote *kn)
> +{
> + struct process *pr = kn->kn_ptr.p_process;
> + int s;
> +
> + s = splhigh();
> + klist_remove_locked(&pr->ps_klist, kn);
> + splx(s);
> +}
> +
> +int
> +filt_signal(struct knote *kn, long hint)
> +{
> +
> + if (hint & NOTE_SIGNAL) {
> + hint &= ~NOTE_SIGNAL;
> +
> + if (kn->kn_id == hint)
> + kn->kn_data++;
> + }
> + return (kn->kn_data != 0);
> }
>
> #define NOTE_TIMER_UNITMASK \
> Index: kern/kern_sig.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_sig.c,v
> diff -u -p -r1.334 kern_sig.c
> --- kern/kern_sig.c 24 Jul 2024 15:31:08 -0000 1.334
> +++ kern/kern_sig.c 26 Jul 2024 10:14:46 -0000
> @@ -70,17 +70,6 @@
>
> int nosuidcoredump = 1;
>
> -int filt_sigattach(struct knote *kn);
> -void filt_sigdetach(struct knote *kn);
> -int filt_signal(struct knote *kn, long hint);
> -
> -const struct filterops sig_filtops = {
> - .f_flags = 0,
> - .f_attach = filt_sigattach,
> - .f_detach = filt_sigdetach,
> - .f_event = filt_signal,
> -};
> -
> /*
> * The array below categorizes the signals and their default actions.
> */
> @@ -1972,55 +1961,6 @@ initsiginfo(siginfo_t *si, int sig, u_lo
> break;
> }
> }
> -}
> -
> -int
> -filt_sigattach(struct knote *kn)
> -{
> - struct process *pr = curproc->p_p;
> - int s;
> -
> - if (kn->kn_id >= NSIG)
> - return EINVAL;
> -
> - kn->kn_ptr.p_process = pr;
> - kn->kn_flags |= EV_CLEAR; /* automatically set */
> -
> - s = splhigh();
> - klist_insert_locked(&pr->ps_klist, kn);
> - splx(s);
> -
> - return (0);
> -}
> -
> -void
> -filt_sigdetach(struct knote *kn)
> -{
> - struct process *pr = kn->kn_ptr.p_process;
> - int s;
> -
> - s = splhigh();
> - klist_remove_locked(&pr->ps_klist, kn);
> - splx(s);
> -}
> -
> -/*
> - * signal knotes are shared with proc knotes, so we apply a mask to
> - * the hint in order to differentiate them from process hints. This
> - * could be avoided by using a signal-specific knote list, but probably
> - * isn't worth the trouble.
> - */
> -int
> -filt_signal(struct knote *kn, long hint)
> -{
> -
> - if (hint & NOTE_SIGNAL) {
> - hint &= ~NOTE_SIGNAL;
> -
> - if (kn->kn_id == hint)
> - kn->kn_data++;
> - }
> - return (kn->kn_data != 0);
> }
>
> void
> Index: sys/event.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/event.h,v
> diff -u -p -r1.71 event.h
> --- sys/event.h 20 Aug 2023 15:13:43 -0000 1.71
> +++ sys/event.h 26 Jul 2024 10:14:46 -0000
> @@ -285,7 +285,6 @@ struct proc;
> struct rwlock;
> struct timespec;
>
> -extern const struct filterops sig_filtops;
> extern const struct filterops dead_filtops;
>
> extern void kqpoll_init(unsigned int);
>
move signal kqueue code to kern_event.c