From: Tom Zanussi <zanussi@comcast.net>
To: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>,
jens.axboe@oracle.com, linux-kernel@vger.kernel.org
Subject: Re: [PROBLEM] hard-lock with kmemtrace, relayfs, and splice
Date: Fri, 10 Oct 2008 23:58:51 -0500 [thread overview]
Message-ID: <1223701131.7489.25.camel@charm-linux> (raw)
In-Reply-To: <1223631723.8959.46.camel@penberg-laptop>
On Fri, 2008-10-10 at 12:42 +0300, Pekka Enberg wrote:
> (I'm cc'ing Tom, Jens, and LKML.)
>
> On Fri, 2008-10-10 at 12:10 +0300, Pekka Enberg wrote:
> > > I'm seeing a hard lock on my machine when I run kmemtraced with the
> > > following patch applied:
> > >
> > > http://git.kernel.org/?p=linux/kernel/git/penberg/slab-2.6.git;a=commitdiff;h=17ca1d5506b1db433f0b7167a627bfd55d319dd3
> > >
> > > I can enable/disable kmemtrace via the debugfs files fine and can also
> > > read the relay files with cat.
> > >
> > > Any idea where this is coming from?
> >
> > OK, it's the first splice() call in reader_thread() that causes the
> > hang. Hmm.
>
> To recap, with a CONFIG_KMEMTRACE enabled kernel from the
> "topic/kmemtrace" branch of:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6.git topic/kmemtrace
>
> running the "kmemtraced" program from
>
> git://git.kernel.org/pub/scm/linux/kernel/git/penberg/kmemtrace-user.git
>
> results to a hard lock on my machine. I am unable to find anything
> obviously wrong with it and as I can read/write the relay files just
> fine, I'm beginning to think it's problem in relayfs splice
> implementation.
>
> Tom, thoughts?
>
It looks like you hit the same problem as described here:
commit 8191ecd1d14c6914c660dfa007154860a7908857
splice: fix infinite loop in generic_file_splice_read()
relay uses the same loop but it never got noticed or fixed. Can you try
the following patch:
diff --git a/kernel/relay.c b/kernel/relay.c
index 8d13a78..6a4d439 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -1318,12 +1318,9 @@ static ssize_t relay_file_splice_read(struct file *in,
if (ret < 0)
break;
else if (!ret) {
- if (spliced)
- break;
- if (flags & SPLICE_F_NONBLOCK) {
+ if (flags & SPLICE_F_NONBLOCK)
ret = -EAGAIN;
- break;
- }
+ break;
}
*ppos += ret;
It worked for me, but I also had to apply the following patch to
kmemtraced:
diff --git a/kmemtraced.c b/kmemtraced.c
index 217478d..324ced9 100644
--- a/kmemtraced.c
+++ b/kmemtraced.c
@@ -109,6 +109,8 @@ static void *reader_thread(void *data)
if (retval < 0)
panic("splice() (from) failed: %s\n",
strerror(errno));
+ if (!retval)
+ continue;
retval = splice(pipe_fd[0], NULL, log_fd, NULL,
128, SPLICE_F_MOVE);
if (retval < 0)
Otherwise it would end up hanging kmemtraced in the second splice (pipe
to log_fd) if the return from the first splice was 0 (i.e. there's no
data available (and we can never know if there will ever be any
more)).
I'm not sure why kmemtraced is only splicing 128 bytes at a time - it
seems to defeat the purpose - or why it wouldn't be using poll to know
when there's at least a whole sub-buffer to splice, but to each his own.
Hopefully the kernel patch at least fixes the loop.
Tom
next prev parent reply other threads:[~2008-10-11 4:59 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-23 21:29 [ANNOUNCE] kmemtrace-user repo update Eduard - Gabriel Munteanu
[not found] ` <1223386477.28348.42.camel@penberg-laptop>
[not found] ` <1223623191.8959.26.camel@penberg-laptop>
[not found] ` <1223628687.8959.37.camel@penberg-laptop>
[not found] ` <1223629803.8959.40.camel@penberg-laptop>
2008-10-10 9:42 ` [PROBLEM] hard-lock with kmemtrace, relayfs, and splice Pekka Enberg
2008-10-10 11:51 ` Eduard - Gabriel Munteanu
2008-10-11 4:58 ` Tom Zanussi [this message]
2008-10-11 18:17 ` Eduard - Gabriel Munteanu
2008-10-13 6:57 ` Pekka Enberg
2008-10-14 4:03 ` Tom Zanussi
2008-10-14 5:13 ` Pekka Enberg
2008-10-14 5:46 ` Tom Zanussi
2008-10-14 6:58 ` Pekka Enberg
2008-10-14 7:30 ` Eduard - Gabriel Munteanu
2008-10-14 7:05 ` Pekka Enberg
2008-10-24 4:44 ` Peter Teoh
2008-10-24 14:15 ` Pekka Enberg
2008-10-25 0:56 ` Peter Teoh
2008-10-25 14:04 ` Eduard - Gabriel Munteanu
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=1223701131.7489.25.camel@charm-linux \
--to=zanussi@comcast.net \
--cc=eduard.munteanu@linux360.ro \
--cc=jens.axboe@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=penberg@cs.helsinki.fi \
/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.
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.