All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Vyukov <dvyukov@google.com>
To: Suren Baghdasaryan <surenb@google.com>
Cc: akpm@linux-foundation.org, kent.overstreet@linux.dev,
	mhocko@suse.com, vbabka@suse.cz, hannes@cmpxchg.org,
	roman.gushchin@linux.dev, mgorman@suse.de, dave@stgolabs.net,
	willy@infradead.org, liam.howlett@oracle.com, void@manifault.com,
	peterz@infradead.org, juri.lelli@redhat.com,
	ldufour@linux.ibm.com, peterx@redhat.com, david@redhat.com,
	axboe@kernel.dk, mcgrof@kernel.org, masahiroy@kernel.org,
	nathan@kernel.org, changbin.du@intel.com, ytcoode@gmail.com,
	vincent.guittot@linaro.org, dietmar.eggemann@arm.com,
	rostedt@goodmis.org, bsegall@google.com, bristot@redhat.com,
	vschneid@redhat.com, cl@linux.com, penberg@kernel.org,
	iamjoonsoo.kim@lge.com, 42.hyeyoo@gmail.com, glider@google.com,
	elver@google.com, shakeelb@google.com, songmuchun@bytedance.com,
	arnd@arndb.de, jbaron@akamai.com, rientjes@google.com,
	minchan@google.com, kaleshsingh@google.com,
	kernel-team@android.com, linux-mm@kvack.org,
	iommu@lists.linux.dev, kasan-dev@googlegroups.com,
	io-uring@vger.kernel.org, linux-arch@vger.kernel.org,
	xen-devel@lists.xenproject.org, linux-bcache@vger.kernel.org,
	linux-modules@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH 22/30] Code tagging based fault injection
Date: Wed, 31 Aug 2022 12:37:14 +0200	[thread overview]
Message-ID: <CACT4Y+ZX3U1=cAPXPhoOy6xrngSCfSmyFagXK-9fWtWWODfsew@mail.gmail.com> (raw)
In-Reply-To: <20220830214919.53220-23-surenb@google.com>

On Tue, 30 Aug 2022 at 23:50, Suren Baghdasaryan <surenb@google.com> wrote:
>
> From: Kent Overstreet <kent.overstreet@linux.dev>
>
> This adds a new fault injection capability, based on code tagging.
>
> To use, simply insert somewhere in your code
>
>   dynamic_fault("fault_class_name")
>
> and check whether it returns true - if so, inject the error.
> For example
>
>   if (dynamic_fault("init"))
>       return -EINVAL;

Hi Suren,

If this is going to be used by mainline kernel, it would be good to
integrate this with fail_nth systematic fault injection:
https://elixir.bootlin.com/linux/latest/source/lib/fault-inject.c#L109

Otherwise these dynamic sites won't be tested by testing systems doing
systematic fault injection testing.


