public inbox for dwarves@vger.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Willy Tarreau <w@1wt.eu>
Cc: dwarves@vger.kernel.org, Alan Maguire <alan.maguire@oracle.com>,
	Jiri Olsa <jolsa@kernel.org>,
	Clark Williams <williams@redhat.com>,
	Kate Carcia <kcarcia@redhat.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>,
	"Gustavo A. R. Silva" <gustavoars@kernel.org>
Subject: [PATCH 1/2] pahole: Add --padding_ge N to show only structs with at least N bytes of padding at its end
Date: Fri, 27 Sep 2024 15:59:57 -0300	[thread overview]
Message-ID: <20240927185958.37310-2-acme@kernel.org> (raw)
In-Reply-To: <20240927185958.37310-1-acme@kernel.org>

From: Arnaldo Carvalho de Melo <acme@redhat.com>

Example usage:

  $ pahole --padding_ge 4 --with_flexible_array
  <SNIP>
  struct netprio_map {
          struct callback_head       rcu;                  /*     0    16 */
          u32                        priomap_len;          /*    16     4 */
          u32                        priomap[];            /*    20     0 */

          /* size: 24, cachelines: 1, members: 3 */
          /* padding: 4 */
          /* last cacheline: 24 bytes */
  };
  <SNIP>

One can combine with -x/--exclude to remove from the output common
patterns such as 'struct trace_event_' structs:

  $ pahole --with_flexible_array --padding_ge 4 --exclude trace_event_ | grep ^struct
  struct rseq {
  struct mem_cgroup {
  struct netprio_map {
  struct qdisc_size_table {
  struct sysinfo {
  struct ethtool_rxnfc {
  struct ioam6_schema {
  struct poll_list {
  struct posix_acl {
  struct proc_dir_entry {
  struct scsi_vpd {
  struct xsk_buff_pool {
  struct ieee80211_regdomain {
  struct watch_filter {
  struct landlock_rule {
  struct ghes_vendor_record_entry {
  struct packet_fanout {
  struct name_cache_entry {
  struct workqueue_struct {
  struct svc_deferred_req {
  struct cis_cache_entry {
  struct sem_undo {
  struct sidtab_str_cache {
  struct pcpu_chunk {
  struct pericom8250 {
  struct dm_name_list {
  struct linux_dirent64 {
  struct old_linux_dirent {
  struct linux_dirent {
  $

Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Willy Tarreau <w@1wt.eu>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 man-pages/pahole.1 |  4 ++++
 pahole.c           | 12 +++++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/man-pages/pahole.1 b/man-pages/pahole.1
index 0a9d8ac49fbf94d5..840f8e13807ba1be 100644
--- a/man-pages/pahole.1
+++ b/man-pages/pahole.1
@@ -223,6 +223,10 @@ Find pointers to CLASS_NAME.
 .B \-H, \-\-holes=NR_HOLES
 Show only structs with at least NR_HOLES holes.
 
+.TP
+.B \-\-padding_ge=SIZE_PADDING
+Show only structs with at least SIZE_PADDING bytes of padding at its end.
+
 .TP
 .B \-I, \-\-show_decl_info
 Show the file and line number where the tags were defined, if available in
diff --git a/pahole.c b/pahole.c
index a33490d698ead7d5..56b0ca0c55993100 100644
--- a/pahole.c
+++ b/pahole.c
@@ -60,6 +60,7 @@ static char *decl_exclude_prefix;
 static size_t decl_exclude_prefix_len;
 
 static uint16_t nr_holes;
+static uint16_t end_padding_ge;
 static uint16_t nr_bit_holes;
 static uint16_t hole_size_ge;
 static uint8_t show_packable;
@@ -824,12 +825,13 @@ static struct class *class__filter(struct class *class, struct cu *cu,
 	 * that need finding holes, like --packable, --nr_holes, etc
 	 */
 	if (!tag__is_struct(tag))
-		return (just_structs || show_packable || nr_holes || nr_bit_holes || hole_size_ge) ? NULL : class;
+		return (just_structs || show_packable || nr_holes || nr_bit_holes || hole_size_ge || end_padding_ge) ? NULL : class;
 
 	if (tag->top_level)
 		class__find_holes(class);
 
 	if (class->nr_holes < nr_holes ||
+	    class->padding < end_padding_ge ||
 	    class->nr_bit_holes < nr_bit_holes ||
 	    (hole_size_ge != 0 && !class__has_hole_ge(class, hole_size_ge)))
 		return NULL;
@@ -1239,6 +1241,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
 #define ARGP_contains_enumerator 344
 #define ARGP_reproducible_build 345
 #define ARGP_running_kernel_vmlinux 346
+#define ARG_PADDING_GE		   347
 
 /* --btf_features=feature1[,feature2,..] allows us to specify
  * a list of requested BTF features or "default" to enable all default
@@ -1494,6 +1497,12 @@ static const struct argp_option pahole__options[] = {
 		.arg  = "NR_HOLES",
 		.doc  = "show only structs with at least NR_HOLES holes",
 	},
+	{
+		.name = "padding_ge",
+		.key  = ARG_PADDING_GE,
+		.arg  = "SIZE_PADDING",
+		.doc  = "show only structs with at least SIZE_PADDING bytes padding at its end",
+	},
 	{
 		.name = "hole_size_ge",
 		.key  = 'z',
@@ -1885,6 +1894,7 @@ static error_t pahole__options_parser(int key, char *arg,
 		  class_name = arg;			break;
 	case 'F': conf_load.format_path = arg;		break;
 	case 'H': nr_holes = atoi(arg);			break;
+	case ARG_PADDING_GE: end_padding_ge = atoi(arg); break;
 	case 'I': conf.show_decl_info = 1;
 		  conf_load.extra_dbg_info = 1;		break;
 	case 'i': find_containers = 1;
-- 
2.46.0


  reply	other threads:[~2024-09-27 19:00 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-27 18:59 [PATCH 0/2] --padding option to combine with --with_flexible_array Arnaldo Carvalho de Melo
2024-09-27 18:59 ` Arnaldo Carvalho de Melo [this message]
2024-09-27 18:59 ` [PATCH 2/2] pahole: Add --padding N to show only structs with N bytes of padding at its end Arnaldo Carvalho de Melo
2024-09-27 19:22 ` [PATCH 0/2] --padding option to combine with --with_flexible_array Gustavo A. R. Silva
2024-09-27 19:39   ` Arnaldo Carvalho de Melo
2024-09-27 20:08     ` Gustavo A. R. Silva
2024-09-27 21:15 ` Willy Tarreau
2024-09-28  4:36   ` Willy Tarreau
2024-09-30 14:32     ` Arnaldo Carvalho de Melo

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=20240927185958.37310-2-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=alan.maguire@oracle.com \
    --cc=dwarves@vger.kernel.org \
    --cc=gustavoars@kernel.org \
    --cc=jolsa@kernel.org \
    --cc=kcarcia@redhat.com \
    --cc=w@1wt.eu \
    --cc=williams@redhat.com \
    /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