Signed-off-by: Michal Toman <mtoman(a)redhat.com>
---
include/koops/stacktrace.h | 5 +++++
lib/koops_stacktrace.c | 15 +++++++++++++
python/py_koops_stacktrace.c | 8 +++++++
python/py_koops_stacktrace.h | 1 +
tests/koops_stacktrace.at | 51 +++++++++++++++++++++++++++++++++++++++++++-
5 files changed, 79 insertions(+), 1 deletion(-)
diff --git a/include/koops/stacktrace.h b/include/koops/stacktrace.h
index 85bc755..6fcc7d6 100644
--- a/include/koops/stacktrace.h
+++ b/include/koops/stacktrace.h
@@ -78,6 +78,11 @@ struct sr_koops_stacktrace
* @brief Call trace. It might be NULL as it is not mandatory.
*/
struct sr_koops_frame *frames;
+
+ /**
+ * @brief Raw kerneloops text.
+ */
+ char *raw_oops;
};
/**
diff --git a/lib/koops_stacktrace.c b/lib/koops_stacktrace.c
index 4ba74db..449f20b 100644
--- a/lib/koops_stacktrace.c
+++ b/lib/koops_stacktrace.c
@@ -129,6 +129,7 @@ sr_koops_stacktrace_free(struct sr_koops_stacktrace *stacktrace)
}
free(stacktrace->version);
+ free(stacktrace->raw_oops);
free(stacktrace);
}
@@ -144,6 +145,9 @@ sr_koops_stacktrace_dup(struct sr_koops_stacktrace *stacktrace)
if (result->version)
result->version = sr_strdup(result->version);
+ if (result->raw_oops)
+ result->raw_oops = sr_strdup(result->raw_oops);
+
return result;
}
@@ -291,6 +295,9 @@ sr_koops_stacktrace_parse(const char **input,
struct sr_koops_frame *frame;
bool parsed_ip = false;
+ /* Include the raw kerneloops text */
+ stacktrace->raw_oops = sr_strdup(*input);
+
/* Looks for the "Tainted: " line in the whole input */
parse_taint_flags(local_input, stacktrace);
@@ -444,6 +451,14 @@ sr_koops_stacktrace_to_json(struct sr_koops_stacktrace *stacktrace)
{
struct sr_strbuf *strbuf = sr_strbuf_new();
+ /* Raw oops. */
+ if (stacktrace->raw_oops)
+ {
+ sr_strbuf_append_str(strbuf, ", \"raw_oops\": ");
+ sr_json_append_escaped(strbuf, stacktrace->raw_oops);
+ sr_strbuf_append_str(strbuf, "\n");
+ }
+
/* Kernel version. */
if (stacktrace->version)
{
diff --git a/python/py_koops_stacktrace.c b/python/py_koops_stacktrace.c
index 0057cb1..27b222d 100644
--- a/python/py_koops_stacktrace.c
+++ b/python/py_koops_stacktrace.c
@@ -46,6 +46,7 @@ static PyGetSetDef
koops_stacktrace_getset[] =
{
{ (char*)"modules", sr_py_koops_stacktrace_get_modules,
sr_py_koops_stacktrace_set_modules, (char*)b_modules_doc, NULL },
+ { (char*)"raw_oops", sr_py_koops_stacktrace_get_raw_oops, NULL,
(char*)b_taint_flags_doc, NULL },
{ (char*)"taint_flags", sr_py_koops_stacktrace_get_taint_flags,
sr_py_koops_stacktrace_set_taint_flags, (char*)b_taint_flags_doc, NULL },
{ NULL },
};
@@ -125,6 +126,13 @@ sr_py_koops_stacktrace_set_modules(PyObject *self, PyObject *rhs,
void *data)
}
PyObject *
+sr_py_koops_stacktrace_get_raw_oops(PyObject *self, void *data)
+{
+ struct sr_koops_stacktrace *st = ((struct
sr_py_koops_stacktrace*)self)->stacktrace;
+ return Py_BuildValue("s", st->raw_oops);
+}
+
+PyObject *
sr_py_koops_stacktrace_get_taint_flags(PyObject *self, void *data)
{
struct sr_koops_stacktrace *st = ((struct
sr_py_koops_stacktrace*)self)->stacktrace;
diff --git a/python/py_koops_stacktrace.h b/python/py_koops_stacktrace.h
index 162ac5e..af375f0 100644
--- a/python/py_koops_stacktrace.h
+++ b/python/py_koops_stacktrace.h
@@ -60,6 +60,7 @@ PyObject *sr_py_koops_stacktrace_str(PyObject *self);
/* getters & setters */
PyObject *sr_py_koops_stacktrace_get_modules(PyObject *self, void *data);
int sr_py_koops_stacktrace_set_modules(PyObject *self, PyObject *rhs, void *data);
+PyObject *sr_py_koops_stacktrace_get_raw_oops(PyObject *self, void *data);
PyObject *sr_py_koops_stacktrace_get_taint_flags(PyObject *self, void *data);
int sr_py_koops_stacktrace_set_taint_flags(PyObject *self, PyObject *rhs, void *data);
diff --git a/tests/koops_stacktrace.at b/tests/koops_stacktrace.at
index 6fae3a7..c6e5b20 100644
--- a/tests/koops_stacktrace.at
+++ b/tests/koops_stacktrace.at
@@ -280,7 +280,56 @@ main(void)
char *json = sr_koops_stacktrace_to_json(stacktrace);
puts(json);
assert(0 == strcmp(json,
- "{ \"taint_flags\": [ \"module_proprietary\"\n"
+ "{ \"raw_oops\": \"[110417.280426] WARNING: at
mm/page_alloc.c:2204 __alloc_pages_nodemask+0x231/0x8f0()\\n"
+ "[110417.280429] Hardware name: Latitude E6420\\n"
+ "[110417.280431] Modules linked in: vfat fat usb_storage authenc l2tp_ppp pppox
ppp_generic slhc l2tp_netlink "
+ "l2tp_core rmd160 crypto_null camellia lzo cast6 cast5 deflate zlib_deflate cts
gcm ccm serpent_sse2_x86_64 "
+ "serpent_generic blowfish_generic blowfish_x86_64 blowfish_common
twofish_generic twofish_x86_64_3way lrw "
+ "twofish_x86_64 twofish_common xcbc sha256_generic sha512_generic des_generic
ah6 ah4 esp6 esp4 "
+ "xfrm4_mode_beet xfrm4_tunnel tunnel4 xfrm4_mode_tunnel xfrm4_mode_transport
xfrm6_mode_transport "
+ "xfrm6_mode_ro xfrm6_mode_beet xfrm6_mode_tunnel ipcomp ipcomp6 xfrm_ipcomp
xfrm6_tunnel tunnel6 af_key "
+ "snd_usb_audio snd_usbmidi_lib snd_rawmidi sctp libcrc32c tcp_lp wacom fuse
lockd rfcomm bnep "
+ "snd_hda_codec_hdmi snd_hda_codec_idt binfmt_misc arc4 uvcvideo snd_hda_intel
videobuf2_core videodev "
+ "snd_hda_codec ppdev media dell_wmi videobuf2_vmalloc sparse_keymap
videobuf2_memops dell_laptop snd_hwdep "
+ "snd_seq uinput dcdbas snd_seq_device btusb bluetooth iwlwifi snd_pcm parport_pc
\\n"
+ "joydev parport snd_timer microcode mac80211 snd soundcore snd_page_alloc
i2c_i801 cfg80211 iTCO_wdt "
+ "iTCO_vendor_support rfkill e1000e sunrpc xts gf128mul dm_crypt sdhci_pci sdhci
mmc_core wmi i915 "
+ "drm_kms_helper drm i2c_algo_bit i2c_core video [last unloaded:
scsi_wait_scan]\\n"
+ "[110417.280525] Pid: 3, comm: ksoftirqd/0 Tainted: P B D O
3.3.7-1.fc16.x86_64 #1\\n"
+ "[110417.280528] Call Trace:\\n"
+ "[110417.280535] [<ffffffff81057adf>]
warn_slowpath_common+0x7f/0xc0\\n"
+ "[110417.280539] [<ffffffff81057b3a>]
warn_slowpath_null+0x1a/0x20\\n"
+ "[110417.280544] [<ffffffff811296d1>]
__alloc_pages_nodemask+0x231/0x8f0\\n"
+ "[110417.280550] [<ffffffff8151fd80>] ?
ip_copy_metadata+0x1c0/0x1c0\\n"
+ "[110417.280555] [<ffffffff8151f860>] ?
ip_forward_options+0x1f0/0x1f0\\n"
+ "[110417.280559] [<ffffffff81160a93>]
alloc_pages_current+0xa3/0x110\\n"
+ "[110417.280563] [<ffffffff81125514>]
__get_free_pages+0x14/0x50\\n"
+ "[110417.280569] [<ffffffff8116bb5f>]
kmalloc_order_trace+0x3f/0xd0\\n"
+ "[110417.280573] [<ffffffff8116ca87>] __kmalloc+0x177/0x1a0\\n"
+ "[110417.280578] [<ffffffffa0642332>] ? pppol2tp_xmit+0x42/0x220
[l2tp_ppp]\\n"
+ "[110417.280583] [<ffffffff814db0a7>]
pskb_expand_head+0x87/0x310\\n"
+ "[110417.280588] [<ffffffff8113dc59>] ?
__mod_zone_page_state+0x49/0x50\\n"
+ "[110417.280591] [<ffffffff814da0f5>] ? kfree_skb+0x45/0xc0\\n"
+ "[110417.280595] [<ffffffffa06424dd>] pppol2tp_xmit+0x1ed/0x220
[l2tp_ppp]\\n"
+ "[110417.280600] [<ffffffffa062dd5b>] ppp_push+0x15b/0x650
[ppp_generic]\\n"
+ "[110417.280604] [<ffffffff814db264>] ?
pskb_expand_head+0x244/0x310\\n"
+ "[110417.280608] [<ffffffff8112860b>] ?
free_compound_page+0x1b/0x20\\n"
+ "[110417.280612] [<ffffffff8112d053>] ?
__put_compound_page+0x23/0x30\\n"
+ "[110417.280615] [<ffffffff8112d1d5>] ?
put_compound_page+0x125/0x1c0\\n"
+ "[110417.280619] [<ffffffffa062e89f>] ppp_xmit_process+0x46f/0x660
[ppp_generic]\\n"
+ "[110417.280624] [<ffffffffa062ebc8>] ppp_start_xmit+0x138/0x1d0
[ppp_generic]\\n"
+ "[110417.280628] [<ffffffff814e85b2>]
dev_hard_start_xmit+0x332/0x6d0\\n"
+ "[110417.280632] [<ffffffff8150447a>]
sch_direct_xmit+0xfa/0x1d0\\n"
+ "[110417.280635] [<ffffffff815045f6>] __qdisc_run+0xa6/0x130\\n"
+ "[110417.280639] [<ffffffff814e6883>] net_tx_action+0xe3/0x1f0\\n"
+ "[110417.280643] [<ffffffff8105f0c8>] __do_softirq+0xb8/0x230\\n"
+ "[110417.280646] [<ffffffff8105f2fa>] run_ksoftirqd+0xba/0x170\\n"
+ "[110417.280649] [<ffffffff8105f240>] ?
__do_softirq+0x230/0x230\\n"
+ "[110417.280654] [<ffffffff81079da3>] kthread+0x93/0xa0\\n"
+ "[110417.280658] [<ffffffff815fd8e4>]
kernel_thread_helper+0x4/0x10\\n"
+ "[110417.280663] [<ffffffff81079d10>] ?
kthread_freezable_should_stop+0x70/0x70\\n"
+ "[110417.280666] [<ffffffff815fd8e0>] ?
gs_change+0x13/0x13\\n\"\n"
+ ", \"taint_flags\": [ \"module_proprietary\"\n"
" , \"page_release\"\n"
" , \"died_recently\"\n"
" , \"module_out_of_tree\" ]\n"
--
1.8.3.1