14 Jan, 2009

4 commits

  • Signed-off-by: Heiko Carstens

    Heiko Carstens
     
  • Signed-off-by: Heiko Carstens

    Heiko Carstens
     
  • Not a single architecture has wired up sys_pselect7 plus it is the
    only system call with seven parameters. Just make it static and
    rename it to do_pselect which will do the work for sys_pselect6.

    Signed-off-by: Heiko Carstens

    Heiko Carstens
     
  • Since we (Analog Devices) updated our Blackfin kernel to 2.6.28, we've
    seen occasional 5-second hangs from telnet. telnetd calls select with a
    NULL timeout, but with the new kernel, the system call occasionally
    returns 0, which causes telnet to call sleep (5). This did not happen
    with earlier kernels.

    The code in sys_pselect7 looks a bit strange, in particular the variable
    "to" is initialized to NULL, then changed if a non-null timeout was
    passed in, but not used further. It needs to be passed to
    core_sys_select instead of &end_time.

    This bug was introduced by 8ff3e8e85fa6c312051134b3953e397feb639f51
    ("select: switch select() and poll() over to hrtimers").

    Signed-off-by: Bernd Schmidt
    Reviewed-by: Ulrich Drepper
    Tested-by: Robin Getz
    Cc: stable@kernel.org
    Signed-off-by: Linus Torvalds

    Bernd Schmidt
     

07 Jan, 2009

1 commit

  • f_op->poll is the only vfs operation which is not allowed to sleep. It's
    because poll and select implementation used task state to synchronize
    against wake ups, which doesn't have to be the case anymore as wait/wake
    interface can now use custom wake up functions. The non-sleep restriction
    can be a bit tricky because ->poll is not called from an atomic context
    and the result of accidentally sleeping in ->poll only shows up as
    temporary busy looping when the timing is right or rather wrong.

    This patch converts poll/select to use custom wake up function and use
    separate triggered variable to synchronize against wake up events. The
    only added overhead is an extra function call during wake up and
    negligible.

    This patch removes the one non-sleep exception from vfs locking rules and
    is beneficial to userland filesystem implementations like FUSE, 9p or
    peculiar fs like spufs as it's very difficult for those to implement
    non-sleeping poll method.

    While at it, make the following cosmetic changes to make poll.h and
    select.c checkpatch friendly.

    * s/type * symbol/type *symbol/ : three places in poll.h
    * remove blank line before EXPORT_SYMBOL() : two places in select.c

    Oleg: spotted missing barrier in poll_schedule_timeout()
    Davide: spotted missing write barrier in pollwake()

    Signed-off-by: Tejun Heo
    Cc: Eric Van Hensbergen
    Cc: Ron Minnich
    Cc: Ingo Molnar
    Cc: Christoph Hellwig
    Signed-off-by: Miklos Szeredi
    Cc: Davide Libenzi
    Cc: Brad Boyer
    Cc: Al Viro
    Cc: Roland McGrath
    Cc: Mauro Carvalho Chehab
    Signed-off-by: Andrew Morton
    Cc: Davide Libenzi
    Cc: Oleg Nesterov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Tejun Heo
     

27 Oct, 2008

1 commit

  • Some userland apps seem to pass in a "0" for the seconds, and several
    seconds worth of usecs to select(). The old kernels accepted this just
    fine, so the new kernels must too.

    However, due to the upscaling of the microseconds to nanoseconds we had
    some cases where we got math overflow, and depending on the GCC version
    (due to inlining decisions) that actually resulted in an -EINVAL return.

    This patch fixes this by adding the excess microseconds to the seconds
    field.

    Also with thanks to Marcin Slusarz for spotting some implementation bugs
    in the diagnostics patches.

    Reported-by: Carlos R. Mafra
    Signed-off-by: Arjan van de Ven
    Signed-off-by: Linus Torvalds

    Arjan van de Ven
     

08 Sep, 2008

2 commits


06 Sep, 2008

