* Re: Unkillable process in last git -- 100% reproducible
[not found] <20060628142918.1b2c25c3@localhost>
@ 2006-06-28 12:53 ` Paolo Ornati
2006-06-28 13:09 ` Paolo Ornati
0 siblings, 1 reply; 8+ messages in thread
From: Paolo Ornati @ 2006-06-28 12:53 UTC (permalink / raw)
To: Paolo Ornati; +Cc: Linux Kernel Mailing List
On Wed, 28 Jun 2006 14:29:18 +0200
Paolo Ornati <ornati@fastwebnet.it> wrote:
> [ 430.083347] localedef R running task 0 8577 8558 8578 (NOTLB)
> [ 430.083352] gzip X ffff81001e612ee0 0 8578 8577 (L-TLB)
> [ 430.083358] ffff81001395bef8 ffff81001fd1a310 0000000000000246 ffff81001e612ee0
> [ 430.083362] ffff81001e4c0080 ffff81001e612ee0 ffff81001e4c0258 0000000000000001
> [ 430.083366] 0000000000000046 0000000000000046 ffff81001395bf18 0000000000000010
> [ 430.083370] Call Trace: <ffffffff80227f6f>{do_exit+2378} <ffffffff802628e9>{vfs_write+288}
> [ 430.083379] <ffffffff80228065>{sys_exit_group+0} <ffffffff80209806>{system_call+126}
do_exit() -- kernel/exit.c
0xffffffff80227f66 <do_exit+2369>: mov %rax,0x18(%rbp)
0xffffffff80227f6a <do_exit+2373>: callq 0xffffffff8048b850 <schedule>
0xffffffff80227f6f <do_exit+2378>: ud2a
0xffffffff80227f71 <do_exit+2380>: pushq $0xffffffff804b7821
0xffffffff80227f76 <do_exit+2385>: retq $0x3ba
0xffffffff80227f79 <do_exit+2388>: jmp 0xffffffff80227f79 <do_exit+2388>
--
Paolo Ornati
Linux 2.6.17-ga39727f2-dirty on x86_64
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Unkillable process in last git -- 100% reproducible
2006-06-28 12:53 ` Unkillable process in last git -- 100% reproducible Paolo Ornati
@ 2006-06-28 13:09 ` Paolo Ornati
2006-06-28 13:19 ` Paolo Ornati
0 siblings, 1 reply; 8+ messages in thread
From: Paolo Ornati @ 2006-06-28 13:09 UTC (permalink / raw)
To: Paolo Ornati; +Cc: Linux Kernel Mailing List
On Wed, 28 Jun 2006 14:53:49 +0200
Paolo Ornati <ornati@fastwebnet.it> wrote:
> > [ 430.083347] localedef R running task 0 8577 8558 8578 (NOTLB)
> > [ 430.083352] gzip X ffff81001e612ee0 0 8578 8577 (L-TLB)
> > [ 430.083358] ffff81001395bef8 ffff81001fd1a310 0000000000000246 ffff81001e612ee0
> > [ 430.083362] ffff81001e4c0080 ffff81001e612ee0 ffff81001e4c0258 0000000000000001
> > [ 430.083366] 0000000000000046 0000000000000046 ffff81001395bf18 0000000000000010
> > [ 430.083370] Call Trace: <ffffffff80227f6f>{do_exit+2378} <ffffffff802628e9>{vfs_write+288}
> > [ 430.083379] <ffffffff80228065>{sys_exit_group+0} <ffffffff80209806>{system_call+126}
>
> do_exit() -- kernel/exit.c
>
> 0xffffffff80227f66 <do_exit+2369>: mov %rax,0x18(%rbp)
> 0xffffffff80227f6a <do_exit+2373>: callq 0xffffffff8048b850 <schedule>
> 0xffffffff80227f6f <do_exit+2378>: ud2a
> 0xffffffff80227f71 <do_exit+2380>: pushq $0xffffffff804b7821
> 0xffffffff80227f76 <do_exit+2385>: retq $0x3ba
> 0xffffffff80227f79 <do_exit+2388>: jmp 0xffffffff80227f79 <do_exit+2388>
that is the end of the function:
...
schedule();
BUG();
/* Avoid "noreturn function does return". */
for (;;) ;
}
So the questions are two:
1) why schedule() didn't work?
2) why the process is looping around "ud2a" (placed by BUG()) and
presumibly throwing a lot of "invalid opcode" exceptions?
--
Paolo Ornati
Linux 2.6.17-ga39727f2-dirty on x86_64
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Unkillable process in last git -- 100% reproducible
2006-06-28 13:09 ` Paolo Ornati
@ 2006-06-28 13:19 ` Paolo Ornati
2006-06-28 18:38 ` Unkillable process in last git -- Bisected Paolo Ornati
0 siblings, 1 reply; 8+ messages in thread
From: Paolo Ornati @ 2006-06-28 13:19 UTC (permalink / raw)
To: Paolo Ornati; +Cc: Linux Kernel Mailing List
[-- Attachment #1: Type: text/plain, Size: 2280 bytes --]
On Wed, 28 Jun 2006 15:09:43 +0200
Paolo Ornati <ornati@fastwebnet.it> wrote:
> On Wed, 28 Jun 2006 14:53:49 +0200
> Paolo Ornati <ornati@fastwebnet.it> wrote:
>
> > > [ 430.083347] localedef R running task 0 8577 8558 8578 (NOTLB)
> > > [ 430.083352] gzip X ffff81001e612ee0 0 8578 8577 (L-TLB)
> > > [ 430.083358] ffff81001395bef8 ffff81001fd1a310 0000000000000246 ffff81001e612ee0
> > > [ 430.083362] ffff81001e4c0080 ffff81001e612ee0 ffff81001e4c0258 0000000000000001
> > > [ 430.083366] 0000000000000046 0000000000000046 ffff81001395bf18 0000000000000010
> > > [ 430.083370] Call Trace: <ffffffff80227f6f>{do_exit+2378} <ffffffff802628e9>{vfs_write+288}
> > > [ 430.083379] <ffffffff80228065>{sys_exit_group+0} <ffffffff80209806>{system_call+126}
> >
> > do_exit() -- kernel/exit.c
> >
> > 0xffffffff80227f66 <do_exit+2369>: mov %rax,0x18(%rbp)
> > 0xffffffff80227f6a <do_exit+2373>: callq 0xffffffff8048b850 <schedule>
> > 0xffffffff80227f6f <do_exit+2378>: ud2a
> > 0xffffffff80227f71 <do_exit+2380>: pushq $0xffffffff804b7821
> > 0xffffffff80227f76 <do_exit+2385>: retq $0x3ba
> > 0xffffffff80227f79 <do_exit+2388>: jmp 0xffffffff80227f79 <do_exit+2388>
>
>
> that is the end of the function:
>
> ...
> schedule();
> BUG();
> /* Avoid "noreturn function does return". */
> for (;;) ;
> }
>
>
> So the questions are two:
>
> 1) why schedule() didn't work?
>
> 2) why the process is looping around "ud2a" (placed by BUG()) and
> presumibly throwing a lot of "invalid opcode" exceptions?
It seems that the first mail didn't hit LKML (maybe it was too big),
here it is (stripped):
------------------------------------------------------------------------
Running "localedef" triggers an infinite loop in kernel mode (or
something) --> localdef becomes unkillable.
This is dmesg after pressing ALT+SysRQ+T three times:
[CUT]
KERNEL:
--
Paolo Ornati
Linux 2.6.17-ga39727f2-dirty on x86_64
^^^^^^^
The -dirty is because of a fix to PS2 Keyboard auto-repeat, nothing else.
------------------------------------------------------------------------
Full config attached.
[-- Attachment #2: config.gz --]
[-- Type: application/x-gzip, Size: 8546 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Unkillable process in last git -- Bisected
2006-06-28 13:19 ` Paolo Ornati
@ 2006-06-28 18:38 ` Paolo Ornati
2006-06-28 19:06 ` Vladimir V. Saveliev
2006-06-29 5:20 ` Andrew Morton
0 siblings, 2 replies; 8+ messages in thread
From: Paolo Ornati @ 2006-06-28 18:38 UTC (permalink / raw)
To: Paolo Ornati
Cc: Linux Kernel Mailing List, vs, Neil Brown, Martin Schwidefsky,
stable
On Wed, 28 Jun 2006 15:19:55 +0200
Paolo Ornati <ornati@fastwebnet.it> wrote:
> > > > [ 430.083347] localedef R running task 0 8577 8558 8578 (NOTLB)
> > > > [ 430.083352] gzip X ffff81001e612ee0 0 8578 8577 (L-TLB)
> > > > [ 430.083358] ffff81001395bef8 ffff81001fd1a310 0000000000000246 ffff81001e612ee0
> > > > [ 430.083362] ffff81001e4c0080 ffff81001e612ee0 ffff81001e4c0258 0000000000000001
> > > > [ 430.083366] 0000000000000046 0000000000000046 ffff81001395bf18 0000000000000010
> > > > [ 430.083370] Call Trace: <ffffffff80227f6f>{do_exit+2378} <ffffffff802628e9>{vfs_write+288}
> > > > [ 430.083379] <ffffffff80228065>{sys_exit_group+0} <ffffffff80209806>{system_call+126}
> > >
> > > do_exit() -- kernel/exit.c
> > >
> > > 0xffffffff80227f66 <do_exit+2369>: mov %rax,0x18(%rbp)
> > > 0xffffffff80227f6a <do_exit+2373>: callq 0xffffffff8048b850 <schedule>
> > > 0xffffffff80227f6f <do_exit+2378>: ud2a
> > > 0xffffffff80227f71 <do_exit+2380>: pushq $0xffffffff804b7821
> > > 0xffffffff80227f76 <do_exit+2385>: retq $0x3ba
> > > 0xffffffff80227f79 <do_exit+2388>: jmp 0xffffffff80227f79 <do_exit+2388>
> >
> >
> > that is the end of the function:
> >
> > ...
> > schedule();
> > BUG();
> > /* Avoid "noreturn function does return". */
> > for (;;) ;
> > }
> >
> >
> > So the questions are two:
> >
> > 1) why schedule() didn't work?
> >
> > 2) why the process is looping around "ud2a" (placed by BUG()) and
> > presumibly throwing a lot of "invalid opcode" exceptions?
>
> It seems that the first mail didn't hit LKML (maybe it was too big),
> here it is (stripped):
>
> ------------------------------------------------------------------------
> Running "localedef" triggers an infinite loop in kernel mode (or
> something) --> localdef becomes unkillable.
>
> This is dmesg after pressing ALT+SysRQ+T three times:
>
> [CUT]
>
> KERNEL:
>
> --
> Paolo Ornati
> Linux 2.6.17-ga39727f2-dirty on x86_64
> ^^^^^^^
>
> The -dirty is because of a fix to PS2 Keyboard auto-repeat, nothing else.
> ------------------------------------------------------------------------
Hi everybody,
as you can see from the subject the problem is an unkillable process
(localedef) that eats 100% CPU (the system is usable however).
After a git-bisect session I've found that reverting the following
commit fixes the problem.
Any idea?
commit 6527c2bdf1f833cc18e8f42bd97973d583e4aa83
Author: Vladimir V. Saveliev <vs@namesys.com>
Date: Tue Jun 27 02:53:57 2006 -0700
[PATCH] generic_file_buffered_write(): deadlock on vectored write
generic_file_buffered_write() prefaults in user pages in order to avoid
deadlock on copying from the same page as write goes to.
However, it looks like there is a problem when write is vectored:
fault_in_pages_readable brings in current segment or its part (maxlen).
OTOH, filemap_copy_from_user_iovec is called to copy number of bytes
(bytes) which may exceed current segment, so filemap_copy_from_user_iovec
switches to the next segment which is not brought in yet. Pagefault is
generated. That causes the deadlock if pagefault is for the same page
write goes to: page being written is locked and not uptodate, pagefault
will deadlock trying to lock locked page.
[akpm@osdl.org: somewhat rewritten]
Cc: Neil Brown <neilb@suse.de>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff --git a/mm/filemap.c b/mm/filemap.c
index 9c7334b..d504d6e 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2095,14 +2095,21 @@ generic_file_buffered_write(struct kiocb
do {
unsigned long index;
unsigned long offset;
- unsigned long maxlen;
size_t copied;
offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */
index = pos >> PAGE_CACHE_SHIFT;
bytes = PAGE_CACHE_SIZE - offset;
- if (bytes > count)
- bytes = count;
+
+ /* Limit the size of the copy to the caller's write size */
+ bytes = min(bytes, count);
+
+ /*
+ * Limit the size of the copy to that of the current segment,
+ * because fault_in_pages_readable() doesn't know how to walk
+ * segments.
+ */
+ bytes = min(bytes, cur_iov->iov_len - iov_base);
/*
* Bring in the user page that we will copy from _first_.
@@ -2110,10 +2117,7 @@ generic_file_buffered_write(struct kiocb
* same page as we're writing to, without it being marked
* up-to-date.
*/
- maxlen = cur_iov->iov_len - iov_base;
- if (maxlen > bytes)
- maxlen = bytes;
- fault_in_pages_readable(buf, maxlen);
+ fault_in_pages_readable(buf, bytes);
page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
if (!page) {
--
Paolo Ornati
Linux 2.6.17.1 on x86_64
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: Unkillable process in last git -- Bisected
2006-06-28 18:38 ` Unkillable process in last git -- Bisected Paolo Ornati
@ 2006-06-28 19:06 ` Vladimir V. Saveliev
2006-06-28 20:14 ` Paolo Ornati
2006-06-29 5:20 ` Andrew Morton
1 sibling, 1 reply; 8+ messages in thread
From: Vladimir V. Saveliev @ 2006-06-28 19:06 UTC (permalink / raw)
To: Paolo Ornati
Cc: Linux Kernel Mailing List, Neil Brown, Martin Schwidefsky, stable
Hello
On Wed, 2006-06-28 at 20:38 +0200, Paolo Ornati wrote:
> > Running "localedef" triggers an infinite loop in kernel mode (or
> > something) --> localdef becomes unkillable.
> >
Can you, please, run localedef under strace -e set=open,write on a
kernel having the below patch applied, so that we will see arguments of
write which caused write to fall into endless loop.
> commit 6527c2bdf1f833cc18e8f42bd97973d583e4aa83
> Author: Vladimir V. Saveliev <vs@namesys.com>
> Date: Tue Jun 27 02:53:57 2006 -0700
>
> [PATCH] generic_file_buffered_write(): deadlock on vectored write
>
> generic_file_buffered_write() prefaults in user pages in order to avoid
> deadlock on copying from the same page as write goes to.
>
> However, it looks like there is a problem when write is vectored:
> fault_in_pages_readable brings in current segment or its part (maxlen).
> OTOH, filemap_copy_from_user_iovec is called to copy number of bytes
> (bytes) which may exceed current segment, so filemap_copy_from_user_iovec
> switches to the next segment which is not brought in yet. Pagefault is
> generated. That causes the deadlock if pagefault is for the same page
> write goes to: page being written is locked and not uptodate, pagefault
> will deadlock trying to lock locked page.
>
> [akpm@osdl.org: somewhat rewritten]
> Cc: Neil Brown <neilb@suse.de>
> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
> Cc: <stable@kernel.org>
> Signed-off-by: Andrew Morton <akpm@osdl.org>
> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
>
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 9c7334b..d504d6e 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -2095,14 +2095,21 @@ generic_file_buffered_write(struct kiocb
> do {
> unsigned long index;
> unsigned long offset;
> - unsigned long maxlen;
> size_t copied;
>
> offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */
> index = pos >> PAGE_CACHE_SHIFT;
> bytes = PAGE_CACHE_SIZE - offset;
> - if (bytes > count)
> - bytes = count;
> +
> + /* Limit the size of the copy to the caller's write size */
> + bytes = min(bytes, count);
> +
> + /*
> + * Limit the size of the copy to that of the current segment,
> + * because fault_in_pages_readable() doesn't know how to walk
> + * segments.
> + */
> + bytes = min(bytes, cur_iov->iov_len - iov_base);
>
> /*
> * Bring in the user page that we will copy from _first_.
> @@ -2110,10 +2117,7 @@ generic_file_buffered_write(struct kiocb
> * same page as we're writing to, without it being marked
> * up-to-date.
> */
> - maxlen = cur_iov->iov_len - iov_base;
> - if (maxlen > bytes)
> - maxlen = bytes;
> - fault_in_pages_readable(buf, maxlen);
> + fault_in_pages_readable(buf, bytes);
>
> page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
> if (!page) {
>
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Unkillable process in last git -- Bisected
2006-06-28 19:06 ` Vladimir V. Saveliev
@ 2006-06-28 20:14 ` Paolo Ornati
0 siblings, 0 replies; 8+ messages in thread
From: Paolo Ornati @ 2006-06-28 20:14 UTC (permalink / raw)
To: Vladimir V. Saveliev
Cc: Linux Kernel Mailing List, Neil Brown, Martin Schwidefsky, stable
On Wed, 28 Jun 2006 23:06:17 +0400
"Vladimir V. Saveliev" <vs@namesys.com> wrote:
> On Wed, 2006-06-28 at 20:38 +0200, Paolo Ornati wrote:
> > > Running "localedef" triggers an infinite loop in kernel mode (or
> > > something) --> localdef becomes unkillable.
> > >
>
> Can you, please, run localedef under strace -e set=open,write on a
> kernel having the below patch applied, so that we will see arguments of
> write which caused write to fall into endless loop.
The full strace is short enough, I think:
$ strace localedef --no-archive -c -i en_US -f ISO-8859-1 -A /usr/share/locale/locale.alias en_US
execve("/usr/bin/localedef", ["localedef", "--no-archive", "-c", "-i", "en_US", "-f", "ISO-8859-1", "-A", "/usr/share/locale/locale.alias", "en_US"], [/* 44 vars */]) = 0
uname({sys="Linux", node="tux", ...}) = 0
brk(0) = 0x549000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f18098000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=163137, ...}) = 0
mmap(NULL, 163137, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b0f18099000
close(3) = 0
open("/lib/tls/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\306"..., 640) = 640
lseek(3, 64, SEEK_SET) = 64
read(3, "\6\0\0\0\5\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0"..., 616) = 616
lseek(3, 680, SEEK_SET) = 680
read(3, "\4\0\0\0\20\0\0\0\1\0\0\0GNU\0\0\0\0\0\2\0\0\0\6\0\0\0"..., 32) = 32
fstat(3, {st_mode=S_IFREG|0755, st_size=1268224, ...}) = 0
lseek(3, 64, SEEK_SET) = 64
read(3, "\6\0\0\0\5\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0"..., 616) = 616
mmap(NULL, 2261000, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2b0f1819a000
madvise(0x2b0f1819a000, 2261000, MADV_SEQUENTIAL|0x1) = 0
mprotect(0x2b0f182b9000, 1085448, PROT_NONE) = 0
mmap(0x2b0f183b8000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x11e000) = 0x2b0f183b8000
mmap(0x2b0f183be000, 16392, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b0f183be000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f183c3000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f183c4000
mprotect(0x2b0f183b8000, 12288, PROT_READ) = 0
mprotect(0x2b0f18198000, 4096, PROT_READ) = 0
arch_prctl(ARCH_SET_FS, 0x2b0f183c3ae0) = 0
munmap(0x2b0f18099000, 163137) = 0
open("/dev/urandom", O_RDONLY) = 3
read(3, "\363\300\254\335\34A\365\327", 8) = 8
close(3) = 0
brk(0) = 0x549000
brk(0x56a000) = 0x56a000
open("/usr/lib64/locale/locale-archive", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2586, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f18099000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2586
read(3, "", 4096) = 0
close(3) = 0
munmap(0x2b0f18099000, 4096) = 0
open("/usr/lib64/locale/en_US.utf8/LC_MESSAGES", O_RDONLY) = 3
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
close(3) = 0
open("/usr/lib64/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=52, ...}) = 0
mmap(NULL, 52, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b0f18099000
close(3) = 0
open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=21546, ...}) = 0
mmap(NULL, 21546, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f1809a000
close(3) = 0
open("/usr/lib64/locale/en_US.utf8/LC_CTYPE", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=208464, ...}) = 0
mmap(NULL, 208464, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b0f180a0000
close(3) = 0
access("/usr/lib64/locale/en_US", W_OK) = 0
open("ISO-8859-1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/charmaps/ISO-8859-1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/charmaps/ISO-8859-1.gz", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3150, ...}) = 0
pipe([4, 5]) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b0f183c3b70) = 4258
close(5) = 0
close(3) = 0
fcntl(4, F_GETFL) = 0 (flags O_RDONLY)
fstat(4, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f180d3000
lseek(4, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
read(4, "<code_set_name> ISO-8859-1\n<comm"..., 4096) = 4096
read(4, " LATIN CAPITAL LETTER Z\n<U00"..., 4096) = 4096
read(4, " SUPERSCRIPT THREE\n<U00B4"..., 4096) = 4096
read(4, "L LETTER U WITH CIRCUMFLEX\n<U00F"..., 4096) = 337
read(4, "", 4096) = 0
close(4) = 0
munmap(0x2b0f180d3000, 4096) = 0
open("en_US", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/en_US", O_RDONLY) = 3
--- SIGCHLD (Child exited) @ 0 (0) ---
fstat(3, {st_mode=S_IFREG|0644, st_size=5480, ...}) = 0
mmap(NULL, 5480, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 5480, SEEK_SET) = 5480
open("i18n", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/i18n", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=95199, ...}) = 0
mmap(NULL, 95199, PROT_READ, MAP_SHARED, 4, 0) = 0x2b0f180d5000
lseek(4, 95199, SEEK_SET) = 95199
brk(0x58b000) = 0x58b000
mmap(NULL, 262144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f180ed000
mremap(0x2b0f180ed000, 262144, 524288, MREMAP_MAYMOVE) = 0x2b0f180ed000
brk(0x5ac000) = 0x5ac000
brk(0x5d4000) = 0x5d4000
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f1816d000
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f183c5000
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f183e6000
brk(0x5c7000) = 0x5c7000
mremap(0x2b0f1816d000, 135168, 266240, MREMAP_MAYMOVE) = 0x2b0f18407000
mremap(0x2b0f183c5000, 135168, 266240, MREMAP_MAYMOVE) = 0x2b0f18448000
mremap(0x2b0f183e6000, 135168, 266240, MREMAP_MAYMOVE) = 0x2b0f18489000
mremap(0x2b0f180ed000, 524288, 1048576, MREMAP_MAYMOVE) = 0x2b0f184ca000
mremap(0x2b0f18407000, 266240, 528384, MREMAP_MAYMOVE) = 0x2b0f180ed000
mremap(0x2b0f18448000, 266240, 528384, MREMAP_MAYMOVE) = 0x2b0f183c5000
mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0f185ca000
brk(0x5a7000) = 0x5a7000
mremap(0x2b0f18489000, 266240, 528384, MREMAP_MAYMOVE) = 0x2b0f1864b000
mremap(0x2b0f184ca000, 1048576, 3674112, MREMAP_MAYMOVE) = 0x2b0f186cc000
mremap(0x2b0f186cc000, 3674112, 7344128, MREMAP_MAYMOVE) = 0x2b0f186cc000
mremap(0x2b0f180ed000, 528384, 1052672, MREMAP_MAYMOVE) = 0x2b0f18446000
mremap(0x2b0f183c5000, 528384, 1052672, MREMAP_MAYMOVE) = 0x2b0f18dcd000
mremap(0x2b0f185ca000, 528384, 1052672, MREMAP_MAYMOVE) = 0x2b0f18ece000
mremap(0x2b0f1864b000, 528384, 1052672, MREMAP_MAYMOVE) = 0x2b0f18547000
brk(0x5c8000) = 0x5c8000
brk(0x5e9000) = 0x5e9000
brk(0x60a000) = 0x60a000
brk(0x62b000) = 0x62b000
brk(0x64c000) = 0x64c000
brk(0x66d000) = 0x66d000
fstat(4, {st_mode=S_IFREG|0644, st_size=95199, ...}) = 0
munmap(0x2b0f180d5000, 95199) = 0
close(4) = 0
open("iso14651_t1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/iso14651_t1", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=47626, ...}) = 0
mmap(NULL, 47626, PROT_READ, MAP_SHARED, 4, 0) = 0x2b0f180d5000
lseek(4, 47626, SEEK_SET) = 47626
brk(0x68e000) = 0x68e000
brk(0x68d000) = 0x68d000
brk(0x6ae000) = 0x6ae000
brk(0x6cf000) = 0x6cf000
brk(0x6f0000) = 0x6f0000
brk(0x711000) = 0x711000
brk(0x73d000) = 0x73d000
fstat(4, {st_mode=S_IFREG|0644, st_size=47626, ...}) = 0
munmap(0x2b0f180d5000, 47626) = 0
close(4) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=5480, ...}) = 0
munmap(0x2b0f180d3000, 5480) = 0
close(3) = 0
open("translit_neutral", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_neutral", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=7383, ...}) = 0
mmap(NULL, 7383, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 7383, SEEK_SET) = 7383
brk(0x75e000) = 0x75e000
fstat(3, {st_mode=S_IFREG|0644, st_size=7383, ...}) = 0
munmap(0x2b0f180d3000, 7383) = 0
close(3) = 0
open("translit_circle", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_circle", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=14116, ...}) = 0
mmap(NULL, 14116, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 14116, SEEK_SET) = 14116
brk(0x77f000) = 0x77f000
fstat(3, {st_mode=S_IFREG|0644, st_size=14116, ...}) = 0
munmap(0x2b0f180d3000, 14116) = 0
close(3) = 0
open("translit_cjk_compat", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_cjk_compat", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=59104, ...}) = 0
mmap(NULL, 59104, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 59104, SEEK_SET) = 59104
brk(0x7a0000) = 0x7a0000
brk(0x7c1000) = 0x7c1000
brk(0x7e2000) = 0x7e2000
brk(0x803000) = 0x803000
fstat(3, {st_mode=S_IFREG|0644, st_size=59104, ...}) = 0
munmap(0x2b0f180d3000, 59104) = 0
close(3) = 0
open("translit_compat", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_compat", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=34361, ...}) = 0
mmap(NULL, 34361, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 34361, SEEK_SET) = 34361
brk(0x824000) = 0x824000
fstat(3, {st_mode=S_IFREG|0644, st_size=34361, ...}) = 0
munmap(0x2b0f180d3000, 34361) = 0
close(3) = 0
open("translit_font", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_font", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=58986, ...}) = 0
mmap(NULL, 58986, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 58986, SEEK_SET) = 58986
brk(0x845000) = 0x845000
brk(0x866000) = 0x866000
brk(0x887000) = 0x887000
brk(0x8a8000) = 0x8a8000
fstat(3, {st_mode=S_IFREG|0644, st_size=58986, ...}) = 0
munmap(0x2b0f180d3000, 58986) = 0
close(3) = 0
open("translit_fraction", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_fraction", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2380, ...}) = 0
mmap(NULL, 2380, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 2380, SEEK_SET) = 2380
fstat(3, {st_mode=S_IFREG|0644, st_size=2380, ...}) = 0
munmap(0x2b0f180d3000, 2380) = 0
close(3) = 0
open("translit_narrow", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_narrow", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=6210, ...}) = 0
mmap(NULL, 6210, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 6210, SEEK_SET) = 6210
brk(0x8c9000) = 0x8c9000
fstat(3, {st_mode=S_IFREG|0644, st_size=6210, ...}) = 0
munmap(0x2b0f180d3000, 6210) = 0
close(3) = 0
open("translit_small", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_small", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3088, ...}) = 0
mmap(NULL, 3088, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 3088, SEEK_SET) = 3088
fstat(3, {st_mode=S_IFREG|0644, st_size=3088, ...}) = 0
munmap(0x2b0f180d3000, 3088) = 0
close(3) = 0
open("translit_wide", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/i18n/locales/translit_wide", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5030, ...}) = 0
mmap(NULL, 5030, PROT_READ, MAP_SHARED, 3, 0) = 0x2b0f180d3000
lseek(3, 5030, SEEK_SET) = 5030
fstat(3, {st_mode=S_IFREG|0644, st_size=5030, ...}) = 0
munmap(0x2b0f180d3000, 5030) = 0
close(3) = 0
brk(0x8ea000) = 0x8ea000
brk(0x910000) = 0x910000
unlink("/usr/lib64/locale/en_US/LC_CTYPE") = 0
creat("/usr/lib64/locale/en_US/LC_CTYPE", 0666) = 3
writev(3, [{"\25\21\3 X\0\0\0", 8}, {"h\1\0\0h\4\0\0h\n\0\0h\n\0\0h\20\0\0h\20\0\0h\24\0\0h\24"..., 352}, {"\2\0\2\0\2\0\2\0\2\0\2\0\2\0\2\0\2\0\2\0\2\0\2\0\2\0\2"..., 768}, {"\200\0\0\0\201\0\0\0\202\0\0\0\203\0\0\0\204\0\0\0\205"..., 1536}, {NULL, 0}, {"\200\0\0\0\201\0\0\0\202\0\0\0\203\0\0\0\204\0\0\0\205"..., 1536}, {NULL, 0}, {"\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2"..., 1024}, {NULL, 0}, {NULL, 0}, {NULL, 0}, {NULL, 0}, {"upper\0", 6}, {"lower\0", 6}, {"alpha\0", 6}, {"digit\0", 6}, {"xdigit\0", 7}, {"space\0", 6}, {"print\0", 6}, {"graph\0", 6}, {"blank\0", 6}, {"cntrl\0", 6}, {"punct\0", 6}, {"alnum\0", 6}, {"combining\0", 10}, {"combining_level3\0", 17}, {"\0\0\0\0", 4}, {"toupper\0", 8}, {"tolower\0", 8}, {"totitle\0", 8}, {"\0\0\0\0", 4}, {"\20\0\0\0\1\0\0\0\7\0\0\0\377\1\0\0\177\0\0\0\30\0\0\0"..., 2328}, ...], 125
--
Paolo Ornati
Linux 2.6.17.1 on x86_64
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Unkillable process in last git -- Bisected
2006-06-28 18:38 ` Unkillable process in last git -- Bisected Paolo Ornati
2006-06-28 19:06 ` Vladimir V. Saveliev
@ 2006-06-29 5:20 ` Andrew Morton
2006-06-29 6:23 ` Paolo Ornati
1 sibling, 1 reply; 8+ messages in thread
From: Andrew Morton @ 2006-06-29 5:20 UTC (permalink / raw)
To: Paolo Ornati; +Cc: ornati, linux-kernel, vs, neilb, schwidefsky, stable
On Wed, 28 Jun 2006 20:38:25 +0200
Paolo Ornati <ornati@fastwebnet.it> wrote:
> After a git-bisect session I've found that reverting the following
> commit fixes the problem.
>
> Any idea?
>
>
> commit 6527c2bdf1f833cc18e8f42bd97973d583e4aa83
> Author: Vladimir V. Saveliev <vs@namesys.com>
> Date: Tue Jun 27 02:53:57 2006 -0700
>
> [PATCH] generic_file_buffered_write(): deadlock on vectored write
From: Andrew Morton <akpm@osdl.org>
The recent generic_file_write() deadlock fix caused
generic_file_buffered_write() to loop inifinitely when presented with a
zero-length iovec segment. Fix.
Note that this fix deliberately avoids calling ->prepare_write(),
->commit_write() etc with a zero-length write. This is because I don't trust
all filesystems to get that right.
This is a cautious approach, for 2.6.17.x. For 2.6.18 we should just go ahead
and call ->prepare_write() and ->commit_write() with the zero length and fix
any broken filesystems. So I'll make that change once this code is stabilised
and backported into 2.6.17.x.
The reason for preferring to call ->prepare_write() and ->commit_write() with
the zero-length segment: a zero-length segment _should_ be sufficiently
uncommon that this is the correct way of handling it. We don't want to
optimise for poorly-written userspace at the expense of well-written
userspace.
Cc: "Vladimir V. Saveliev" <vs@namesys.com>
Cc: Neil Brown <neilb@suse.de>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Chris Wright <chrisw@sous-sol.org>
Cc: Greg KH <greg@kroah.com>
Cc: <stable@kernel.org>
Cc: walt <wa1ter@myrealbox.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---
mm/filemap.c | 9 ++++++++-
mm/filemap.h | 4 ++--
2 files changed, 10 insertions(+), 3 deletions(-)
diff -puN mm/filemap.c~generic_file_buffered_write-handle-zero-length-iovec-segments-stable mm/filemap.c
--- a/mm/filemap.c~generic_file_buffered_write-handle-zero-length-iovec-segments-stable
+++ a/mm/filemap.c
@@ -2125,6 +2125,12 @@ generic_file_buffered_write(struct kiocb
break;
}
+ if (unlikely(bytes == 0)) {
+ status = 0;
+ copied = 0;
+ goto zero_length_segment;
+ }
+
status = a_ops->prepare_write(file, page, offset, offset+bytes);
if (unlikely(status)) {
loff_t isize = i_size_read(inode);
@@ -2154,7 +2160,8 @@ generic_file_buffered_write(struct kiocb
page_cache_release(page);
continue;
}
- if (likely(copied > 0)) {
+zero_length_segment:
+ if (likely(copied >= 0)) {
if (!status)
status = copied;
diff -puN mm/filemap.h~generic_file_buffered_write-handle-zero-length-iovec-segments-stable mm/filemap.h
--- a/mm/filemap.h~generic_file_buffered_write-handle-zero-length-iovec-segments-stable
+++ a/mm/filemap.h
@@ -88,7 +88,7 @@ filemap_set_next_iovec(const struct iove
const struct iovec *iov = *iovp;
size_t base = *basep;
- while (bytes) {
+ do {
int copy = min(bytes, iov->iov_len - base);
bytes -= copy;
@@ -97,7 +97,7 @@ filemap_set_next_iovec(const struct iove
iov++;
base = 0;
}
- }
+ } while (bytes);
*iovp = iov;
*basep = base;
}
_
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Unkillable process in last git -- Bisected
2006-06-29 5:20 ` Andrew Morton
@ 2006-06-29 6:23 ` Paolo Ornati
0 siblings, 0 replies; 8+ messages in thread
From: Paolo Ornati @ 2006-06-29 6:23 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel, vs, neilb, schwidefsky, stable
On Wed, 28 Jun 2006 22:20:36 -0700
Andrew Morton <akpm@osdl.org> wrote:
> From: Andrew Morton <akpm@osdl.org>
>
> The recent generic_file_write() deadlock fix caused
> generic_file_buffered_write() to loop inifinitely when presented with a
> zero-length iovec segment. Fix.
It works for me :)
--
Paolo Ornati
Linux 2.6.17.1 on x86_64
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2006-06-29 6:23 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20060628142918.1b2c25c3@localhost>
2006-06-28 12:53 ` Unkillable process in last git -- 100% reproducible Paolo Ornati
2006-06-28 13:09 ` Paolo Ornati
2006-06-28 13:19 ` Paolo Ornati
2006-06-28 18:38 ` Unkillable process in last git -- Bisected Paolo Ornati
2006-06-28 19:06 ` Vladimir V. Saveliev
2006-06-28 20:14 ` Paolo Ornati
2006-06-29 5:20 ` Andrew Morton
2006-06-29 6:23 ` Paolo Ornati
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox