Author: kib
Date: Tue Mar 10 20:04:38 2020
New Revision: 358855
URL: https://svnweb.freebsd.org/changeset/base/358855

Log:
  Return reschedule_signals() to being static again.
  
  It was used after sigfastblock_setpend() call in in ast() when current
  thread fast-blocks signals.  Add a flag to sigfastblock_setpend() to
  request reschedule, and remove the direct use of the function from
  subr_trap.c
  
  Tested by:    pho
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/kern/kern_sig.c
  head/sys/kern/subr_trap.c
  head/sys/sys/signalvar.h

Modified: head/sys/kern/kern_sig.c
==============================================================================
--- head/sys/kern/kern_sig.c    Tue Mar 10 20:01:52 2020        (r358854)
+++ head/sys/kern/kern_sig.c    Tue Mar 10 20:04:38 2020        (r358855)
@@ -108,6 +108,7 @@ static int  coredump(struct thread *);
 static int     killpg1(struct thread *td, int sig, int pgid, int all,
                    ksiginfo_t *ksi);
 static int     issignal(struct thread *td);
+static void    reschedule_signals(struct proc *p, sigset_t block, int flags);
 static int     sigprop(int sig);
 static void    tdsigwakeup(struct thread *, int, sig_t, int);
 static int     sig_suspend_threads(struct thread *, struct proc *, int);
@@ -2683,7 +2684,7 @@ stopme:
        return (td->td_xsig);
 }
 
-void
+static void
 reschedule_signals(struct proc *p, sigset_t block, int flags)
 {
        struct sigacts *ps;
@@ -4124,8 +4125,8 @@ sigfastblock_fetch(struct thread *td)
        (void)sigfastblock_fetch_sig(td, true, &val);
 }
 
-void
-sigfastblock_setpend(struct thread *td)
+static void
+sigfastblock_setpend1(struct thread *td)
 {
        int res;
        uint32_t oldval;
@@ -4152,5 +4153,19 @@ sigfastblock_setpend(struct thread *td)
                MPASS(res == 1);
                if (thread_check_susp(td, false) != 0)
                        break;
+       }
+}
+
+void
+sigfastblock_setpend(struct thread *td, bool resched)
+{
+       struct proc *p;
+
+       sigfastblock_setpend1(td);
+       if (resched) {
+               p = td->td_proc;
+               PROC_LOCK(p);
+               reschedule_signals(p, fastblock_mask, SIGPROCMASK_FASTBLK);
+               PROC_UNLOCK(p);
        }
 }

Modified: head/sys/kern/subr_trap.c
==============================================================================
--- head/sys/kern/subr_trap.c   Tue Mar 10 20:01:52 2020        (r358854)
+++ head/sys/kern/subr_trap.c   Tue Mar 10 20:04:38 2020        (r358855)
@@ -328,11 +328,7 @@ ast(struct trapframe *framep)
                sigfastblock_fetch(td);
                if ((td->td_pflags & TDP_SIGFASTBLOCK) != 0 &&
                    td->td_sigblock_val != 0) {
-                       sigfastblock_setpend(td);
-                       PROC_LOCK(p);
-                       reschedule_signals(p, fastblock_mask,
-                           SIGPROCMASK_FASTBLK);
-                       PROC_UNLOCK(p);
+                       sigfastblock_setpend(td, true);
                } else {
                        PROC_LOCK(p);
                        mtx_lock(&p->p_sigacts->ps_mtx);
@@ -350,7 +346,7 @@ ast(struct trapframe *framep)
         * the postsig() loop was performed.
         */
        if (td->td_pflags & TDP_SIGFASTPENDING)
-               sigfastblock_setpend(td);
+               sigfastblock_setpend(td, false);
 
        /*
         * We need to check to see if we have to exit or wait due to a

Modified: head/sys/sys/signalvar.h
==============================================================================
--- head/sys/sys/signalvar.h    Tue Mar 10 20:01:52 2020        (r358854)
+++ head/sys/sys/signalvar.h    Tue Mar 10 20:04:38 2020        (r358855)
@@ -393,7 +393,6 @@ void        pgsignal(struct pgrp *pgrp, int sig, int 
checkctt
 int    postsig(int sig);
 void   kern_psignal(struct proc *p, int sig);
 int    ptracestop(struct thread *td, int sig, ksiginfo_t *si);
-void   reschedule_signals(struct proc *p, sigset_t block, int flags);
 void   sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *retmask);
 struct sigacts *sigacts_alloc(void);
 void   sigacts_copy(struct sigacts *dest, struct sigacts *src);
@@ -406,7 +405,7 @@ int sigev_findtd(struct proc *p, struct sigevent *sige
 int    sig_ffs(sigset_t *set);
 void   sigfastblock_clear(struct thread *td);
 void   sigfastblock_fetch(struct thread *td);
-void   sigfastblock_setpend(struct thread *td);
+void   sigfastblock_setpend(struct thread *td, bool resched);
 void   siginit(struct proc *p);
 void   signotify(struct thread *td);
 void   sigqueue_delete(struct sigqueue *queue, int sig);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to