From: Tobias Bading <tbading@web.de>
To: emacs-devel@gnu.org
Subject: Re: Syscalls stat() and faccessat() sometimes fail with errno EINTR when accessing SMB share through VPN
Date: Fri, 12 Feb 2021 19:46:03 +0100 [thread overview]
Message-ID: <9c207d94-4970-95c5-7234-e5d7f2ee62b2@web.de> (raw)
In-Reply-To: <ad33cb5a-b4f0-f6e2-2851-bb49323021b6@web.de>
I've placed 22 TEMP_FAILURE_RETRY() macros around the 14 stat() and 8
faccessat() calls in dired.c, fileio.c, filelock.c, lread.c, process.c,
and sysdep.c. So far this band-aid seems to circumvent the problem, but
I still have no idea whether those calls are even permitted to fail with
errno EINTR.
Tobias
---
On 12.02.21 16:24, Tobias Bading wrote:
> Ok, the grep -A2 wasn't that bright XD. With -C2 I just got
>
> 16:19:23.935175 --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
> 16:19:23.937296 faccessat(AT_FDCWD, "/smb/server/share/dir/", F_OK) =
> -1 EINTR (Interrupted system call)
> [...]
> 16:19:34.191156 --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
> 16:19:34.192562 stat("/smb/server/share/dir/subdir", 0x7fff40feb5c0) =
> -1 EINTR (Interrupted system call)
> [...]
> 16:19:39.358023 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED,
> si_pid=68151, si_uid=501, si_status=0, si_utime=1, si_stime=1} ---
> 16:19:39.358477 stat("/smb/server/share/dir", 0x7fff40fea8b0) = -1
> EINTR (Interrupted system call)
> [...]
> 16:20:01.111670 --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
> 16:20:01.113070 stat("/smb/server/share/dir/subdir", 0x7fff40feb5c0) =
> -1 EINTR (Interrupted system call)
> [...]
> 16:20:05.519682 --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
> 16:20:05.520931 stat("/smb/server/share/dir/subdir", 0x7fff40feb5c0) =
> -1 EINTR (Interrupted system call)
>
> which makes a bit more sense I guess.
>
> Tobias
>
> ---
>
> On 12.02.21 16:11, Tobias Bading wrote:
>> Hi.
>>
>> Everyone doing alright hacking/working from home?
>>
>> Yesterday I encountered a curious problem while using (a self-built)
>> Emacs 26.3.50 on my GNU/Linux machine at home:
>>
>> I've set up the automounter to mount SMB shares of Windows servers in
>> the office through the company's VPN. This works fine for e.g. "ls
>> -lR /smb/server/share/dir" in a shell, except for bad performance.
>> The problems start when I try to work with the same directory from
>> within Emacs with dired-mode, i.e. a simple C-x C-f
>> /smb/server/share/dir. Quite regularly I get errors like
>> "dired-get-file-for-visit: File no longer exists; type ‘g’ to update
>> Dired buffer", although nothing has changed in the directory.
>>
>> So I put Emacs under a microscope with
>>
>> strace -f -e trace=%file -tt emacs 2>&1 | grep --line-buffered -A2
>> /smb/ >emacs.log
>>
>> which revealed errors like
>>
>> faccessat(AT_FDCWD, "/smb/server/share/dir", F_OK) = -1 EINTR
>> (Interrupted system call)
>> --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>> [...]
>> stat("/smb/server/share/dir", 0x7fffe49383b0) = -1 EINTR (Interrupted
>> system call)
>> --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>> --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>>
>> (The timestamps of the SIGIO lines suggest that these signals have
>> nothing to do with the EINTR errors reported beforehand, the
>> timestamps are often over 0.1 seconds apart.)
>>
>> So far I've only seen stat() and faccessat() failing with EINTR. The
>> funny thing is, the man pages of those two system calls don't mention
>> EINTR at all. man signal(7) also doesn't mention these functions in
>> the paragraph about SA_RESTART. Anyway, I've checked the source code
>> of my Emacs 26.3.50 build and found emacs_sigaction_flags() in
>> src/sysdep.c, which does return 0 (as intended by the dev(s) who
>> wrote the code). I've changed the implementation to "return
>> SA_RESTART;", but that had no effect.
>>
>> To make sure I didn't mess up my own Emacs 26 git branch somehow, I
>> did a quick test with the current HEAD of origin/master and
>> "src/emacs -Q", which seems to have the same problem, revealed by
>> error messages like "apply: Setting current directory: Interrupted
>> system call, /smb/server/share/dir/".
>>
>> I'm stumped. A (shell-command "ls -lAFNR /smb/server/share/big-dir/")
>> works fine, as does a "cp -a" of that directory. But when the Emacs
>> process itself calls stat() or faccessat(), things go sideways? Why?
>> What am I missing? Are stat() and faccessat() even allowed to fail
>> with EINTR? Is this a kernel bug, maybe somewhere in the CIFS client
>> implementation? But an strace of "ls -lAFNR
>> /smb/server/share/big-dir/" shows not a single EINTR! So why would
>> only Emacs be affected?
>>
>> Please enlighten me... ;)
>>
>> Tobias
>>
>
next prev parent reply other threads:[~2021-02-12 18:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-12 15:11 Syscalls stat() and faccessat() sometimes fail with errno EINTR when accessing SMB share through VPN Tobias Bading
2021-02-12 15:24 ` Tobias Bading
2021-02-12 18:46 ` Tobias Bading [this message]
2021-02-14 11:23 ` Tobias Bading
2021-02-14 17:59 ` Matt Armstrong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9c207d94-4970-95c5-7234-e5d7f2ee62b2@web.de \
--to=tbading@web.de \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.