How about adding the attached text to the Documentation directory? I
had to correct over the years to one or the other system call design
problems. Other problems couldn't be corrected anymore and we have to
live with them. Maybe spelling out the rules explicitly will help a bit.
I've added a few rules I could think of right now. What should be
added as well is a rule for 64-bit parameters on 32-bit platforms. I
leave this to the s390 people who have the biggest restrictions when
it comes to this.
Signed-off-by: Ulrich Drepper <drepper@redhat.com>
Rules for designing new system calls
------------------------------------
1. Do not use multiplexing system calls.
A practical argument is that it invariably reduces the number of
available parameters to the system call which will haunt people who
have to care about architectures with a limited set of registers
reserved for this purpose.
Another aspect is that it is most likely slower. The caller in
most cases knows exactly which sub-function of the system call is
needed. If the decision about the sub-function is dynamic the
computation of the code could just as well be a computation of a
system call number. The difference lies in the kernel where the
multiplexing always has to happen, even if the required
sub-function is known to the caller ahead of time.
Adding new system calls is much cheaper: it is a word in a table.
This is much less code and data than the switch statement or
if-cascade needed to implement the multiplexer.
Bad examples: sys_socketcall on x86, sys_futex, and several more
2. Use of ENOSYS:
The runtime has to be able to distinguish non-existing system calls
due to old kernel versions from error conditions in an implemented
system call. This means the ENOSYS error should never be used in
an error condition once a system call is implemented.
Example: In sys_fallocate, if the file system does not implement the
falloca...