Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Mar 2002 16:21:09 -0800 (PST)
From:      Julian Elischer <julian@elischer.org>
To:        FreeBSD current users <current@freebsd.org>
Cc:        Mckusick@mckusick.com
Subject:   Contemplating THIS change to signals.
Message-ID:  <Pine.BSF.4.21.0203061544020.37321-100000@InterJet.elischer.org>

next in thread | raw e-mail | index | archive | help
Maybe this should be in -arch.. I couldn;t make my mind up,
but..


There is some behaviour in signals which seems
1/ un-neccesary
2/ potentially dangerous.
in addition it is 
3/ Definitly incompatible with KSEs.

I am hoping that someone can give me a good reason why it is done, and
failing that, I'm hoping people can give comments on my thoughts.

The behavious in question was inherrited from   BSD4.4-LITE2

When the sleep code (tsleep,msleep, cv{stuff})
checks to see if there is a pending signal that might cause the sleep
to abort, it calls CURSIG() which calls issignal,
which in turn might decide to actually suspend the process.
(if the user hit ^Z for example)

This is fine when CURSIG is called from userret(), because we are on the
user boundary, however calling it from the sleep()
call seems a rather UN-NICE thing to do.

One could argue that it is safe because you are not allowed to sleep
while holding resources (um is it not possible to sleep
while holding a vnode?) but it seems that it is possible to hit ^Z
at teh right moment while something is holding some resource
(during what it expects to be a very short term sleep,) and end up
blocking the whole system.

I would argue that a process can be considered to be suspended even while
it is running in kernel space. My definition of a suspended process 
would be one that id not running any user code. it is not making any
headway on the userland program. This I put it to the group that 
it is sufficient to only suspend a process when it is crossing the user
boundary. (returning to user space)

My suggestion is to remove teh code in issignal() that perfoms the
blocking actions and create a separate function that does that action.
I would then call that function from userret() immediatly after the call
to issignal(). The result would be that
suspended processes would still not reach userland, but processes would
not have to option of suspending indefinitly at sleep().

The signal would still cut short the sleep, but the process would be 
allowed to proceed to the user boundary, at which point it would
be suspended as before.

If anyone has any reasons they think this is a bad idea, then please speak
up. Neithe Matt (Dillon) nor I can see that stopping in msleep
is required, and both of us are in fact un-easy with it.

In a THREADED world it gets even more complicated, because
the SUSPENDED state is a PER_PROCESS state, which means that
you are not suspented until ALL THERADS have left userland
and been counted as 'suspended'.
Having some threads stopped 'near' msleep and others stopped at the
userland boundary  is asking for trouble in my opinion.

I can not think of any downside to making the suspension 
(whether from ptrace, or a signal) only occur at the user boundary.

If I hear NO arguments I'll take it that no-one can think of any reasons
to not change the code. If yuo have a reason PLEASE speak up so that we
can discuss it and try figure out whether it is real or can be
gotten around in some manner.


Julian

 





To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0203061544020.37321-100000>