on 17/11/2011 18:37 John Baldwin said the following: > On Thursday, November 17, 2011 4:47:42 am Andriy Gapon wrote: >> on 17/11/2011 10:34 Andriy Gapon said the following: >>> on 17/11/2011 10:15 Kostik Belousov said the following: >>>> I have the following change for eons on my test boxes. Without it, >>>> I simply cannot get _any_ dump. >>>> >>>> diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c >>>> index 10b89c7..a38e42f 100644 >>>> --- a/sys/cam/cam_xpt.c >>>> +++ b/sys/cam/cam_xpt.c >>>> @@ -4230,7 +4230,7 @@ xpt_done(union ccb *done_ccb) >>>> TAILQ_INSERT_TAIL(&cam_simq, sim, links); >>>> mtx_unlock(&cam_simq_lock); >>>> sim->flags |= CAM_SIM_ON_DONEQ; >>>> - if (first) >>>> + if (first && panicstr == NULL) >>>> swi_sched(cambio_ih, 0); >>>> } >>>> } >>> >>> I think that this (or similar) change should go into the patch and the tree. >>> >> >> And, BTW, I still would like to do something like the following (perhaps with >> td_oncpu = NOCPU and td_flags &= ~TDF_NEEDRESCHED also moved to the common >> code): >> >> Index: sys/kern/sched_ule.c >> =================================================================== >> --- sys/kern/sched_ule.c (revision 227608) >> +++ sys/kern/sched_ule.c (working copy) >> @@ -1790,7 +1790,6 @@ sched_switch(struct thread *td, struct thread *new >> td->td_oncpu = NOCPU; >> if (!(flags & SW_PREEMPT)) >> td->td_flags &= ~TDF_NEEDRESCHED; >> - td->td_owepreempt = 0; >> tdq->tdq_switchcnt++; >> /* >> * The lock pointer in an idle thread should never change. Reset it >> Index: sys/kern/kern_synch.c >> =================================================================== >> --- sys/kern/kern_synch.c (revision 227608) >> +++ sys/kern/kern_synch.c (working copy) >> @@ -406,6 +406,8 @@ mi_switch(int flags, struct thread *newtd) >> ("mi_switch: switch must be voluntary or involuntary")); >> KASSERT(newtd != curthread, ("mi_switch: preempting back to ourself")); >> >> + td->td_owepreempt = 0; >> + >> /* >> * Don't perform context switches from the debugger. >> */ >> Index: sys/kern/sched_4bsd.c >> =================================================================== >> --- sys/kern/sched_4bsd.c (revision 227608) >> +++ sys/kern/sched_4bsd.c (working copy) >> @@ -940,7 +940,6 @@ sched_switch(struct thread *td, struct thread *new >> td->td_lastcpu = td->td_oncpu; >> if (!(flags & SW_PREEMPT)) >> td->td_flags &= ~TDF_NEEDRESCHED; >> - td->td_owepreempt = 0; >> td->td_oncpu = NOCPU; >> >> /* >> >> Does anybody see any potential problems with such a change? > > Hmm, does this mean the preemption will be lost if you break into the > debugger and continue in the non-panic case?
Not sure which exact scenario you have in mind. Please note that the above diff just moves resetting of td_owepreempt to an earlier place. As far as I can see there are no checks of td_owepreempt value between the new place and the old places. -- Andriy Gapon _______________________________________________ freebsd-current@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-current To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"