* Re: decode GFP flags in oom killer output.
2012-03-07 23:39 decode GFP flags in oom killer output Dave Jones
@ 2012-03-07 23:48 ` Michal Nazarewicz
2012-03-08 0:02 ` Dave Jones
2012-03-07 23:50 ` Jesper Juhl
` (3 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Michal Nazarewicz @ 2012-03-07 23:48 UTC (permalink / raw)
To: Linux Kernel, Dave Jones; +Cc: linux-mm
On Thu, 08 Mar 2012 00:39:39 +0100, Dave Jones <davej@redhat.com> wrote:
> Decoding these flags by hand in oom reports is tedious,
> and error-prone.
>
> Signed-off-by: Dave Jones <davej@redhat.com>
>
> diff -durpN '--exclude-from=/home/davej/.exclude' -u src/git-trees/kernel/linux/include/linux/gfp.h linux-dj/include/linux/gfp.h
> --- linux/include/linux/gfp.h 2012-01-11 16:54:21.736395499 -0500
> +++ linux-dj/include/linux/gfp.h 2012-03-06 13:17:37.294692113 -0500
> @@ -10,6 +10,7 @@
> struct vm_area_struct;
> /* Plain integer GFP bitmasks. Do not use this directly. */
> +/* Update mm/oom_kill.c gfp_flag_texts when adding to/changing this list */
> #define ___GFP_DMA 0x01u
> #define ___GFP_HIGHMEM 0x02u
> #define ___GFP_DMA32 0x04u
> diff -durpN '--exclude-from=/home/davej/.exclude' -u src/git-trees/kernel/linux/mm/oom_kill.c linux-dj/mm/oom_kill.c
> --- linux/mm/oom_kill.c 2012-01-17 17:54:14.541881964 -0500
> +++ linux-dj/mm/oom_kill.c 2012-03-06 13:17:44.071680535 -0500
> @@ -416,13 +416,40 @@ static void dump_tasks(const struct mem_
> }
> }
>+static unsigned char *gfp_flag_texts[32] = {
> + "DMA", "HIGHMEM", "DMA32", "MOVABLE",
> + "WAIT", "HIGH", "IO", "FS",
> + "COLD", "NOWARN", "REPEAT", "NOFAIL",
> + "NORETRY", NULL, "COMP", "ZERO",
> + "NOMEMALLOC", "HARDWALL", "THISNODE", "RECLAIMABLE",
> + NULL, "NOTRACK", "NO_KSWAPD", "OTHER_NODE",
> +};
> +
> +static void decode_gfp_mask(gfp_t gfp_mask, char *out_string)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < 32; i++) {
> + if (gfp_mask & (1 << i)) {
> + if (gfp_flag_texts[i])
> + out_string += sprintf(out_string, "%s ", gfp_flag_texts[i]);
> + else
> + out_string += sprintf(out_string, "reserved! ");
> + }
> + }
> + out_string = "\0";
Uh? Did you mean “*out_string = 0;” which is redundant anyway?
Also, this leaves a trailing space at the end of the string.
> +}
> +
> static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order,
> struct mem_cgroup *memcg, const nodemask_t *nodemask)
> {
> + char gfp_string[80];
For ~0, the string will be 256 characters followed by a NUL byte byte at the end.
This combination may make no sense, but the point is that you need to take length
of the buffer into account, probably by using snprintf() and a counter.
> task_lock(current);
> - pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, "
> + decode_gfp_mask(gfp_mask, gfp_string);
> + pr_warning("%s invoked oom-killer: gfp_mask=0x%x [%s], order=%d, "
> "oom_adj=%d, oom_score_adj=%d\n",
> - current->comm, gfp_mask, order, current->signal->oom_adj,
> + current->comm, gfp_mask, gfp_string,
> + order, current->signal->oom_adj,
> current->signal->oom_score_adj);
> cpuset_print_task_mems_allowed(current);
> task_unlock(current);
>
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org. For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
>
--
Best regards, _ _
.o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o
..o | Computer Science, Michał “mina86” Nazarewicz (o o)
ooo +----<email/xmpp: mpn@google.com>--------------ooO--(_)--Ooo--
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: decode GFP flags in oom killer output.
2012-03-07 23:48 ` Michal Nazarewicz
@ 2012-03-08 0:02 ` Dave Jones
2012-03-08 0:08 ` Michal Nazarewicz
0 siblings, 1 reply; 9+ messages in thread
From: Dave Jones @ 2012-03-08 0:02 UTC (permalink / raw)
To: Michal Nazarewicz; +Cc: Linux Kernel, linux-mm
On Thu, Mar 08, 2012 at 12:48:08AM +0100, Michal Nazarewicz wrote:
> > +static void decode_gfp_mask(gfp_t gfp_mask, char *out_string)
> > +{
> > + unsigned int i;
> > +
> > + for (i = 0; i < 32; i++) {
> > + if (gfp_mask & (1 << i)) {
> > + if (gfp_flag_texts[i])
> > + out_string += sprintf(out_string, "%s ", gfp_flag_texts[i]);
> > + else
> > + out_string += sprintf(out_string, "reserved! ");
> > + }
> > + }
> > + out_string = "\0";
>
> Uh? Did you mean a??*out_string = 0;a?? which is redundant anyway?
Yeah, that was the intent.
> Also, this leaves a trailing space at the end of the string.
The zero was supposed to wipe it out, but I just realized it's advanced past it.
> > static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order,
> > struct mem_cgroup *memcg, const nodemask_t *nodemask)
> > {
> > + char gfp_string[80];
>
> For ~0, the string will be 256 characters followed by a NUL byte byte at the end.
> This combination may make no sense, but the point is that you need to take length
> of the buffer into account, probably by using snprintf() and a counter.
alternatively, we could just use a bigger buffer here.
thanks,
Dave
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: decode GFP flags in oom killer output.
2012-03-08 0:02 ` Dave Jones
@ 2012-03-08 0:08 ` Michal Nazarewicz
0 siblings, 0 replies; 9+ messages in thread
From: Michal Nazarewicz @ 2012-03-08 0:08 UTC (permalink / raw)
To: Dave Jones; +Cc: Linux Kernel, linux-mm
On Thu, 08 Mar 2012 01:02:33 +0100, Dave Jones <davej@redhat.com> wrote:
> On Thu, Mar 08, 2012 at 12:48:08AM +0100, Michal Nazarewicz wrote:
> > > static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order,
> > > struct mem_cgroup *memcg, const nodemask_t *nodemask)
> > > {
> > > + char gfp_string[80];
> >
> > For ~0, the string will be 256 characters followed by a NUL byte byte at the end.
> > This combination may make no sense, but the point is that you need to take length
> > of the buffer into account, probably by using snprintf() and a counter.
>
> alternatively, we could just use a bigger buffer here.
Allocating 257 bytes on stack does not seem like a good idea especially inside of
OOM killer, where probably quite a bit of the stack was already consumed prior to
reaching this function.
--
Best regards, _ _
.o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o
..o | Computer Science, Michał “mina86” Nazarewicz (o o)
ooo +----<email/xmpp: mpn@google.com>--------------ooO--(_)--Ooo--
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: decode GFP flags in oom killer output.
2012-03-07 23:39 decode GFP flags in oom killer output Dave Jones
2012-03-07 23:48 ` Michal Nazarewicz
@ 2012-03-07 23:50 ` Jesper Juhl
2012-03-07 23:53 ` David Rientjes
` (2 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Jesper Juhl @ 2012-03-07 23:50 UTC (permalink / raw)
To: Dave Jones; +Cc: Linux Kernel, linux-mm
On Wed, 7 Mar 2012, Dave Jones wrote:
> Decoding these flags by hand in oom reports is tedious,
> and error-prone.
>
> Signed-off-by: Dave Jones <davej@redhat.com>
>
> diff -durpN '--exclude-from=/home/davej/.exclude' -u src/git-trees/kernel/linux/include/linux/gfp.h linux-dj/include/linux/gfp.h
> --- linux/include/linux/gfp.h 2012-01-11 16:54:21.736395499 -0500
> +++ linux-dj/include/linux/gfp.h 2012-03-06 13:17:37.294692113 -0500
> @@ -10,6 +10,7 @@
> struct vm_area_struct;
>
> /* Plain integer GFP bitmasks. Do not use this directly. */
> +/* Update mm/oom_kill.c gfp_flag_texts when adding to/changing this list */
> #define ___GFP_DMA 0x01u
> #define ___GFP_HIGHMEM 0x02u
> #define ___GFP_DMA32 0x04u
> diff -durpN '--exclude-from=/home/davej/.exclude' -u src/git-trees/kernel/linux/mm/oom_kill.c linux-dj/mm/oom_kill.c
> --- linux/mm/oom_kill.c 2012-01-17 17:54:14.541881964 -0500
> +++ linux-dj/mm/oom_kill.c 2012-03-06 13:17:44.071680535 -0500
> @@ -416,13 +416,40 @@ static void dump_tasks(const struct mem_
> }
> }
>
> +static unsigned char *gfp_flag_texts[32] = {
> + "DMA", "HIGHMEM", "DMA32", "MOVABLE",
> + "WAIT", "HIGH", "IO", "FS",
> + "COLD", "NOWARN", "REPEAT", "NOFAIL",
> + "NORETRY", NULL, "COMP", "ZERO",
> + "NOMEMALLOC", "HARDWALL", "THISNODE", "RECLAIMABLE",
> + NULL, "NOTRACK", "NO_KSWAPD", "OTHER_NODE",
> +};
Hmm, there are 24 entries in this list, yet you allocate an array of size
32 - why?
Shouldn't this just be 'static unsigned char *gfp_flag_texts[] = {...}'
and let the compiler worry about the size? Or am I overlooking something
obvious?
--
Jesper Juhl <jj@chaosbits.net> http://www.chaosbits.net/
Don't top-post http://www.catb.org/jargon/html/T/top-post.html
Plain text mails only, please.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: decode GFP flags in oom killer output.
2012-03-07 23:39 decode GFP flags in oom killer output Dave Jones
2012-03-07 23:48 ` Michal Nazarewicz
2012-03-07 23:50 ` Jesper Juhl
@ 2012-03-07 23:53 ` David Rientjes
2012-03-08 0:04 ` Joe Perches
2012-03-08 16:24 ` Mel Gorman
4 siblings, 0 replies; 9+ messages in thread
From: David Rientjes @ 2012-03-07 23:53 UTC (permalink / raw)
To: Dave Jones, Linux Kernel, linux-mm
On Wed, 7 Mar 2012, Dave Jones wrote:
> Decoding these flags by hand in oom reports is tedious,
> and error-prone.
>
Something like this is already done in include/trace/events/gfpflags.h so
there should be a generic version of this or something you can already
use.
The problem here is that you have to allocate an additional 80-bytes for
the string and the oom killer is notorious for being called deep in the
stack and you can't statically allocate a string buffer without adding
additional syncronization.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: decode GFP flags in oom killer output.
2012-03-07 23:39 decode GFP flags in oom killer output Dave Jones
` (2 preceding siblings ...)
2012-03-07 23:53 ` David Rientjes
@ 2012-03-08 0:04 ` Joe Perches
2012-03-08 0:18 ` Michal Nazarewicz
2012-03-08 16:24 ` Mel Gorman
4 siblings, 1 reply; 9+ messages in thread
From: Joe Perches @ 2012-03-08 0:04 UTC (permalink / raw)
To: Dave Jones; +Cc: Linux Kernel, linux-mm
On Wed, 2012-03-07 at 18:39 -0500, Dave Jones wrote:
> Decoding these flags by hand in oom reports is tedious,
> and error-prone.
trivial notes...
> diff -durpN '--exclude-from=/home/davej/.exclude' -u src/git-trees/kernel/linux/mm/oom_kill.c linux-dj/mm/oom_kill.c
[]
> @@ -416,13 +416,40 @@ static void dump_tasks(const struct mem_
> }
> }
>
> +static unsigned char *gfp_flag_texts[32] = {
static const char *gfp_flags_text[sizeof(gfp_t) * 8)
> + "DMA", "HIGHMEM", "DMA32", "MOVABLE",
> + "WAIT", "HIGH", "IO", "FS",
> + "COLD", "NOWARN", "REPEAT", "NOFAIL",
> + "NORETRY", NULL, "COMP", "ZERO",
> + "NOMEMALLOC", "HARDWALL", "THISNODE", "RECLAIMABLE",
> + NULL, "NOTRACK", "NO_KSWAPD", "OTHER_NODE",
> +};
> +
> +static void decode_gfp_mask(gfp_t gfp_mask, char *out_string)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < 32; i++) {
< sizeof(gfp_t * 8)
> + if (gfp_mask & (1 << i)) {
(gfp_t)1 << i
> + if (gfp_flag_texts[i])
> + out_string += sprintf(out_string, "%s ", gfp_flag_texts[i]);
> + else
> + out_string += sprintf(out_string, "reserved! ");
not much use to exclamation points.
> + }
> + }
> + out_string = "\0";
out_string[-1] = 0;
> +}
> +
> static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order,
> struct mem_cgroup *memcg, const nodemask_t *nodemask)
> {
> + char gfp_string[80];
maybe a static buffer instead of stack?
> task_lock(current);
> - pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, "
> + decode_gfp_mask(gfp_mask, gfp_string);
> + pr_warning("%s invoked oom-killer: gfp_mask=0x%x [%s], order=%d, "
> "oom_adj=%d, oom_score_adj=%d\n",
Maybe nicer to coalesce the format.
> - current->comm, gfp_mask, order, current->signal->oom_adj,
> + current->comm, gfp_mask, gfp_string,
> + order, current->signal->oom_adj,
> current->signal->oom_score_adj);
> cpuset_print_task_mems_allowed(current);
> task_unlock(current);
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: decode GFP flags in oom killer output.
2012-03-08 0:04 ` Joe Perches
@ 2012-03-08 0:18 ` Michal Nazarewicz
0 siblings, 0 replies; 9+ messages in thread
From: Michal Nazarewicz @ 2012-03-08 0:18 UTC (permalink / raw)
To: Dave Jones, Joe Perches; +Cc: Linux Kernel, linux-mm
On Thu, 08 Mar 2012 01:04:21 +0100, Joe Perches <joe@perches.com> wrote:
> On Wed, 2012-03-07 at 18:39 -0500, Dave Jones wrote:
>> +static void decode_gfp_mask(gfp_t gfp_mask, char *out_string)
>> +{
>> + unsigned int i;
>> +
>> + for (i = 0; i < 32; i++) {
>
> < sizeof(gfp_t * 8)
>
>> + if (gfp_mask & (1 << i)) {
>
> (gfp_t)1 << i
>
>> + if (gfp_flag_texts[i])
>> + out_string += sprintf(out_string, "%s ", gfp_flag_texts[i]);
>> + else
>> + out_string += sprintf(out_string, "reserved! ");
>
> not much use to exclamation points.
>
>> + }
>> + }
>> + out_string = "\0";
>
> out_string[-1] = 0;
Will break if gfp_mask == 0.
>> +}
>> +
--
Best regards, _ _
.o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o
..o | Computer Science, Michał “mina86” Nazarewicz (o o)
ooo +----<email/xmpp: mpn@google.com>--------------ooO--(_)--Ooo--
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: decode GFP flags in oom killer output.
2012-03-07 23:39 decode GFP flags in oom killer output Dave Jones
` (3 preceding siblings ...)
2012-03-08 0:04 ` Joe Perches
@ 2012-03-08 16:24 ` Mel Gorman
4 siblings, 0 replies; 9+ messages in thread
From: Mel Gorman @ 2012-03-08 16:24 UTC (permalink / raw)
To: Dave Jones, Linux Kernel, linux-mm
On Wed, Mar 07, 2012 at 06:39:39PM -0500, Dave Jones wrote:
> Decoding these flags by hand in oom reports is tedious,
> and error-prone.
>
It's not really a proper solution but scripts/gfp-translate is less
error-prone than doing it by hand but requires that you have the kernel
source available.
--
Mel Gorman
SUSE Labs
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 9+ messages in thread