3 commits

  • This patch makes the select() and poll() hrtimers use the new range
    feature and settings from the task struct.

    In addition, this includes the estimate_accuracy() function that Linus
    posted to lkml, but changed entirely based on other peoples lkml feedback.

    Signed-off-by: Arjan van de Ven

    Arjan van de Ven
     
  • With lots of help, input and cleanups from Thomas Gleixner

    This patch switches select() and poll() over to hrtimers.

    The core of the patch is replacing the "s64 timeout" with a
    "struct timespec end_time" in all the plumbing.

    But most of the diffstat comes from using the just introduced helpers:
    poll_select_set_timeout
    poll_select_copy_remaining
    timespec_add_safe
    which make manipulating the timespec easier and less error-prone.

    Signed-off-by: Arjan van de Ven
    Signed-off-by: Thomas Gleixner

    Arjan van de Ven
     
  • This patch adds 2 helpers that will be used for the hrtimer based select/poll:

    poll_select_set_timeout() is a helper that takes a timeout (as a second, nanosecond
    pair) and turns that into a "struct timespec" that represents the absolute end time.
    This is a common operation in the many select() and poll() variants and needs various,
    common, sanity checks.

    poll_select_copy_remaining() is a helper that takes care of copying the remaining
    time to userspace, as select(), pselect() and ppoll() do. This function comes in
    both a natural and a compat implementation (due to datastructure differences).

    Signed-off-by: Thomas Gleixner
    Signed-off-by: Arjan van de Ven

    Thomas Gleixner
     

23 Jun, 2008

1 commit

  • Christian Borntraeger reported that reinstating cond_resched() with
    CONFIG_PREEMPT caused a performance regression on lmbench:

    For example select file 500:
    23 microseconds
    32 microseconds

    and that's really because we totally unnecessarily do the cond_resched()
    in the innermost loop of select(), which is just silly.

    This moves it out from the innermost loop (which only ever loops ove the
    bits in a single "unsigned long" anyway), which makes the performance
    regression go away.

    Reported-and-tested-by: Christian Borntraeger
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

02 May, 2008

2 commits


30 Apr, 2008

2 commits

  • Change all the #ifdef TIF_RESTORE_SIGMASK conditionals in non-arch code to
    #ifdef HAVE_SET_RESTORE_SIGMASK. If arch code defines it first, the generic
    set_restore_sigmask() using TIF_RESTORE_SIGMASK is not defined.

    Signed-off-by: Roland McGrath
    Cc: Oleg Nesterov
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: Martin Schwidefsky
    Cc: Heiko Carstens
    Cc: "Luck, Tony"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Roland McGrath
     
  • This adds the set_restore_sigmask() inline in and
    replaces every set_thread_flag(TIF_RESTORE_SIGMASK) with a call to it. No
    change, but abstracts the details of the flag protocol from all the calls.

    Signed-off-by: Roland McGrath
    Cc: Oleg Nesterov
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: Martin Schwidefsky
    Cc: Heiko Carstens
    Cc: "Luck, Tony"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Roland McGrath
     

22 Apr, 2008

1 commit

  • These are small cleanups all over the tree.

    Trivial style and comment changes to
    fs/select.c, kernel/signal.c, kernel/stop_machine.c & mm/pdflush.c

    Signed-off-by: Pavel Machek
    Signed-off-by: Jesper Juhl

    Pavel Machek
     

07 Feb, 2008

1 commit

  • schedule_timeout(jiffies) waits for at least jiffies - 1. Add 1 jiffie to
    the timeout_jiffies calculated in sys_poll() to wait at least
    timeout_msecs, like poll() manpage says.

    Signed-off-by: Karsten Wiese
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: "H. Peter Anvin"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Karsten Wiese
     

20 Oct, 2007

1 commit


17 Oct, 2007

3 commits

  • Lomesh reported poll returning EINTR during suspend/resume cycle. This is
    caused by the STOP/CONT cycle that the freezer uses, generating a pending
    signal for what in effect is an ignored signal. In general poll is a
    little eager in returning EINTR, when it could try not bother userspace and
    simply restart the syscall. Both select and ppoll do use ERESTARTNOHAND to
    restart the syscall. Oleg points out that simply using ERESTARTNOHAND will
    cause poll to restart with original timeout value. which could ultimately
    lead to process never returning to userspace. Instead use
    ERESTART_RESTARTBLOCK, and restart poll with updated timeout value.
    Inspired by Manfred's use ERESTARTNOHAND in poll patch.

    [bunk@kernel.org: do_restart_poll() can become static]
    Cc: Manfred Spraul
    Cc: Oleg Nesterov
    Cc: Roland McGrath
    Cc: "Agarwal, Lomesh"
    Signed-off-by: Chris Wright
    Signed-off-by: Adrian Bunk
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Chris Wright
     
  • do_poll() checks signal_pending() but returns 0 when interrupted. This means
    the caller has to check signal_pending() again.

    Change it to return -EINTR when signal_pending() and count == 0.

    Signed-off-by: Oleg Nesterov
    Cc: Andi Kleen
    Cc: Davide Libenzi
    Cc: Vadim Lobanov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Oleg Nesterov
     
  • Cleanup. Lessens both the source and compiled code (100 bytes) and imho makes
    the code much more understandable.

    With this patch "struct poll_list *head" always points to on-stack stack_pps,
    so we can remove all "is it on-stack" and "was it initialized" checks.

    Also, move poll_initwait/poll_freewait and -EINTR detection closer to the
    do_poll()'s callsite.

    [akpm@linux-foundation.org: fix warning (size_t != uint)]
    Signed-off-by: Oleg Nesterov
    Looks-good-to: Andi Kleen
    Cc: Davide Libenzi
    Cc: Vadim Lobanov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Oleg Nesterov
     

12 Sep, 2007

1 commit

  • Taneli Vähäkangas reported that commit
    786d7e1612f0b0adb6046f19b906609e4fe8b1ba aka "Fix rmmod/read/write races
    in /proc entries" broke SBCL + SLIME combo.

    The old code in do_select() used DEFAULT_POLLMASK, if couldn't find
    ->poll handler. The new code makes ->poll always there and returns 0 by
    default, which is not correct. Return DEFAULT_POLLMASK instead.

    Steps to reproduce:

    install emacs, SBCL, SLIME
    emacs
    M-x slime in *inferior-lisp* buffer
    [watch it doing "Connecting to Swank on port X.."]

    Please, apply before 2.6.23.

    P.S.: why SBCL can't just read(2) /proc/cpuinfo is a mystery.

    Signed-off-by: Alexey Dobriyan
    Cc: T Taneli Vahakangas
    Cc: Oleg Nesterov
    Cc: "Eric W. Biederman"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alexey Dobriyan
     

09 May, 2007

3 commits


11 Dec, 2006

1 commit

  • Currently, each fdtable supports three dynamically-sized arrays of data: the
    fdarray and two fdsets. The code allows the number of fds supported by the
    fdarray (fdtable->max_fds) to differ from the number of fds supported by each
    of the fdsets (fdtable->max_fdset).

    In practice, it is wasteful for these two sizes to differ: whenever we hit a
    limit on the smaller-capacity structure, we will reallocate the entire fdtable
    and all the dynamic arrays within it, so any delta in the memory used by the
    larger-capacity structure will never be touched at all.

    Rather than hogging this excess, we shouldn't even allocate it in the first
    place, and keep the capacities of the fdarray and the fdsets equal. This
    patch removes fdtable->max_fdset. As an added bonus, most of the supporting
    code becomes simpler.

    Signed-off-by: Vadim Lobanov
    Cc: Christoph Hellwig
    Cc: Al Viro
    Cc: Dipankar Sarma
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Vadim Lobanov
     

30 Sep, 2006

