From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757712AbZFIBsu (ORCPT ); Mon, 8 Jun 2009 21:48:50 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756856AbZFIBru (ORCPT ); Mon, 8 Jun 2009 21:47:50 -0400 Received: from hrndva-omtalb.mail.rr.com ([71.74.56.124]:52698 "EHLO hrndva-omtalb.mail.rr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753768AbZFIBrq (ORCPT ); Mon, 8 Jun 2009 21:47:46 -0400 Message-Id: <20090609014534.790466803@goodmis.org> User-Agent: quilt/0.46-1 Date: Mon, 08 Jun 2009 21:45:34 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Ingo Molnar , Andrew Morton , Minchan Kim , Mel Gorman , Christoph Hellwig , Rik van Riel , Pekka Enberg , Peter Zijlstra , Frederic Weisbecker , Theodore Tso , Mathieu Desnoyers , Lai Jiangshan , Zhaolei , KOSAKI Motohiro , Jason Baron , Jiaying Zhang Subject: [RFC PATCH 0/5] simplify the print fmt in the event format files Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a request for comments on the new print format style to show in the format file. As more and more users of ftrace are retrieving their data through the binary interface, it has become more important to be able to parse the format of these binary records. Since the output may also be used in dumps of the kernel, it is still important that ftrace has a way within the kernel to display the data records in a human readable format. The current method is with TP_printk, in the TRACE_EVENT. This acts just like a printk and lets the developer print out their format anyway they would like to. But the problem with this is that the readers of the binary data would either have to have a C parser to understand the output, or would have to have a custom made parser to match the contents, and hope that the contents would not change. This patch series creates a new marco called TP_FORMAT that can be used in place of the TP_printk inside the TRACE_EVENT macro. This format has the current following language: * FMT := constant string FMT | COMMAND FMT | empty * COMMAND := | | | * * TYPE := int | hex | ptr | string | strarray * FIELD := defined by the event structure * MASKS := MASK=NAME,MASKS | MASK=NAME * MASK := the bit mask to match * DELIM := delimiter to separate the fields. None and ':' are both allowed * SYMBOLS := SYM=NAME,SYMBOLS | SYM=NAME * SYM := the symbol value to test against * TRUE := print when field is non zero * FALSE := print when field is zero or NULL * NAME := the name to write when a match is found * * A '\<' would print '<' We can extend this langange when we need to. A user app could just ignore a type it does not understand. This is an RFC patch set. I basically just got it working but it lacks some clean ups on errors. And I need to investigate the use of the fields structures to make sure they are adquately protected. It uses the fields that are pased by the filter code. This makes the output of the format much cleaner. We go from this: print fmt: "irq=%d handler=%s", REC->irq, (char *)((void *)REC + REC->__data_loc_name) to this: format: irq= handler= and this: print fmt: "softirq=%d action=%s", REC->vec, ({ static const struct trace_print_flags symbols[] = { { HI_SOFTIRQ, "HI" }, { TIMER_SOFTIRQ, "TIMER" }, { NET_TX_SOFTIRQ, "NET_TX" }, { NET_RX_SOFTIRQ, "NET_RX" }, { BLOCK_SOFTIRQ, "BLOCK" }, { TASKLET_SOFTIRQ, "TASKLET" }, { SCHED_SOFTIRQ, "SCHED" }, { HRTIMER_SOFTIRQ, "HRTIMER" }, { RCU_SOFTIRQ, "RCU" }, { -1, ((void *)0) }}; ftrace_print_symbols_seq (p, REC->vec, symbols); }) To this: format: softirq= action=call_site, REC->ptr, REC->bytes_req, REC->bytes_alloc, (REC->gfp_flags) ? ({ static const struct trace_print_flags flags[] = { {(unsigned long)(((gfp_t)0x10u ) | ((gfp_t)0x40u) | ((gfp_t)0x80u) | ((gfp_t)0x20000u) | ((gfp_t)0x02u) | ((gfp_t)0x100000u)), "GFP_HIGHUSER_MOVABLE"}, {(unsigned long)(((gfp_t)0x10u) | ((gfp_t)0x40u) | ((gfp_t)0x80u) | ((gfp_t)0x20000u) | ((gfp_t)0x02u)), "GFP_HIGHUSER" }, {(unsigned long)(((gfp_t)0x10u) | ((gfp_t)0x40u) | ((gfp_t)0x80u) | ((gfp_t)0x20000u)), "GFP_USER"}, {(unsigned long)(((gfp_t)0x10u) | ((gfp_t)0x40u) | ((gfp_t)0x80u) | ((gfp_t)0x80000u)), "GFP_TEMPORARY"}, {(unsigned long)(((gfp_t)0x10u) | ((gfp_t)0x40u) | ((gfp_t)0x80u)), "GFP_KERNEL"}, {(unsigned long)(((gfp_t)0x10u) | ((gfp_t)0x40u)), "GFP_NOFS"}, {(unsigned long)(((gfp_t)0x20u)), "GFP_ATOMIC"}, {(unsigned long)(((gfp_t)0x10u)), "GFP_NOIO"}, {(unsigned long)((gfp_t)0x20u), "GFP_HIGH"}, {(unsigned long)((gfp_t)0x10u), "GFP_WAIT"}, {(unsigned long)((gfp_t)0x40u), "GFP_IO"}, {(unsigned long)((gfp_t)0x100u), "GFP_COLD"}, {(unsigned long)((gfp_t)0x200u), "GFP_NOWARN"}, {(unsigned long)((gfp_t)0x400u), "GFP_REPEAT"}, {(unsigned long)((gfp_t)0x800u), "GFP_NOFAIL"}, {(unsigned long)((gfp_t)0x1000u), "GFP_NORETRY"}, {(unsigned long)((gfp_t)0x4000u), "GFP_COMP"}, {(unsigned long)((gfp_t)0x8000u), "GFP_ZERO"}, {(unsigned long)((gfp_t)0x10000u), "GFP_NOMEMALLOC"}, {(unsigned long)((gfp_t)0x20000u), "GFP_HARDWALL"}, {(unsigned long)((gfp_t)0x40000u), "GFP_THISNODE"}, {(unsigned long)((gfp_t)0x80000u), "GFP_RECLAIMABLE"}, {(unsigned long)((gfp_t)0x100000u), "GFP_MOVABLE"}, { -1, ((void *)0) }}; ftrace_print_flags_seq(p, "|", REC->gfp_flags, flags); }) : "GFP_NOWAIT" to this: format: call_site= ptr= bytes_req= bytes_alloc= gfp_flags=