> There's no need to define faults elsewhere, as with
> include/linux/fault-injection.h. Faults show up in debugfs, under
> /sys/kernel/debug/dynamic_faults, and can be selected based on
> file/module/function/line number/class, and enabled permanently, or in
> oneshot mode, or with a specified frequency.
>
> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
> ---
>  include/asm-generic/codetag.lds.h |   3 +-
>  include/linux/dynamic_fault.h     |  79 +++++++
>  include/linux/slab.h              |   3 +-
>  lib/Kconfig.debug                 |   6 +
>  lib/Makefile                      |   2 +
>  lib/dynamic_fault.c               | 372 ++++++++++++++++++++++++++++++
>  6 files changed, 463 insertions(+), 2 deletions(-)
>  create mode 100644 include/linux/dynamic_fault.h
>  create mode 100644 lib/dynamic_fault.c
>
> diff --git a/include/asm-generic/codetag.lds.h b/include/asm-generic/codetag.lds.h
> index 64f536b80380..16fbf74edc3d 100644
> --- a/include/asm-generic/codetag.lds.h
> +++ b/include/asm-generic/codetag.lds.h
> @@ -9,6 +9,7 @@
>         __stop_##_name = .;
>
>  #define CODETAG_SECTIONS()             \
> -       SECTION_WITH_BOUNDARIES(alloc_tags)
> +       SECTION_WITH_BOUNDARIES(alloc_tags)             \
> +       SECTION_WITH_BOUNDARIES(dynamic_fault_tags)
>
>  #endif /* __ASM_GENERIC_CODETAG_LDS_H */
> diff --git a/include/linux/dynamic_fault.h b/include/linux/dynamic_fault.h
> new file mode 100644
> index 000000000000..526a33209e94
> --- /dev/null
> +++ b/include/linux/dynamic_fault.h
> @@ -0,0 +1,79 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +
> +#ifndef _LINUX_DYNAMIC_FAULT_H
> +#define _LINUX_DYNAMIC_FAULT_H
> +
> +/*
> + * Dynamic/code tagging fault injection:
> + *
> + * Originally based on the dynamic debug trick of putting types in a special elf
> + * section, then rewritten using code tagging:
> + *
> + * To use, simply insert a call to dynamic_fault("fault_class"), which will
> + * return true if an error should be injected.
> + *
> + * Fault injection sites may be listed and enabled via debugfs, under
> + * /sys/kernel/debug/dynamic_faults.
> + */
> +
> +#ifdef CONFIG_CODETAG_FAULT_INJECTION
> +
> +#include <linux/codetag.h>
> +#include <linux/jump_label.h>
> +
> +#define DFAULT_STATES()                \
> +       x(disabled)             \
> +       x(enabled)              \
> +       x(oneshot)
> +
> +enum dfault_enabled {
> +#define x(n)   DFAULT_##n,
> +       DFAULT_STATES()
> +#undef x
> +};
> +
> +union dfault_state {
> +       struct {
> +               unsigned int            enabled:2;
> +               unsigned int            count:30;
> +       };
> +
> +       struct {
> +               unsigned int            v;
> +       };
> +};
> +
> +struct dfault {
> +       struct codetag          tag;
> +       const char              *class;
> +       unsigned int            frequency;
> +       union dfault_state      state;
> +       struct static_key_false enabled;
> +};
> +
> +bool __dynamic_fault_enabled(struct dfault *df);
> +
> +#define dynamic_fault(_class)                          \
> +({                                                     \
> +       static struct dfault                            \
> +       __used                                          \
> +       __section("dynamic_fault_tags")                 \
> +       __aligned(8) df = {                             \
> +               .tag    = CODE_TAG_INIT,                \
> +               .class  = _class,                       \
> +               .enabled = STATIC_KEY_FALSE_INIT,       \
> +       };                                              \
> +                                                       \
> +       static_key_false(&df.enabled.key) &&            \
> +               __dynamic_fault_enabled(&df);           \
> +})
> +
> +#else
> +
> +#define dynamic_fault(_class)  false
> +
> +#endif /* CODETAG_FAULT_INJECTION */
> +
> +#define memory_fault()         dynamic_fault("memory")
> +
> +#endif /* _LINUX_DYNAMIC_FAULT_H */
> diff --git a/include/linux/slab.h b/include/linux/slab.h
> index 89273be35743..4be5a93ed15a 100644
> --- a/include/linux/slab.h
> +++ b/include/linux/slab.h
> @@ -17,6 +17,7 @@
>  #include <linux/types.h>
>  #include <linux/workqueue.h>
>  #include <linux/percpu-refcount.h>
> +#include <linux/dynamic_fault.h>
>
>
>  /*
> @@ -468,7 +469,7 @@ static inline void slab_tag_dec(const void *ptr) {}
>
>  #define krealloc_hooks(_p, _do_alloc)                                  \
>  ({                                                                     \
> -       void *_res = _do_alloc;                                         \
> +       void *_res = !memory_fault() ? _do_alloc : NULL;                \
>         slab_tag_add(_p, _res);                                         \
>         _res;                                                           \
>  })
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index 2790848464f1..b7d03afbc808 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -1982,6 +1982,12 @@ config FAULT_INJECTION_STACKTRACE_FILTER
>         help
>           Provide stacktrace filter for fault-injection capabilities
>
> +config CODETAG_FAULT_INJECTION
> +       bool "Code tagging based fault injection"
> +       select CODE_TAGGING
> +       help
> +         Dynamic fault injection based on code tagging
> +
>  config ARCH_HAS_KCOV
>         bool
>         help
> diff --git a/lib/Makefile b/lib/Makefile
> index 99f732156673..489ea000c528 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -231,6 +231,8 @@ obj-$(CONFIG_CODE_TAGGING) += codetag.o
>  obj-$(CONFIG_ALLOC_TAGGING) += alloc_tag.o
>  obj-$(CONFIG_PAGE_ALLOC_TAGGING) += pgalloc_tag.o
>
> +obj-$(CONFIG_CODETAG_FAULT_INJECTION) += dynamic_fault.o
> +
>  lib-$(CONFIG_GENERIC_BUG) += bug.o
>
>  obj-$(CONFIG_HAVE_ARCH_TRACEHOOK) += syscall.o
> diff --git a/lib/dynamic_fault.c b/lib/dynamic_fault.c
> new file mode 100644
> index 000000000000..4c9cd18686be
> --- /dev/null
> +++ b/lib/dynamic_fault.c
> @@ -0,0 +1,372 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +
> +#include <linux/ctype.h>
> +#include <linux/debugfs.h>
> +#include <linux/dynamic_fault.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/seq_buf.h>
> +
> +static struct codetag_type *cttype;
> +
> +bool __dynamic_fault_enabled(struct dfault *df)
> +{
> +       union dfault_state old, new;
> +       unsigned int v = df->state.v;
> +       bool ret;
> +
> +       do {
> +               old.v = new.v = v;
> +
> +               if (new.enabled == DFAULT_disabled)
> +                       return false;
> +
> +               ret = df->frequency
> +                       ? ++new.count >= df->frequency
> +                       : true;
> +               if (ret)
> +                       new.count = 0;
> +               if (ret && new.enabled == DFAULT_oneshot)
> +                       new.enabled = DFAULT_disabled;
> +       } while ((v = cmpxchg(&df->state.v, old.v, new.v)) != old.v);
> +
> +       if (ret)
> +               pr_debug("returned true for %s:%u", df->tag.filename, df->tag.lineno);
> +
> +       return ret;
> +}
> +EXPORT_SYMBOL(__dynamic_fault_enabled);
> +
> +static const char * const dfault_state_strs[] = {
> +#define x(n)   #n,
> +       DFAULT_STATES()
> +#undef x
> +       NULL
> +};
> +
> +static void dynamic_fault_to_text(struct seq_buf *out, struct dfault *df)
> +{
> +       codetag_to_text(out, &df->tag);
> +       seq_buf_printf(out, "class:%s %s \"", df->class,
> +                      dfault_state_strs[df->state.enabled]);
> +}
> +
> +struct dfault_query {
> +       struct codetag_query q;
> +
> +       bool            set_enabled:1;
> +       unsigned int    enabled:2;
> +
> +       bool            set_frequency:1;
> +       unsigned int    frequency;
> +};
> +
> +/*
> + * Search the tables for _dfault's which match the given
> + * `query' and apply the `flags' and `mask' to them.  Tells
> + * the user which dfault's were changed, or whether none
> + * were matched.
> + */
> +static int dfault_change(struct dfault_query *query)
> +{
> +       struct codetag_iterator ct_iter;
> +       struct codetag *ct;
> +       unsigned int nfound = 0;
> +
> +       codetag_lock_module_list(cttype, true);
> +       codetag_init_iter(&ct_iter, cttype);
> +
> +       while ((ct = codetag_next_ct(&ct_iter))) {
> +               struct dfault *df = container_of(ct, struct dfault, tag);
> +
> +               if (!codetag_matches_query(&query->q, ct, ct_iter.cmod, df->class))
> +                       continue;
> +
> +               if (query->set_enabled &&
> +                   query->enabled != df->state.enabled) {
> +                       if (query->enabled != DFAULT_disabled)
> +                               static_key_slow_inc(&df->enabled.key);
> +                       else if (df->state.enabled != DFAULT_disabled)
> +                               static_key_slow_dec(&df->enabled.key);
> +
> +                       df->state.enabled = query->enabled;
> +               }
> +
> +               if (query->set_frequency)
> +                       df->frequency = query->frequency;
> +
> +               pr_debug("changed %s:%d [%s]%s #%d %s",
> +                        df->tag.filename, df->tag.lineno, df->tag.modname,
> +                        df->tag.function, query->q.cur_index,
> +                        dfault_state_strs[df->state.enabled]);
> +
> +               nfound++;
> +       }
> +
> +       pr_debug("dfault: %u matches", nfound);
> +
> +       codetag_lock_module_list(cttype, false);
> +
> +       return nfound ? 0 : -ENOENT;
> +}
> +
> +#define DFAULT_TOKENS()                \
> +       x(disable,      0)      \
> +       x(enable,       0)      \
> +       x(oneshot,      0)      \
> +       x(frequency,    1)
> +
> +enum dfault_token {
> +#define x(name, nr_args)       TOK_##name,
> +       DFAULT_TOKENS()
> +#undef x
> +};
> +
> +static const char * const dfault_token_strs[] = {
> +#define x(name, nr_args)       #name,
> +       DFAULT_TOKENS()
> +#undef x
> +       NULL
> +};
> +
> +static unsigned int dfault_token_nr_args[] = {
> +#define x(name, nr_args)       nr_args,
> +       DFAULT_TOKENS()
> +#undef x
> +};
> +
> +static enum dfault_token str_to_token(const char *word, unsigned int nr_words)
> +{
> +       int tok = match_string(dfault_token_strs, ARRAY_SIZE(dfault_token_strs), word);
> +
> +       if (tok < 0) {
> +               pr_debug("unknown keyword \"%s\"", word);
> +               return tok;
> +       }
> +
> +       if (nr_words < dfault_token_nr_args[tok]) {
> +               pr_debug("insufficient arguments to \"%s\"", word);
> +               return -EINVAL;
> +       }
> +
> +       return tok;
> +}
> +
> +static int dfault_parse_command(struct dfault_query *query,
> +                               enum dfault_token tok,
> +                               char *words[], size_t nr_words)
> +{
> +       unsigned int i = 0;
> +       int ret;
> +
> +       switch (tok) {
> +       case TOK_disable:
> +               query->set_enabled = true;
> +               query->enabled = DFAULT_disabled;
> +               break;
> +       case TOK_enable:
> +               query->set_enabled = true;
> +               query->enabled = DFAULT_enabled;
> +               break;
> +       case TOK_oneshot:
> +               query->set_enabled = true;
> +               query->enabled = DFAULT_oneshot;
> +               break;
> +       case TOK_frequency:
> +               query->set_frequency = 1;
> +               ret = kstrtouint(words[i++], 10, &query->frequency);
> +               if (ret)
> +                       return ret;
> +
> +               if (!query->set_enabled) {
> +                       query->set_enabled = 1;
> +                       query->enabled = DFAULT_enabled;
> +               }
> +               break;
> +       }
> +
> +       return i;
> +}
> +
> +static int dynamic_fault_store(char *buf)
> +{
> +       struct dfault_query query = { NULL };
> +#define MAXWORDS 9
> +       char *tok, *words[MAXWORDS];
> +       int ret, nr_words, i = 0;
> +
> +       buf = codetag_query_parse(&query.q, buf);
> +       if (IS_ERR(buf))
> +               return PTR_ERR(buf);
> +
> +       while ((tok = strsep_no_empty(&buf, " \t\r\n"))) {
> +               if (nr_words == ARRAY_SIZE(words))
> +                       return -EINVAL; /* ran out of words[] before bytes */
> +               words[nr_words++] = tok;
> +       }
> +
> +       while (i < nr_words) {
> +               const char *tok_str = words[i++];
> +               enum dfault_token tok = str_to_token(tok_str, nr_words - i);
> +
> +               if (tok < 0)
> +                       return tok;
> +
> +               ret = dfault_parse_command(&query, tok, words + i, nr_words - i);
> +               if (ret < 0)
> +                       return ret;
> +
> +               i += ret;
> +               BUG_ON(i > nr_words);
> +       }
> +
> +       pr_debug("q->function=\"%s\" q->filename=\"%s\" "
> +                "q->module=\"%s\" q->line=%u-%u\n q->index=%u-%u",
> +                query.q.function, query.q.filename, query.q.module,
> +                query.q.first_line, query.q.last_line,
> +                query.q.first_index, query.q.last_index);
> +
> +       ret = dfault_change(&query);
> +       if (ret < 0)
> +               return ret;
> +
> +       return 0;
> +}
> +
> +struct dfault_iter {
> +       struct codetag_iterator ct_iter;
> +
> +       struct seq_buf          buf;
> +       char                    rawbuf[4096];
> +};
> +
> +static int dfault_open(struct inode *inode, struct file *file)
> +{
> +       struct dfault_iter *iter;
> +
> +       iter = kzalloc(sizeof(*iter), GFP_KERNEL);
> +       if (!iter)
> +               return -ENOMEM;
> +
> +       codetag_lock_module_list(cttype, true);
> +       codetag_init_iter(&iter->ct_iter, cttype);
> +       codetag_lock_module_list(cttype, false);
> +
> +       file->private_data = iter;
> +       seq_buf_init(&iter->buf, iter->rawbuf, sizeof(iter->rawbuf));
> +       return 0;
> +}
> +
> +static int dfault_release(struct inode *inode, struct file *file)
> +{
> +       struct dfault_iter *iter = file->private_data;
> +
> +       kfree(iter);
> +       return 0;
> +}
> +
> +struct user_buf {
> +       char __user             *buf;   /* destination user buffer */
> +       size_t                  size;   /* size of requested read */
> +       ssize_t                 ret;    /* bytes read so far */
> +};
> +
> +static int flush_ubuf(struct user_buf *dst, struct seq_buf *src)
> +{
> +       if (src->len) {
> +               size_t bytes = min_t(size_t, src->len, dst->size);
> +               int err = copy_to_user(dst->buf, src->buffer, bytes);
> +
> +               if (err)
> +                       return err;
> +
> +               dst->ret        += bytes;
> +               dst->buf        += bytes;
> +               dst->size       -= bytes;
> +               src->len        -= bytes;
> +               memmove(src->buffer, src->buffer + bytes, src->len);
> +       }
> +
> +       return 0;
> +}
> +
> +static ssize_t dfault_read(struct file *file, char __user *ubuf,
> +                          size_t size, loff_t *ppos)
> +{
> +       struct dfault_iter *iter = file->private_data;
> +       struct user_buf buf = { .buf = ubuf, .size = size };
> +       struct codetag *ct;
> +       struct dfault *df;
> +       int err;
> +
> +       codetag_lock_module_list(iter->ct_iter.cttype, true);
> +       while (1) {
> +               err = flush_ubuf(&buf, &iter->buf);
> +               if (err || !buf.size)
> +                       break;
> +
> +               ct = codetag_next_ct(&iter->ct_iter);
> +               if (!ct)
> +                       break;
> +
> +               df = container_of(ct, struct dfault, tag);
> +               dynamic_fault_to_text(&iter->buf, df);
> +               seq_buf_putc(&iter->buf, '\n');
> +       }
> +       codetag_lock_module_list(iter->ct_iter.cttype, false);
> +
> +       return err ?: buf.ret;
> +}
> +
> +/*
> + * File_ops->write method for <debugfs>/dynamic_fault/conrol.  Gathers the
> + * command text from userspace, parses and executes it.
> + */
> +static ssize_t dfault_write(struct file *file, const char __user *ubuf,
> +                           size_t len, loff_t *offp)
> +{
> +       char tmpbuf[256];
> +
> +       if (len == 0)
> +               return 0;
> +       /* we don't check *offp -- multiple writes() are allowed */
> +       if (len > sizeof(tmpbuf)-1)
> +               return -E2BIG;
> +       if (copy_from_user(tmpbuf, ubuf, len))
> +               return -EFAULT;
> +       tmpbuf[len] = '\0';
> +       pr_debug("read %zu bytes from userspace", len);
> +
> +       dynamic_fault_store(tmpbuf);
> +
> +       *offp += len;
> +       return len;
> +}
> +
> +static const struct file_operations dfault_ops = {
> +       .owner  = THIS_MODULE,
> +       .open   = dfault_open,
> +       .release = dfault_release,
> +       .read   = dfault_read,
> +       .write  = dfault_write
> +};
> +
> +static int __init dynamic_fault_init(void)
> +{
> +       const struct codetag_type_desc desc = {
> +               .section = "dynamic_fault_tags",
> +               .tag_size = sizeof(struct dfault),
> +       };
> +       struct dentry *debugfs_file;
> +
> +       cttype = codetag_register_type(&desc);
> +       if (IS_ERR_OR_NULL(cttype))
> +               return PTR_ERR(cttype);
> +
> +       debugfs_file = debugfs_create_file("dynamic_faults", 0666, NULL, NULL, &dfault_ops);
> +       if (IS_ERR(debugfs_file))
> +               return PTR_ERR(debugfs_file);
> +
> +       return 0;
> +}
> +module_init(dynamic_fault_init);
> --
> 2.37.2.672.g94769d06f0-goog
>

  parent reply	other threads:[~2022-08-31 10:37 UTC|newest]

