public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
From: Linus Torvalds <torvalds@linux-foundation.org>
To: Simon Kagstrom <simon.kagstrom@netinsight.net>
Cc: Artem Bityutskiy <dedekind1@gmail.com>,
	LKML <linux-kernel@vger.kernel.org>,
	"Koskinen Aaro \(Nokia-D/Helsinki\)" <aaro.koskinen@nokia.com>,
	linux-mtd <linux-mtd@lists.infradead.org>,
	Ingo Molnar <mingo@elte.hu>,
	David Woodhouse <dwmw2@infradead.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>
Subject: Re: [PATCH/RFC v5 4/5]: core: Add dump device to call on oopses and panics
Date: Tue, 13 Oct 2009 08:37:10 -0700 (PDT)	[thread overview]
Message-ID: <alpine.LFD.2.01.0910130813320.26777@localhost.localdomain> (raw)
In-Reply-To: <20091013152235.188059d2@marrow.netinsight.se>



On Tue, 13 Oct 2009, Simon Kagstrom wrote:
> +
> +struct dump_device {

I know I used that name myself in the example code I sent out, but 
thinking about it more, I hate the name.

Most people think a "dump" is something much more than just the kernel 
messages, so "dump_device" ends up being misleading. And the "device" part 
is kind of pointless and redundant (it need not be a real device).

So I suspect it would be better to name it by what it does, and make it 
clear what that is.

Maybe something like "struct kmsg_dumper" or similar. That is pretty 
unambiguous, and nobody is going to get confused about what the semantics 
are.

> +	void	(*oops)(struct dump_device *, const char *, unsigned long,
> +			const char *, unsigned long);
> +	void	(*panic)(struct dump_device *, const char *, unsigned long,
> +			const char *, unsigned long);

I don't much like this. Why separate 'oops' and 'panic' functions, 
especially since we migth have many more causes to do a kmsg dump in the 
future (ie 'shutdown', 'sysrq', 'suspend' etc etc)?

So separating them out as two different functions is just wrong. Make it 
one function, and then perhaps you can add a

	enum kmsg_dump_reason {
		kmsg_dump_panic,
		kmsg_dump_oops,
		..
	};

and pass it as an argument.

> +	int	(*setup)(struct dump_device *);

Why?

There seems to be no reason for this. Who ever registers the dumper should 
just do the setup call itself. Why would we have a callback that just gets 
called immediately, rather than have the registration code just do the 
call itself?

> +int register_dumpdevice(struct dump_device *dump, void *priv)
> +{
> +	/* We need at least one of these set */
> +	if (!dump->oops && !dump->panic)
> +		return -EINVAL;
> +	if (dump->setup && dump->setup(dump) != 0)
> +		return -EINVAL;

So the above two tests should be pointless.

> +	dump->priv = priv;
> +
> +	INIT_LIST_HEAD(&dump->list);

Don't do "INIT_LIST_HEAD()" here. It's pointless as far as I can tell (the 
list_add() will initialize it), but even in general we should basically 
have basic initialization done by callers if needed.

And judging by historical problems in areas like that, we should protect 
against people registering the same dumper twice. One way to do that would 
be to perhaps _require_ that the caller has initialized it, and then do a 

	if (!list_empty(&dump->list))
		return -EBUSY;

(but I could also see using just a "registered" flag)

> +	write_lock(&dump_list_lock);

This looks dubious. Dumping can obviously happen from interrupts, so _if_ 
you were to protect against dumpers, you'd need to use an interrupt-safe 
lock.

Of course, you do not actually take the lock at dump time (which may be 
intentional, and that is not necessarily wrong - taking locks at oops time 
is generally not a good thing to do, and it may be entirely reasonable to 
say "we take the risk of not locking properly in order to _maybe_ work 
even if the lock is scrogged").

But if you don't take the lock at dump time (or, perhaps preferably, if 
you make the dump-time lock be a "try_lock()" - maybe the oops is due to 
dump list corruption, and if the dump_list_lock is held thew oopser 
should simply not dump!), then you should probably use a spinlock rather 
than an rwlock.

> +	list_for_each_entry(dump, &dump_list, list) {
> +		if (panic && dump->panic)
> +			dump->panic(dump, s1, l1, s2, l2);
> +		else if (!panic && dump->oops)
> +			dump->oops(dump, s1, l1, s2, l2);
> +	}

So this would just become

	list_for_each_entry(dump, &dump_list, list)
		dump->fn(dump, s1, l1, s2, l2, reason);

or something.

			Linus

  reply	other threads:[~2009-10-13 15:37 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-11  6:10 [PATCH] panic.c: export panic_on_oops Artem Bityutskiy
2009-10-12 11:15 ` Ingo Molnar
2009-10-12 11:23   ` Simon Kagstrom
2009-10-12 11:25   ` Artem Bityutskiy
2009-10-12 11:37     ` Ingo Molnar
2009-10-12 12:01       ` Simon Kagstrom
2009-10-12 12:09         ` Ingo Molnar
2009-10-12 12:15           ` David Woodhouse
2009-10-12 12:20             ` Ingo Molnar
2009-10-12 12:33               ` David Woodhouse
2009-10-12 12:36                 ` Ingo Molnar
2009-10-12 12:48                   ` David Woodhouse
2009-10-12 13:06               ` Simon Kagstrom
2009-10-12 13:15                 ` Ingo Molnar
2009-10-12 13:39                   ` Simon Kagstrom
2009-10-12 14:30                     ` Ingo Molnar
2009-10-12 15:01                       ` Simon Kagstrom
2009-10-12 15:23                         ` Ingo Molnar
2009-10-12 15:36                     ` Linus Torvalds
2009-10-12 15:44                       ` Linus Torvalds
2009-10-12 17:29                         ` Artem Bityutskiy
2009-10-12 17:43                           ` Linus Torvalds
2009-10-12 17:46                             ` Linus Torvalds
2009-10-12 18:09                       ` Andrew Morton
2009-10-12 18:23                         ` Ingo Molnar
2009-10-12 18:36                           ` Andrew Morton
2009-10-12 18:45                           ` Linus Torvalds
2009-10-12 19:14                             ` Ingo Molnar
2009-10-12 19:18                             ` Dirk Hohndel
2009-10-13  7:58                             ` Simon Kagstrom
2009-10-13  8:57                               ` Artem Bityutskiy
2009-10-13 13:17                             ` [PATCH/RFC v5 0/5]: mtdoops: fixes and improvements Simon Kagstrom
2009-10-13 13:21                               ` [PATCH/RFC v5 1/5]: mtdoops: avoid erasing already empty areas Simon Kagstrom
2009-10-13 13:22                               ` [PATCH/RFC v5 2/5]: mtdoops: Keep track of used/unused mtdoops pages in an array Simon Kagstrom
2009-10-13 13:22                               ` [PATCH/RFC v5 3/5]: mtdoops: Make page (record) size configurable Simon Kagstrom
2009-10-13 13:22                               ` [PATCH/RFC v5 4/5]: core: Add dump device to call on oopses and panics Simon Kagstrom
2009-10-13 15:37                                 ` Linus Torvalds [this message]
2009-11-26  9:36                                 ` Jörn Engel
2009-11-30  7:27                                   ` Artem Bityutskiy
2009-11-30  7:46                                     ` Jörn Engel
2009-11-30  8:51                                       ` Artem Bityutskiy
2009-11-30  9:35                                         ` Jörn Engel
2009-11-30  9:40                                           ` Artem Bityutskiy
2009-11-30  9:53                                             ` Simon Kagstrom
     [not found]                                               ` <1259580207.19465.379.camel@macbook.infradead.org>
     [not found]                                                 ` <20091130123752.39727115@marrow.netinsight.se>
     [not found]                                                   ` <1259582202.19465.388.camel@macbook.infradead.org>
2009-11-30 12:03                                                     ` Simon Kagstrom
2009-11-30  9:54                                             ` Jörn Engel
2009-11-30 10:23                                         ` David Woodhouse
2009-11-30 10:27                                           ` David Woodhouse
2009-11-30  9:09                                   ` Artem Bityutskiy
2009-11-30  9:28                                     ` Simon Kagstrom
2009-10-13 13:22                               ` [PATCH/RFC v5 5/5]: mtdoops: refactor as a dump_device Simon Kagstrom
2009-10-14 13:34                             ` [PATCH v6 0/5]: mtdoops: fixes and improvements Simon Kagstrom
2009-10-14 13:40                               ` [PATCH v6 1/5]: mtdoops: avoid erasing already empty areas Simon Kagstrom
2009-10-14 13:41                               ` [PATCH v6 2/5]: mtdoops: Keep track of used/unused mtdoops pages in an array Simon Kagstrom
2009-10-14 13:41                               ` [PATCH v6 3/5]: mtdoops: Make page (record) size configurable Simon Kagstrom
2009-10-14 13:41                               ` [PATCH v6 4/5]: core: Add kernel message dumper to call on oopses and panics Simon Kagstrom
2009-10-14 16:49                                 ` Linus Torvalds
2009-10-14 13:41                               ` [PATCH v6 5/5]: mtdoops: refactor as a kmsg_dumper Simon Kagstrom
2009-10-14 15:12                                 ` Simon Kagstrom
2009-10-15  5:11                                   ` vimal singh
2009-10-12 12:27           ` [PATCH] panic.c: export panic_on_oops Simon Kagstrom
2009-10-12 12:32             ` Ingo Molnar
2009-10-12 13:08               ` Alan Cox
2009-10-12 13:25                 ` Ingo Molnar
2009-10-12 13:32                   ` David Woodhouse
2009-10-12 14:26                     ` Ingo Molnar
2009-10-12 14:36                       ` David Woodhouse
2009-10-12 15:14                         ` Ingo Molnar
2009-10-12 18:32                           ` Carl-Daniel Hailfinger
2009-10-12 19:18                             ` Ingo Molnar
2009-10-12 14:12       ` Arjan van de Ven

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=alpine.LFD.2.01.0910130813320.26777@localhost.localdomain \
    --to=torvalds@linux-foundation.org \
    --cc=aaro.koskinen@nokia.com \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=dedekind1@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=mingo@elte.hu \
    --cc=simon.kagstrom@netinsight.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox