diff options
| author | Bryan Cantrill <bryan@joyent.com> | 2015-11-24 00:52:37 +0000 |
|---|---|---|
| committer | Robert Mustacchi <rm@joyent.com> | 2016-08-06 18:19:02 -0700 |
| commit | 7429414e8ece9246bddb63c2875c9d54b50caa12 (patch) | |
| tree | 1de7e4ef2adc1f77e353becfed0b4a1ab3c83522 | |
| parent | d67a06e7b6fe5f1a740d1617520efec447e9edb9 (diff) | |
| download | illumos-joyent-7429414e8ece9246bddb63c2875c9d54b50caa12.tar.gz | |
7205 trap() acquires p_lock unnecessarily
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Approved by: Garrett D'Amore <garrett@damore.org>
| -rw-r--r-- | usr/src/uts/i86pc/os/trap.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/usr/src/uts/i86pc/os/trap.c b/usr/src/uts/i86pc/os/trap.c index 9390690e95..82be4f7e8a 100644 --- a/usr/src/uts/i86pc/os/trap.c +++ b/usr/src/uts/i86pc/os/trap.c @@ -1468,12 +1468,23 @@ trap(struct regs *rp, caddr_t addr, processorid_t cpuid) ct->t_sig_check = 0; - mutex_enter(&p->p_lock); + /* + * As in other code paths that check against TP_CHANGEBIND, + * we perform the check first without p_lock held -- only + * acquiring p_lock in the unlikely event that it is indeed + * set. This is safe because we are doing this after the + * astoff(); if we are racing another thread setting + * TP_CHANGEBIND on us, we will pick it up on a subsequent + * lap through. + */ if (curthread->t_proc_flag & TP_CHANGEBIND) { - timer_lwpbind(); - curthread->t_proc_flag &= ~TP_CHANGEBIND; + mutex_enter(&p->p_lock); + if (curthread->t_proc_flag & TP_CHANGEBIND) { + timer_lwpbind(); + curthread->t_proc_flag &= ~TP_CHANGEBIND; + } + mutex_exit(&p->p_lock); } - mutex_exit(&p->p_lock); /* * for kaio requests that are on the per-process poll queue, |
