linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@kernel.org>
To: Greg KH <gregkh@linuxfoundation.org>
Cc: Christoph Hellwig <hch@infradead.org>,
	Peter Zijlstra <peterz@infradead.org>,
	keescook@chromium.org, will.deacon@arm.com,
	elena.reshetova@intel.com, arnd@arndb.de, tglx@linutronix.de,
	hpa@zytor.com, Linus Torvalds <torvalds@linux-foundation.org>,
	dave@progbits.org, linux-kernel@vger.kernel.org
Subject: [PATCH v2] printk, locking/atomics, kref: Introduce new %pAr and %pAk format string options for atomic_t and 'struct kref'
Date: Tue, 15 Nov 2016 09:43:55 +0100	[thread overview]
Message-ID: <20161115084355.GA24175@gmail.com> (raw)
In-Reply-To: <20161115083736.GA15734@gmail.com>


* Ingo Molnar <mingo@kernel.org> wrote:

> 
> * Greg KH <gregkh@linuxfoundation.org> wrote:
> 
> > On Mon, Nov 14, 2016 at 10:16:55AM -0800, Christoph Hellwig wrote:
> > > On Mon, Nov 14, 2016 at 06:39:48PM +0100, Peter Zijlstra wrote:
> > > > Since we need to change the implementation, stop exposing internals.
> > > > 
> > > > Provide kref_read() to read the current reference count; typically
> > > > used for debug messages.
> > > 
> > > Can we just provide a printk specifier for a kref value instead as
> > > that is the only valid use case for reading the value?
> > 
> > Yeah, that would be great as no one should be doing anything
> > logic-related based on the kref value.
> 
> Find below a patch that implements %pAk for 'struct kref' count printing and
> %pAr for atomic_t counter printing.
> 
> This is against vanilla upstream.

The patch below is against Peter's refcount series. Note that this patch depends 
on this patch in Peter's series:

  kref: Implement using refcount_t

Thanks,

	Ingo

==================================>
Subject: printk, locking/atomics, kref: Introduce new %pAr and %pAk format string options for atomic_t and 'struct kref'
From: Ingo Molnar <mingo@kernel.org>
Date: Tue Nov 15 08:53:14 CET 2016

A decade of kref internals exposed to driver writers has proven that
exposing internals to them is a bad idea.

Make the bad patterns a bit easier to detect and allow cleaner
printouts by offering two new printk format string extensions:

	%pAr - print the atomic_t count in decimal
	%pAk - print the struct kref count in decimal

Also add printf testcases:

  [    0.328495] test_printf: all 268 tests passed

Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 Documentation/printk-formats.txt |   10 +++++++++
 lib/test_printf.c                |   28 ++++++++++++++++++++++++++
 lib/vsprintf.c                   |   42 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+)

Index: tip/Documentation/printk-formats.txt
===================================================================
--- tip.orig/Documentation/printk-formats.txt
+++ tip/Documentation/printk-formats.txt
@@ -316,6 +316,16 @@ Flags bitfields such as page flags, gfp_
 
 	Passed by reference.
 
+atomic variables such atomic_t or struct kref:
+
+	%pAr	atomic_t count
+	%pAk	struct kref count
+
+	For printing the current count value of atomic variables. This is
+	preferred to accessing the counts directly.
+
+	Passed by reference.
+
 Network device features:
 
 	%pNF	0x000000000000c000
Index: tip/lib/test_printf.c
===================================================================
--- tip.orig/lib/test_printf.c
+++ tip/lib/test_printf.c
@@ -20,6 +20,8 @@
 #include <linux/gfp.h>
 #include <linux/mm.h>
 
+#include <linux/kref.h>
+
 #define BUF_SIZE 256
 #define PAD_SIZE 16
 #define FILL_CHAR '$'
@@ -462,6 +464,31 @@ flags(void)
 	kfree(cmp_buffer);
 }
 
+/*
+ * Testcases for %pAr (atomic_t) and %pAk (struct kref) count printing:
+ */
+static void __init test_atomics__atomic_t(void)
+{
+	atomic_t count = ATOMIC_INIT(1);
+
+	test("1", "%pAr", &count);
+}
+
+static void __init test_atomics__kref(void)
+{
+	struct kref kref;
+
+	kref_init(&kref);
+
+	test("1", "%pAk", &kref);
+}
+
+static void __init test_atomics(void)
+{
+	test_atomics__atomic_t();
+	test_atomics__kref();
+}
+
 static void __init
 test_pointer(void)
 {
@@ -481,6 +508,7 @@ test_pointer(void)
 	bitmap();
 	netdev_features();
 	flags();
+	test_atomics();
 }
 
 static int __init
