Re: [PATCH] compatibility syscall layer (lets try again)

From: Linus Torvalds (torvalds@transmeta.com)
Date: Wed Dec 04 2002 - 19:18:39 EST


On Wed, 4 Dec 2002, Jim Houston wrote:
>
> Agreed! In my alternative version of the Posix timers patch, I avoid
> calling do_signal() from clock_nanosleep by using a variant of the
> existing ERESTARTNOHAND mechanism. The problem I ran into was that I
> could not tell on entry to clock_nanosleep if it was a new call or
> an old one being restarted.

Restarting has other problems too, namely how to save off the partial
results.

> I solved this by adding a new
> ERESTARTNANOSLP error code and making a small change in do_signal().
> The handling of ERESTARTNANOSLP is the same as ERESTARTNOHAND but also
> sets a new flag in the task_struct before restarting the system call.

The problem I see with this is that the signal handler can do a
"siglongjump()" out of the regular path, and the next system call may well
be a _new_ nanosleep() that has nothing to do with the old one. And
realizing that it's _not_ a restarted one is interesting.

A better and more flexible approach would be to not restart the same
system call with the same parameters, but having some way of telling
do_signal to restart with new parameters and a new system call number.

For example, it shouldn't be impossible to have an interface more akin to

        ...
        thread_info->restart_block.syscall = __NR_nanosleep_restart;
        thread_info->restart_block.arg0 = timeout + jiffies; /* absolute time */
        return -ERESTARTSYS_RESTARTBLOCK;

where the signal stack stuff re-writes not just eip (like the current
restart logic does), but also rewrites the system call number and the
argument registers.

This way you can get a truly restartable system call, because the
arguments really need to be fundamentally changed (the restarted system
call had better have _absolute_ time, not relative time, since we don't
know how much time passed before it got restarted).

                Linus

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Dec 07 2002 - 22:00:20 EST