1 commit

  • POSIX states that poll() shall fail with EINVAL if nfds > OPEN_MAX. In
    this context, POSIX is referring to sysconf(OPEN_MAX), which is the value
    of current->signal->rlim[RLIMIT_NOFILE].rlim_cur in the linux kernel, not
    the compile-time constant which happens to also be named OPEN_MAX. In the
    current code, an application may poll up to max_fdset file descriptors,
    even if this exceeds RLIMIT_NOFILE. The current code also breaks
    applications which poll more than max_fdset descriptors, which worked circa
    2.4.18 when the check was against NR_OPEN, which is 1024*1024. This patch
    enforces the limit precisely as POSIX defines, even if RLIMIT_NOFILE has
    been changed at run time with ulimit -n.

    To elaborate on the rationale for this, there are three cases:

    1) RLIMIT_NOFILE is at the default value of 1024

    In this (default) case, the patch changes nothing. Calls with nfds > 1024
    fail with EINVAL both before and after the patch, and calls with nfds
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Chris Snook
     

26 Jun, 2006

1 commit

  • If you do a poll() call with timeout -1, the wait will be a big number
    (depending on HZ) instead of infinite wait, since -1 is passed to the
    msecs_to_jiffies function.

    Signed-off-by: Frode Isaksen
    Acked-by: Nishanth Aravamudan
    Cc: David Woodhouse
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Frode Isaksen
     

23 Jun, 2006

1 commit

  • The "count" and "pt" variables are declared and modified by do_poll(), as
    well as accessed and written indirectly in the do_pollfd() subroutine.

    This patch pulls all handling of these variables into the do_poll()
    function, thereby eliminating the odd use of indirection in do_pollfd().
    This is done by pulling the "struct pollfd" traversal loop from do_pollfd()
    into its only caller do_poll(). As an added bonus, the patch saves a few
    clock cycles, and also adds comments to make the code easier to follow.

    Signed-off-by: Vadim Lobanov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Vadim Lobanov
     

11 Apr, 2006

2 commits

  • If SELECT_STACK_ALLOC is not a multiple of sizeof(long) then stack_fds[]
    would be shorter than SELECT_STACK_ALLOC bytes and could overflow later in
    the function. Fixed by simply rearranging the test later to work on
    sizeof(stack_fds) Currently SELECT_STACK_ALLOC is 256 so this doesn't
    happen, but it's nasty to have things like this hidden in the code. What
    if later someone decides to change SELECT_STACK_ALLOC to 300?

    Signed-off-by: Mitchell Blank Jr
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mitchell Blank Jr
     
  • fs/select.c: In function `core_sys_select':
    fs/select.c:339: warning: assignment from incompatible pointer type
    fs/select.c:376: warning: comparison of distinct pointer types lacks a cast

    By using a void* we can remove lots of casts rather than adding more.

    Cc: Jes Sorensen
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrew Morton
     

01 Apr, 2006

1 commit

  • Commit 70674f95c0a2ea694d5c39f4e514f538a09be36f:

    [PATCH] Optimize select/poll by putting small data sets on the stack

    resulted in the poll stack being 4-byte aligned on 64-bit architectures,
    causing misaligned accesses to elements in the array.

    This patch fixes it by declaring the stack in terms of 'long' instead
    of 'char'.

    Force alignment of poll and select stacks to long to avoid unaligned
    access on 64 bit architectures.

    Signed-off-by: Jes Sorensen
    Signed-off-by: Linus Torvalds

    Jes Sorensen
     

29 Mar, 2006

3 commits

  • Mark the f_ops members of inodes as const, as well as fix the
    ripple-through this causes by places that copy this f_ops and then "do
    stuff" with it.

    Signed-off-by: Arjan van de Ven
    Signed-off-by: Alexey Dobriyan
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Arjan van de Ven
     
  • Cc: Andi Kleen
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric Dumazet
     
  • Optimize select and poll by a using stack space for small fd sets

    This brings back an old optimization from Linux 2.0. Using the stack is
    faster than kmalloc. On a Intel P4 system it speeds up a select of a
    single pty fd by about 13% (~4000 cycles -> ~3500)

    It also saves memory because a daemon hanging in select or poll will
    usually save one or two less pages. This can add up - e.g. if you have 10
    daemons blocking in poll/select you save 40KB of memory.

    I did a patch for this long ago, but it was never applied. This version is
    a reimplementation of the old patch that tries to be less intrusive. I
    only did the minimal changes needed for the stack allocation.

    The cut off point before external memory is allocated is currently at
    832bytes. The system calls always allocate this much memory on the stack.

    These 832 bytes are divided into 256 bytes frontend data (for the select
    bitmaps of the pollfds) and the rest of the space for the wait queues used
    by the low level drivers. There are some extreme cases where this won't
    work out for select and it falls back to allocating memory too early -
    especially with very sparse large select bitmaps - but the majority of
    processes who only have a small number of file descriptors should be ok.
    [TBD: 832/256 might not be the best split for select or poll]

    I suspect more optimizations might be possible, but they would be more
    complicated. One way would be to cache the select/poll context over
    multiple system calls because typically the input values should be similar.
    Problem is when to flush the file descriptors out though.

    Signed-off-by: Andi Kleen
    Cc: Eric Dumazet
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andi Kleen
     

18 Feb, 2006

1 commit

  • I got all of these backwards. We want to return

    min(input timeout, new timeout)

    to userspace to prevent increasing the time-remaining value.

    Thanks to Ernst Herzberg for reporting and diagnosing.

    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrew Morton
     

12 Feb, 2006

1 commit

  • With David Woodhouse

    select() presently has a habit of increasing the value of the user's
    `timeout' argument on return.

    We were writing back a timeout larger than the original. We _deliberately_
    round up, since we know we must wait at _least_ as long as the caller asks
    us to.

    The patch adds a couple of helper functions for magnitude comparison of
    timespecs and of timevals, and uses them to prevent the various poll and
    select functions from returning a timeout which is larger than the one which
    was passed in.

    The patch also fixes a bug in compat_sys_pselect7(): it was adding the new
    timeout value to the old one and was returning that. It should just return
    the new timeout value.

    (We have various handy timespec/timeval-to-from-nsec conversion functions in
    time.h. But this code open-codes it all).

    Cc: "David S. Miller"
    Cc: Andi Kleen
    Cc: Ulrich Drepper
    Cc: Thomas Gleixner
    Cc: george anzinger
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrew Morton
     