Index: tip/lib/vsprintf.c
===================================================================
--- tip.orig/lib/vsprintf.c
+++ tip/lib/vsprintf.c
@@ -38,6 +38,8 @@
 
 #include "../mm/internal.h"	/* For the trace_print_flags arrays */
 
+#include <linux/kref.h>
+
 #include <asm/page.h>		/* for PAGE_SIZE */
 #include <asm/sections.h>	/* for dereference_function_descriptor() */
 #include <asm/byteorder.h>	/* cpu_to_le16 */
@@ -1470,6 +1472,40 @@ char *flags_string(char *buf, char *end,
 	return format_flags(buf, end, flags, names);
 }
 
+static noinline_for_stack
+char *atomic_var(char *buf, char *end, void *atomic_ptr, const char *fmt)
+{
+	unsigned long num;
+	const struct printf_spec numspec = {
+		.flags		= SPECIAL|SMALL,
+		.field_width	= -1,
+		.precision	= -1,
+		.base		= 10,
+	};
+
+	switch (fmt[1]) {
+		case 'r':
+		{
+			atomic_t *count_p = (void *)atomic_ptr;
+
+			num = atomic_read(count_p);
+			break;
+		}
+		case 'k':
+		{
+			struct kref *kref_p = (void *)atomic_ptr;
+
+			num = refcount_read(&kref_p->refcount);
+			break;
+		}
+		default:
+			WARN_ONCE(1, "Unsupported atomics modifier: %c\n", fmt[1]);
+			return buf;
+	}
+
+	return number(buf, end, num, numspec);
+}
+
 int kptr_restrict __read_mostly;
 
 /*
@@ -1563,6 +1599,10 @@ int kptr_restrict __read_mostly;
  *       p page flags (see struct page) given as pointer to unsigned long
  *       g gfp flags (GFP_* and __GFP_*) given as pointer to gfp_t
  *       v vma flags (VM_*) given as pointer to unsigned long
+ * - 'A' For the count of atomic variables to be printed.
+ *       Supported flags given by option:
+ *        r atomic_t    ('r'aw count)
+ *        k struct kref ('k'ref count)
  *
  * ** Please update also Documentation/printk-formats.txt when making changes **
  *
@@ -1718,6 +1758,8 @@ char *pointer(const char *fmt, char *buf
 
 	case 'G':
 		return flags_string(buf, end, ptr, fmt);
+	case 'A':
+		return atomic_var(buf, end, ptr, fmt);
 	}
 	spec.flags |= SMALL;
 	if (spec.field_width == -1) {

  reply	other threads:[~2016-11-15  8:44 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-14 17:39 [RFC][PATCH 0/7] kref improvements Peter Zijlstra
2016-11-14 17:39 ` [RFC][PATCH 1/7] kref: Add KREF_INIT() Peter Zijlstra
2016-11-14 17:39 ` [RFC][PATCH 2/7] kref: Add kref_read() Peter Zijlstra
2016-11-14 18:16   ` Christoph Hellwig
2016-11-15  7:28     ` Greg KH
2016-11-15  7:47       ` Peter Zijlstra
2016-11-15  8:37       ` [PATCH] printk, locking/atomics, kref: Introduce new %pAr and %pAk format string options for atomic_t and 'struct kref' Ingo Molnar
2016-11-15  8:43         ` Ingo Molnar [this message]
2016-11-15  9:21           ` [PATCH v2] " Peter Zijlstra
2016-11-15  9:41             ` [PATCH v3] printk, locking/atomics, kref: Introduce new %pAa " Ingo Molnar
2016-11-15 10:10           ` [PATCH v2] printk, locking/atomics, kref: Introduce new %pAr " kbuild test robot
2016-11-15 16:42         ` [PATCH] " Linus Torvalds
2016-11-16  8:13           ` Ingo Molnar
2016-11-15  7:33   ` [RFC][PATCH 2/7] kref: Add kref_read() Greg KH
2016-11-15  8:03     ` Peter Zijlstra
2016-11-15 20:53       ` Kees Cook
2016-11-16  8:21         ` Greg KH
2016-11-16 10:10           ` Peter Zijlstra
2016-11-16 10:18             ` Greg KH
2016-11-16 10:11           ` Daniel Borkmann
2016-11-16 10:19             ` Greg KH
2016-11-16 10:09         ` Peter Zijlstra
2016-11-16 18:58           ` Kees Cook
2016-11-17  8:34             ` Peter Zijlstra
2016-11-17 12:30               ` David Windsor
2016-11-17 12:43                 ` Peter Zijlstra
2016-11-17 13:01                   ` Reshetova, Elena
2016-11-17 13:22                     ` Peter Zijlstra
2016-11-17 15:42                       ` Reshetova, Elena
2016-11-17 18:02                       ` Reshetova, Elena
2016-11-17 19:10                         ` Peter Zijlstra
2016-11-17 19:29                         ` Peter Zijlstra
2016-11-17 19:34               ` Kees Cook
2016-11-14 17:39 ` [RFC][PATCH 3/7] kref: Kill kref_sub() Peter Zijlstra
2016-11-14 17:39 ` [RFC][PATCH 4/7] kref: Use kref_get_unless_zero() more Peter Zijlstra
2016-11-14 17:39 ` [RFC][PATCH 5/7] kref: Implement kref_put_lock() Peter Zijlstra
2016-11-14 20:35   ` Kees Cook
2016-11-15  7:50     ` Peter Zijlstra
2016-11-14 17:39 ` [RFC][PATCH 6/7] kref: Avoid more abuse Peter Zijlstra
2016-11-14 17:39 ` [RFC][PATCH 7/7] kref: Implement using refcount_t Peter Zijlstra
2016-11-15  8:40   ` Ingo Molnar
2016-11-15  9:47     ` Peter Zijlstra
2016-11-15 10:03       ` Ingo Molnar
2016-11-15 10:46         ` Peter Zijlstra
2016-11-15 13:03           ` Ingo Molnar
2016-11-15 18:06             ` Kees Cook
2016-11-15 19:16               ` Peter Zijlstra
2016-11-15 19:23                 ` Kees Cook
2016-11-16  8:31                   ` Ingo Molnar
2016-11-16  8:51                     ` Greg KH
2016-11-16  9:07                       ` Ingo Molnar
2016-11-16  9:24                         ` Greg KH
2016-11-16 10:15                     ` Peter Zijlstra
2016-11-16 18:55                       ` Kees Cook
2016-11-17  8:33                         ` Peter Zijlstra
2016-11-17 19:50                           ` Kees Cook
2016-11-16 18:41                     ` Kees Cook
2016-11-15 12:33   ` Boqun Feng
2016-11-15 13:01     ` Peter Zijlstra
2016-11-15 14:19       ` Boqun Feng
2016-11-17  9:28         ` Peter Zijlstra
2016-11-17  9:48           ` Boqun Feng
2016-11-17 10:29             ` Peter Zijlstra
2016-11-17 10:39               ` Peter Zijlstra
2016-11-17 11:03                 ` Greg KH
2016-11-17 12:48                   ` Peter Zijlstra
     [not found]               ` <CAL0jBu-GnREUPSX4kUDp-Cc8ZGp6+Cb2q0HVandswcLzPRnChQ@mail.gmail.com>
2016-11-17 12:08                 ` Peter Zijlstra
2016-11-17 12:08           ` Will Deacon
2016-11-17 16:11             ` Peter Zijlstra
2016-11-17 16:36               ` Will Deacon
2016-11-18  8:26                 ` Boqun Feng
2016-11-18 10:16                   ` Will Deacon
2016-11-18 10:07   ` Reshetova, Elena
2016-11-18 11:37     ` Peter Zijlstra
2016-11-18 17:06       ` Will Deacon
2016-11-18 18:57         ` Peter Zijlstra
2016-11-21  4:06         ` Boqun Feng
2016-11-21  7:48           ` Ingo Molnar
2016-11-21  8:38             ` Boqun Feng
2016-11-21  8:44       ` Boqun Feng
2016-11-21  9:02         ` Peter Zijlstra
2016-11-21  9:37           ` Boqun Feng
2016-11-18 10:47   ` Reshetova, Elena
2016-11-18 10:52     ` Peter Zijlstra
2016-11-18 16:58       ` Reshetova, Elena
2016-11-18 18:53         ` Peter Zijlstra
2016-11-19  7:14           ` Reshetova, Elena
2016-11-19 11:45             ` Peter Zijlstra
2017-01-26 23:14   ` Kees Cook
2017-01-27  9:58     ` Peter Zijlstra
2017-01-27 21:07       ` Kees Cook
2017-01-30 13:40         ` Peter Zijlstra
2016-11-15  7:27 ` [RFC][PATCH 0/7] kref improvements Greg KH
2016-11-15  7:42   ` Ingo Molnar
2016-11-15 15:05     ` Greg KH
2016-11-15  7:48   ` Peter Zijlstra

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=20161115084355.GA24175@gmail.com \
    --to=mingo@kernel.org \
    --cc=arnd@arndb.de \
    --cc=dave@progbits.org \
    --cc=elena.reshetova@intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hch@infradead.org \
    --cc=hpa@zytor.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=will.deacon@arm.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;
as well as URLs for NNTP newsgroup(s).