Thread overview: 142+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-30 21:48 [RFC PATCH 00/30] Code tagging framework and applications Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 01/30] kernel/module: move find_kallsyms_symbol_value declaration Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 02/30] lib/string_helpers: Drop space in string_get_size's output Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 03/30] Lazy percpu counters Suren Baghdasaryan
2022-08-31 10:02   ` Mel Gorman
2022-08-31 15:37     ` Suren Baghdasaryan
2022-08-31 16:20     ` Kent Overstreet
2022-09-01  6:51   ` Peter Zijlstra
2022-09-01 14:32     ` Kent Overstreet
2022-09-01 14:48       ` Steven Rostedt
2022-09-01 15:43         ` Kent Overstreet
2022-09-01 18:59       ` Peter Zijlstra
2022-08-30 21:48 ` [RFC PATCH 04/30] scripts/kallysms: Always include __start and __stop symbols Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 05/30] lib: code tagging framework Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 06/30] lib: code tagging module support Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 07/30] lib: add support for allocation tagging Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 08/30] lib: introduce page " Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 09/30] change alloc_pages name in dma_map_ops to avoid name conflicts Suren Baghdasaryan
2022-08-30 21:48 ` [RFC PATCH 10/30] mm: enable page allocation tagging for __get_free_pages and alloc_pages Suren Baghdasaryan
2022-08-31 10:11   ` Mel Gorman
2022-08-31 15:45     ` Suren Baghdasaryan
2022-08-31 15:52       ` Suren Baghdasaryan
2022-08-31 17:46     ` Kent Overstreet
2022-09-01  1:07       ` Suren Baghdasaryan
2022-09-01  7:41       ` Peter Zijlstra
2022-08-30 21:49 ` [RFC PATCH 11/30] mm: introduce slabobj_ext to support slab object extensions Suren Baghdasaryan
2022-09-01 23:35   ` Roman Gushchin
2022-09-02  0:23     ` Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 12/30] mm: introduce __GFP_NO_OBJ_EXT flag to selectively prevent slabobj_ext creation Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 13/30] mm/slab: introduce SLAB_NO_OBJ_EXT to avoid obj_ext creation Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 14/30] mm: prevent slabobj_ext allocations for slabobj_ext and kmem_cache objects Suren Baghdasaryan
2022-09-01 23:40   ` Roman Gushchin
2022-09-02  0:24     ` Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 15/30] lib: introduce slab allocation tagging Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 16/30] mm: enable slab allocation tagging for kmalloc and friends Suren Baghdasaryan
2022-08-31  3:26   ` kernel test robot
2022-09-01 23:50   ` Roman Gushchin
2022-08-30 21:49 ` [RFC PATCH 17/30] lib/string.c: strsep_no_empty() Suren Baghdasaryan
2022-08-31  6:41   ` kernel test robot
2022-08-30 21:49 ` [RFC PATCH 18/30] codetag: add codetag query helper functions Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 19/30] move stack capture functionality into a separate function for reuse Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 20/30] lib: introduce support for storing code tag context Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 21/30] lib: implement context capture support for page and slab allocators Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 22/30] Code tagging based fault injection Suren Baghdasaryan
2022-08-31  1:51   ` Randy Dunlap
2022-08-31 15:56     ` Suren Baghdasaryan
2022-08-31 10:37   ` Dmitry Vyukov [this message]
2022-08-31 15:51     ` Suren Baghdasaryan
2022-08-31 17:30     ` Kent Overstreet
2022-09-01  8:43       ` Dmitry Vyukov
2022-08-30 21:49 ` [RFC PATCH 23/30] timekeeping: Add a missing include Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 24/30] wait: Clean up waitqueue_entry initialization Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 25/30] lib/time_stats: New library for statistics on events Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 26/30] bcache: Convert to lib/time_stats Suren Baghdasaryan
2022-08-30 21:49 ` [RFC PATCH 27/30] Code tagging based latency tracking Suren Baghdasaryan
2022-08-31  1:53   ` Randy Dunlap
2022-08-31 15:55     ` Suren Baghdasaryan
2022-09-01  7:11   ` Peter Zijlstra
2022-09-01 14:43     ` Kent Overstreet
2022-09-01 21:38   ` Steven Rostedt
2022-09-01 21:46     ` Steven Rostedt
2022-09-01 21:54     ` Kent Overstreet
2022-09-01 22:34       ` Steven Rostedt
2022-09-01 22:55         ` Kent Overstreet
2022-09-02  0:23           ` Steven Rostedt
2022-09-02  1:35             ` Kent Overstreet
2022-09-02  1:59               ` Steven Rostedt
2022-08-30 21:49 ` [RFC PATCH 28/30] Improved symbolic error names Suren Baghdasaryan
2022-08-31  2:46   ` kernel test robot
2022-09-01 23:19   ` Joe Perches
2022-09-01 23:26     ` Kent Overstreet
2022-08-30 21:49 ` [RFC PATCH 29/30] dyndbg: Convert to code tagging Suren Baghdasaryan
2022-08-31  3:26   ` kernel test robot
2022-08-30 21:49 ` [RFC PATCH 30/30] MAINTAINERS: Add entries for code tagging & related Suren Baghdasaryan
2022-08-31  7:38 ` [RFC PATCH 00/30] Code tagging framework and applications Peter Zijlstra
2022-08-31  8:42   ` Kent Overstreet
2022-08-31 10:19     ` Mel Gorman
2022-08-31 10:47       ` Michal Hocko
2022-08-31 15:28         ` Suren Baghdasaryan
2022-08-31 16:48           ` Suren Baghdasaryan
2022-08-31 19:01         ` Kent Overstreet
2022-08-31 20:56           ` Yosry Ahmed
2022-08-31 21:38             ` Suren Baghdasaryan
2022-09-01 22:27             ` Roman Gushchin
2022-09-01 22:37               ` Kent Overstreet
2022-09-01 22:53                 ` Roman Gushchin
2022-09-01 23:36                   ` Suren Baghdasaryan
2022-09-02  0:17                   ` Kent Overstreet
2022-09-02  1:04                     ` Roman Gushchin
2022-09-02  1:16                       ` Kent Overstreet
2022-09-02 12:02                       ` Jens Axboe
2022-09-02 19:48                         ` Kent Overstreet
2022-09-02 19:53                           ` Jens Axboe
2022-09-02 20:05                             ` Kent Overstreet
2022-09-02 20:23                               ` Jens Axboe
2022-09-01  7:18           ` Michal Hocko
2022-09-01 15:33             ` Suren Baghdasaryan
2022-09-01 19:15               ` Michal Hocko
2022-09-01 19:39                 ` Suren Baghdasaryan
2022-09-01 20:15                   ` Kent Overstreet
2022-09-05  8:49                     ` Michal Hocko
2022-09-05 23:46                       ` Kent Overstreet
2022-09-06  7:23                         ` Michal Hocko
2022-09-06 18:20                           ` Kent Overstreet
2022-09-07 11:00                             ` Michal Hocko
2022-09-07 13:04                               ` Kent Overstreet
2022-09-07 13:45                                 ` Steven Rostedt
2022-09-08  6:35                                   ` Kent Overstreet
2022-09-08  6:49                                     ` Suren Baghdasaryan
2022-09-08  7:07                                       ` Kent Overstreet
2022-09-08  7:12                                     ` Michal Hocko
2022-09-08  7:29                                       ` Kent Overstreet
2022-09-08  7:47                                         ` Michal Hocko
2022-09-05  1:32                 ` Suren Baghdasaryan
2022-09-05  8:12                   ` Michal Hocko
2022-09-05  8:58                     ` Marco Elver
2022-09-05 18:07                       ` Suren Baghdasaryan
2022-09-05 18:03                     ` Suren Baghdasaryan
2022-09-06  8:01                       ` Michal Hocko
2022-09-06 15:35                         ` Suren Baghdasaryan
2022-09-05 15:07                   ` Steven Rostedt
2022-09-05 18:08                     ` Suren Baghdasaryan
2022-09-05 20:42                       ` Kent Overstreet
2022-09-05 22:16                         ` Steven Rostedt
2022-09-05 23:50                           ` Kent Overstreet
2022-09-01  8:05           ` David Hildenbrand
2022-09-01 14:23             ` Kent Overstreet
2022-09-01 15:07               ` David Hildenbrand
2022-09-01 15:39                 ` Suren Baghdasaryan
2022-09-01 15:48                 ` Kent Overstreet
2022-08-31 15:59       ` Kent Overstreet
2022-09-01  7:05         ` Peter Zijlstra
2022-09-01  7:36           ` Daniel Bristot de Oliveira
2022-09-01  7:42           ` Peter Zijlstra
2022-09-01 11:05         ` Mel Gorman
2022-09-01 16:31           ` Kent Overstreet
2022-09-01  7:00       ` Peter Zijlstra
2022-09-01 14:29         ` Kent Overstreet
2022-09-05 18:44       ` Nadav Amit
2022-09-05 19:16         ` Steven Rostedt
2022-09-01  4:52 ` Oscar Salvador
2022-09-01  5:05   ` Suren Baghdasaryan

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='CACT4Y+ZX3U1=cAPXPhoOy6xrngSCfSmyFagXK-9fWtWWODfsew@mail.gmail.com' \
    --to=dvyukov@google.com \
    --cc=42.hyeyoo@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=axboe@kernel.dk \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=changbin.du@intel.com \
    --cc=cl@linux.com \
    --cc=dave@stgolabs.net \
    --cc=david@redhat.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=elver@google.com \
    --cc=glider@google.com \
    --cc=hannes@cmpxchg.org \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=io-uring@vger.kernel.org \
    --cc=iommu@lists.linux.dev \
    --cc=jbaron@akamai.com \
    --cc=juri.lelli@redhat.com \
    --cc=kaleshsingh@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=kent.overstreet@linux.dev \
    --cc=kernel-team@android.com \
    --cc=ldufour@linux.ibm.com \
    --cc=liam.howlett@oracle.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-bcache@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-modules@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=mcgrof@kernel.org \
    --cc=mgorman@suse.de \
    --cc=mhocko@suse.com \
    --cc=minchan@google.com \
    --cc=nathan@kernel.org \
    --cc=penberg@kernel.org \
    --cc=peterx@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rientjes@google.com \
    --cc=roman.gushchin@linux.dev \
    --cc=rostedt@goodmis.org \
    --cc=shakeelb@google.com \
    --cc=songmuchun@bytedance.com \
    --cc=surenb@google.com \
    --cc=vbabka@suse.cz \
    --cc=vincent.guittot@linaro.org \
    --cc=void@manifault.com \
    --cc=vschneid@redhat.com \
    --cc=willy@infradead.org \
    --cc=xen-devel@lists.xenproject.org \
    --cc=ytcoode@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.