08 Feb, 2006

1 commit


19 Jan, 2006

1 commit

  • The following implementation of ppoll() and pselect() system calls
    depends on the architecture providing a TIF_RESTORE_SIGMASK flag in the
    thread_info.

    These system calls have to change the signal mask during their
    operation, and signal handlers must be invoked using the new, temporary
    signal mask. The old signal mask must be restored either upon successful
    exit from the system call, or upon returning from the invoked signal
    handler if the system call is interrupted. We can't simply restore the
    original signal mask and return to userspace, since the restored signal
    mask may actually block the signal which interrupted the system call.

    The TIF_RESTORE_SIGMASK flag deals with this by causing the syscall exit
    path to trap into do_signal() just as TIF_SIGPENDING does, and by
    causing do_signal() to use the saved signal mask instead of the current
    signal mask when setting up the stack frame for the signal handler -- or
    by causing do_signal() to simply restore the saved signal mask in the
    case where there is no handler to be invoked.

    The first patch implements the sys_pselect() and sys_ppoll() system
    calls, which are present only if TIF_RESTORE_SIGMASK is defined. That
    #ifdef should go away in time when all architectures have implemented
    it. The second patch implements TIF_RESTORE_SIGMASK for the PowerPC
    kernel (in the -mm tree), and the third patch then removes the
    arch-specific implementations of sys_rt_sigsuspend() and replaces them
    with generic versions using the same trick.

    The fourth and fifth patches, provided by David Howells, implement
    TIF_RESTORE_SIGMASK for FR-V and i386 respectively, and the sixth patch
    adds the syscalls to the i386 syscall table.

    This patch:

    Add the pselect() and ppoll() system calls, providing core routines usable by
    the original select() and poll() system calls and also the new calls (with
    their semantics w.r.t timeouts).

    Signed-off-by: David Woodhouse
    Cc: Michael Kerrisk
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Woodhouse