linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Andrey Konovalov <andreyknvl@google.com>
To: Andrew Morton <akpm@linux-foundation.org>,
	 Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrey Konovalov <andreyknvl@gmail.com>,
	Marco Elver <elver@google.com>,
	 Alexander Potapenko <glider@google.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	 Linux Memory Management List <linux-mm@kvack.org>,
	mm-commits@vger.kernel.org,
	 Alan Stern <stern@rowland.harvard.edu>,
	Dmitry Vyukov <dvyukov@google.com>
Subject: Re: [patch 156/166] kcov: collect coverage from interrupts
Date: Tue, 7 Apr 2020 09:50:19 +0200	[thread overview]
Message-ID: <CAAeHK+wjMDmAk2xaFqYd6f1LVUaa296Vum5EeuSGskw4Bju5QA@mail.gmail.com> (raw)
In-Reply-To: <20200407031221.PXGYmMvpQ%akpm@linux-foundation.org>

On Tue, Apr 7, 2020 at 5:12 AM Andrew Morton <akpm@linux-foundation.org> wrote:
>
> From: Andrey Konovalov <andreyknvl@google.com>
> Subject: kcov: collect coverage from interrupts

Hi Andrew,

Perhaps you've missed my previous email: please don't send these kcov
changes before Dmitry's taken a look at them and given his ack (if
it's not too late).

Thanks!



>
> This change extends kcov remote coverage support to allow collecting
> coverage from soft interrupts in addition to kernel background threads.
>
> To collect coverage from code that is executed in softirq context, a part
> of that code has to be annotated with kcov_remote_start/stop() in a
> similar way as how it is done for global kernel background threads.  Then
> the handle used for the annotations has to be passed to the
> KCOV_REMOTE_ENABLE ioctl.
>
> Internally this patch adjusts the __sanitizer_cov_trace_pc() compiler
> inserted callback to not bail out when called from softirq context.
> kcov_remote_start/stop() are updated to save/restore the current per task
> kcov state in a per-cpu area (in case the softirq came when the kernel was
> already collecting coverage in task context).  Coverage from softirqs is
> collected into pre-allocated per-cpu areas, whose size is controlled by
> the new CONFIG_KCOV_IRQ_AREA_SIZE.
>
> [andreyknvl@google.com: turn current->kcov_softirq into unsigned int to fix objtool warning]
>   Link: http://lkml.kernel.org/r/841c778aa3849c5cb8c3761f56b87ce653a88671.1585233617.git.andreyknvl@google.com
> Link: http://lkml.kernel.org/r/469bd385c431d050bc38a593296eff4baae50666.1584655448.git.andreyknvl@google.com
> Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
> Cc: Alan Stern <stern@rowland.harvard.edu>
> Cc: Alexander Potapenko <glider@google.com>
> Cc: Andrey Konovalov <andreyknvl@gmail.com>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Marco Elver <elver@google.com>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
>
>  Documentation/dev-tools/kcov.rst |   17 +-
>  include/linux/sched.h            |    3
>  kernel/kcov.c                    |  194 +++++++++++++++++++++++------
>  lib/Kconfig.debug                |    9 +
>  4 files changed, 176 insertions(+), 47 deletions(-)
>
> --- a/Documentation/dev-tools/kcov.rst~kcov-collect-coverage-from-interrupts
> +++ a/Documentation/dev-tools/kcov.rst
> @@ -217,14 +217,15 @@ This allows to collect coverage from two
>  threads: the global ones, that are spawned during kernel boot in a limited
>  number of instances (e.g. one USB hub_event() worker thread is spawned per
>  USB HCD); and the local ones, that are spawned when a user interacts with
> -some kernel interface (e.g. vhost workers).
> +some kernel interface (e.g. vhost workers); as well as from soft
> +interrupts.
>
> -To enable collecting coverage from a global background thread, a unique
> -global handle must be assigned and passed to the corresponding
> -kcov_remote_start() call. Then a userspace process can pass a list of such
> -handles to the KCOV_REMOTE_ENABLE ioctl in the handles array field of the
> -kcov_remote_arg struct. This will attach the used kcov device to the code
> -sections, that are referenced by those handles.
> +To enable collecting coverage from a global background thread or from a
> +softirq, a unique global handle must be assigned and passed to the
> +corresponding kcov_remote_start() call. Then a userspace process can pass
> +a list of such handles to the KCOV_REMOTE_ENABLE ioctl in the handles
> +array field of the kcov_remote_arg struct. This will attach the used kcov
> +device to the code sections, that are referenced by those handles.
>
>  Since there might be many local background threads spawned from different
>  userspace processes, we can't use a single global handle per annotation.
> @@ -242,7 +243,7 @@ handles as they don't belong to a partic
>  currently reserved and must be zero. In the future the number of bytes
>  used for the subsystem or handle ids might be increased.
>
> -When a particular userspace proccess collects coverage by via a common
> +When a particular userspace proccess collects coverage via a common
>  handle, kcov will collect coverage for each code section that is annotated
>  to use the common handle obtained as kcov_handle from the current
>  task_struct. However non common handles allow to collect coverage
> --- a/include/linux/sched.h~kcov-collect-coverage-from-interrupts
> +++ a/include/linux/sched.h
> @@ -1237,6 +1237,9 @@ struct task_struct {
>
>         /* KCOV sequence number: */
>         int                             kcov_sequence;
> +
> +       /* Collect coverage from softirq context: */
> +       unsigned int                    kcov_softirq;
>  #endif
>
>  #ifdef CONFIG_MEMCG
> --- a/kernel/kcov.c~kcov-collect-coverage-from-interrupts
> +++ a/kernel/kcov.c
> @@ -86,6 +86,18 @@ static DEFINE_SPINLOCK(kcov_remote_lock)
>  static DEFINE_HASHTABLE(kcov_remote_map, 4);
>  static struct list_head kcov_remote_areas = LIST_HEAD_INIT(kcov_remote_areas);
>
> +struct kcov_percpu_data {
> +       void                    *irq_area;
> +
> +       unsigned int            saved_mode;
> +       unsigned int            saved_size;
> +       void                    *saved_area;
> +       struct kcov             *saved_kcov;
> +       int                     saved_sequence;
> +};
> +
> +DEFINE_PER_CPU(struct kcov_percpu_data, kcov_percpu_data);
> +
>  /* Must be called with kcov_remote_lock locked. */
>  static struct kcov_remote *kcov_remote_find(u64 handle)
>  {
> @@ -145,9 +157,10 @@ static notrace bool check_kcov_mode(enum
>
>         /*
>          * We are interested in code coverage as a function of a syscall inputs,
> -        * so we ignore code executed in interrupts.
> +        * so we ignore code executed in interrupts, unless we are in a remote
> +        * coverage collection section in a softirq.
>          */
> -       if (!in_task())
> +       if (!in_task() && !(in_serving_softirq() && t->kcov_softirq))
>                 return false;
>         mode = READ_ONCE(t->kcov_mode);
>         /*
> @@ -360,8 +373,9 @@ static void kcov_remote_reset(struct kco
>         int bkt;
>         struct kcov_remote *remote;
>         struct hlist_node *tmp;
> +       unsigned long flags;
>
> -       spin_lock(&kcov_remote_lock);
> +       spin_lock_irqsave(&kcov_remote_lock, flags);
>         hash_for_each_safe(kcov_remote_map, bkt, tmp, remote, hnode) {
>                 if (remote->kcov != kcov)
>                         continue;
> @@ -370,7 +384,7 @@ static void kcov_remote_reset(struct kco
>         }
>         /* Do reset before unlock to prevent races with kcov_remote_start(). */
>         kcov_reset(kcov);
> -       spin_unlock(&kcov_remote_lock);
> +       spin_unlock_irqrestore(&kcov_remote_lock, flags);
>  }
>
>  static void kcov_disable(struct task_struct *t, struct kcov *kcov)
> @@ -399,12 +413,13 @@ static void kcov_put(struct kcov *kcov)
>  void kcov_task_exit(struct task_struct *t)
>  {
>         struct kcov *kcov;
> +       unsigned long flags;
>
>         kcov = t->kcov;
>         if (kcov == NULL)
>                 return;
>
> -       spin_lock(&kcov->lock);
> +       spin_lock_irqsave(&kcov->lock, flags);
>         kcov_debug("t = %px, kcov->t = %px\n", t, kcov->t);
>         /*
>          * For KCOV_ENABLE devices we want to make sure that t->kcov->t == t,
> @@ -428,12 +443,12 @@ void kcov_task_exit(struct task_struct *
>          * By combining all three checks into one we get:
>          */
>         if (WARN_ON(kcov->t != t)) {
> -               spin_unlock(&kcov->lock);
> +               spin_unlock_irqrestore(&kcov->lock, flags);
>                 return;
>         }
>         /* Just to not leave dangling references behind. */
>         kcov_disable(t, kcov);
> -       spin_unlock(&kcov->lock);
> +       spin_unlock_irqrestore(&kcov->lock, flags);
>         kcov_put(kcov);
>  }
>
> @@ -444,12 +459,13 @@ static int kcov_mmap(struct file *filep,
>         struct kcov *kcov = vma->vm_file->private_data;
>         unsigned long size, off;
>         struct page *page;
> +       unsigned long flags;
>
>         area = vmalloc_user(vma->vm_end - vma->vm_start);
>         if (!area)
>                 return -ENOMEM;
>
> -       spin_lock(&kcov->lock);
> +       spin_lock_irqsave(&kcov->lock, flags);
>         size = kcov->size * sizeof(unsigned long);
>         if (kcov->mode != KCOV_MODE_INIT || vma->vm_pgoff != 0 ||
>             vma->vm_end - vma->vm_start != size) {
> @@ -459,7 +475,7 @@ static int kcov_mmap(struct file *filep,
>         if (!kcov->area) {
>                 kcov->area = area;
>                 vma->vm_flags |= VM_DONTEXPAND;
> -               spin_unlock(&kcov->lock);
> +               spin_unlock_irqrestore(&kcov->lock, flags);
>                 for (off = 0; off < size; off += PAGE_SIZE) {
>                         page = vmalloc_to_page(kcov->area + off);
>                         if (vm_insert_page(vma, vma->vm_start + off, page))
> @@ -468,7 +484,7 @@ static int kcov_mmap(struct file *filep,
>                 return 0;
>         }
>  exit:
> -       spin_unlock(&kcov->lock);
> +       spin_unlock_irqrestore(&kcov->lock, flags);
>         vfree(area);
>         return res;
>  }
> @@ -548,6 +564,7 @@ static int kcov_ioctl_locked(struct kcov
>         int mode, i;
>         struct kcov_remote_arg *remote_arg;
>         struct kcov_remote *remote;
> +       unsigned long flags;
>
>         switch (cmd) {
>         case KCOV_INIT_TRACE:
> @@ -620,17 +637,19 @@ static int kcov_ioctl_locked(struct kcov
>                 kcov->t = t;
>                 kcov->remote = true;
>                 kcov->remote_size = remote_arg->area_size;
> -               spin_lock(&kcov_remote_lock);
> +               spin_lock_irqsave(&kcov_remote_lock, flags);
>                 for (i = 0; i < remote_arg->num_handles; i++) {
>                         if (!kcov_check_handle(remote_arg->handles[i],
>                                                 false, true, false)) {
> -                               spin_unlock(&kcov_remote_lock);
> +                               spin_unlock_irqrestore(&kcov_remote_lock,
> +                                                       flags);
>                                 kcov_disable(t, kcov);
>                                 return -EINVAL;
>                         }
>                         remote = kcov_remote_add(kcov, remote_arg->handles[i]);
>                         if (IS_ERR(remote)) {
> -                               spin_unlock(&kcov_remote_lock);
> +                               spin_unlock_irqrestore(&kcov_remote_lock,
> +                                                       flags);
>                                 kcov_disable(t, kcov);
>                                 return PTR_ERR(remote);
>                         }
> @@ -638,20 +657,22 @@ static int kcov_ioctl_locked(struct kcov
>                 if (remote_arg->common_handle) {
>                         if (!kcov_check_handle(remote_arg->common_handle,
>                                                 true, false, false)) {
> -                               spin_unlock(&kcov_remote_lock);
> +                               spin_unlock_irqrestore(&kcov_remote_lock,
> +                                                       flags);
>                                 kcov_disable(t, kcov);
>                                 return -EINVAL;
>                         }
>                         remote = kcov_remote_add(kcov,
>                                         remote_arg->common_handle);
>                         if (IS_ERR(remote)) {
> -                               spin_unlock(&kcov_remote_lock);
> +                               spin_unlock_irqrestore(&kcov_remote_lock,
> +                                                       flags);
>                                 kcov_disable(t, kcov);
>                                 return PTR_ERR(remote);
>                         }
>                         t->kcov_handle = remote_arg->common_handle;
>                 }
> -               spin_unlock(&kcov_remote_lock);
> +               spin_unlock_irqrestore(&kcov_remote_lock, flags);
>                 /* Put either in kcov_task_exit() or in KCOV_DISABLE. */
>                 kcov_get(kcov);
>                 return 0;
> @@ -667,6 +688,7 @@ static long kcov_ioctl(struct file *file
>         struct kcov_remote_arg *remote_arg = NULL;
>         unsigned int remote_num_handles;
>         unsigned long remote_arg_size;
> +       unsigned long flags;
>
>         if (cmd == KCOV_REMOTE_ENABLE) {
>                 if (get_user(remote_num_handles, (unsigned __user *)(arg +
> @@ -687,9 +709,9 @@ static long kcov_ioctl(struct file *file
>         }
>
>         kcov = filep->private_data;
> -       spin_lock(&kcov->lock);
> +       spin_lock_irqsave(&kcov->lock, flags);
>         res = kcov_ioctl_locked(kcov, cmd, arg);
> -       spin_unlock(&kcov->lock);
> +       spin_unlock_irqrestore(&kcov->lock, flags);
>
>         kfree(remote_arg);
>
> @@ -706,8 +728,8 @@ static const struct file_operations kcov
>
>  /*
>   * kcov_remote_start() and kcov_remote_stop() can be used to annotate a section
> - * of code in a kernel background thread to allow kcov to be used to collect
> - * coverage from that part of code.
> + * of code in a kernel background thread or in a softirq to allow kcov to be
> + * used to collect coverage from that part of code.
>   *
>   * The handle argument of kcov_remote_start() identifies a code section that is
>   * used for coverage collection. A userspace process passes this handle to
> @@ -718,9 +740,9 @@ static const struct file_operations kcov
>   * the type of the kernel thread whose code is being annotated.
>   *
>   * For global kernel threads that are spawned in a limited number of instances
> - * (e.g. one USB hub_event() worker thread is spawned per USB HCD), each
> - * instance must be assigned a unique 4-byte instance id. The instance id is
> - * then combined with a 1-byte subsystem id to get a handle via
> + * (e.g. one USB hub_event() worker thread is spawned per USB HCD) and for
> + * softirqs, each instance must be assigned a unique 4-byte instance id. The
> + * instance id is then combined with a 1-byte subsystem id to get a handle via
>   * kcov_remote_handle(subsystem_id, instance_id).
>   *
>   * For local kernel threads that are spawned from system calls handler when a
> @@ -739,7 +761,7 @@ static const struct file_operations kcov
>   *
>   * See Documentation/dev-tools/kcov.rst for more details.
>   *
> - * Internally, this function looks up the kcov device associated with the
> + * Internally, kcov_remote_start() looks up the kcov device associated with the
>   * provided handle, allocates an area for coverage collection, and saves the
>   * pointers to kcov and area into the current task_struct to allow coverage to
>   * be collected via __sanitizer_cov_trace_pc()
> @@ -752,6 +774,39 @@ static inline bool kcov_mode_enabled(uns
>         return (mode & ~KCOV_IN_CTXSW) != KCOV_MODE_DISABLED;
>  }
>
> +void kcov_remote_softirq_start(struct task_struct *t)
> +{
> +       struct kcov_percpu_data *data = this_cpu_ptr(&kcov_percpu_data);
> +       unsigned int mode;
> +
> +       mode = READ_ONCE(t->kcov_mode);
> +       barrier();
> +       if (kcov_mode_enabled(mode)) {
> +               data->saved_mode = mode;
> +               data->saved_size = t->kcov_size;
> +               data->saved_area = t->kcov_area;
> +               data->saved_sequence = t->kcov_sequence;
> +               data->saved_kcov = t->kcov;
> +               kcov_stop(t);
> +       }
> +}
> +
> +void kcov_remote_softirq_stop(struct task_struct *t)
> +{
> +       struct kcov_percpu_data *data = this_cpu_ptr(&kcov_percpu_data);
> +
> +       if (data->saved_kcov) {
> +               kcov_start(t, data->saved_kcov, data->saved_size,
> +                               data->saved_area, data->saved_mode,
> +                               data->saved_sequence);
> +               data->saved_mode = 0;
> +               data->saved_size = 0;
> +               data->saved_area = NULL;
> +               data->saved_sequence = 0;
> +               data->saved_kcov = NULL;
> +       }
> +}
> +
>  void kcov_remote_start(u64 handle)
>  {
>         struct task_struct *t = current;
> @@ -761,28 +816,42 @@ void kcov_remote_start(u64 handle)
>         void *area;
>         unsigned int size;
>         int sequence;
> +       unsigned long flags;
>
>         if (WARN_ON(!kcov_check_handle(handle, true, true, true)))
>                 return;
> -       if (WARN_ON(!in_task()))
> +       if (!in_task() && !in_serving_softirq())
>                 return;
>
> +       local_irq_save(flags);
> +
>         /*
> -        * Check that kcov_remote_start is not called twice
> -        * nor called by user tasks (with enabled kcov).
> +        * Check that kcov_remote_start() is not called twice in background
> +        * threads nor called by user tasks (with enabled kcov).
>          */
>         mode = READ_ONCE(t->kcov_mode);
> -       if (WARN_ON(kcov_mode_enabled(mode)))
> +       if (WARN_ON(in_task() && kcov_mode_enabled(mode))) {
> +               local_irq_restore(flags);
>                 return;
> -
> -       kcov_debug("handle = %llx\n", handle);
> +       }
> +       /*
> +        * Check that kcov_remote_start() is not called twice in softirqs.
> +        * Note, that kcov_remote_start() can be called from a softirq that
> +        * happened while collecting coverage from a background thread.
> +        */
> +       if (WARN_ON(in_serving_softirq() && t->kcov_softirq)) {
> +               local_irq_restore(flags);
> +               return;
> +       }
>
>         spin_lock(&kcov_remote_lock);
>         remote = kcov_remote_find(handle);
>         if (!remote) {
> -               spin_unlock(&kcov_remote_lock);
> +               spin_unlock_irqrestore(&kcov_remote_lock, flags);
>                 return;
>         }
> +       kcov_debug("handle = %llx, context: %s\n", handle,
> +                       in_task() ? "task" : "softirq");
>         kcov = remote->kcov;
>         /* Put in kcov_remote_stop(). */
>         kcov_get(kcov);
> @@ -790,12 +859,18 @@ void kcov_remote_start(u64 handle)
>          * Read kcov fields before unlock to prevent races with
>          * KCOV_DISABLE / kcov_remote_reset().
>          */
> -       size = kcov->remote_size;
>         mode = kcov->mode;
>         sequence = kcov->sequence;
> -       area = kcov_remote_area_get(size);
> -       spin_unlock(&kcov_remote_lock);
> +       if (in_task()) {
> +               size = kcov->remote_size;
> +               area = kcov_remote_area_get(size);
> +       } else {
> +               size = CONFIG_KCOV_IRQ_AREA_SIZE;
> +               area = this_cpu_ptr(&kcov_percpu_data)->irq_area;
> +       }
> +       spin_unlock_irqrestore(&kcov_remote_lock, flags);
>
> +       /* Can only happen when in_task(). */
>         if (!area) {
>                 area = vmalloc(size * sizeof(unsigned long));
>                 if (!area) {
> @@ -803,11 +878,20 @@ void kcov_remote_start(u64 handle)
>                         return;
>                 }
>         }
> +
> +       local_irq_save(flags);
> +
>         /* Reset coverage size. */
>         *(u64 *)area = 0;
>
> +       if (in_serving_softirq()) {
> +               kcov_remote_softirq_start(t);
> +               t->kcov_softirq = 1;
> +       }
>         kcov_start(t, kcov, size, area, mode, sequence);
>
> +       local_irq_restore(flags);
> +
>  }
>  EXPORT_SYMBOL(kcov_remote_start);
>
> @@ -875,31 +959,53 @@ void kcov_remote_stop(void)
>         void *area;
>         unsigned int size;
>         int sequence;
> +       unsigned long flags;
> +
> +       if (!in_task() && !in_serving_softirq())
> +               return;
> +
> +       local_irq_save(flags);
>
>         mode = READ_ONCE(t->kcov_mode);
>         barrier();
> -       if (!kcov_mode_enabled(mode))
> +       if (!kcov_mode_enabled(mode)) {
> +               local_irq_restore(flags);
>                 return;
> +       }
>         kcov = t->kcov;
>         area = t->kcov_area;
>         size = t->kcov_size;
>         sequence = t->kcov_sequence;
>
> +       if (WARN_ON(!in_serving_softirq() && t->kcov_softirq)) {
> +               local_irq_restore(flags);
> +               return;
> +       }
> +
>         kcov_stop(t);
> +       if (in_serving_softirq()) {
> +               t->kcov_softirq = 0;
> +               kcov_remote_softirq_stop(t);
> +       }
>
>         spin_lock(&kcov->lock);
>         /*
>          * KCOV_DISABLE could have been called between kcov_remote_start()
> -        * and kcov_remote_stop(), hence the check.
> +        * and kcov_remote_stop(), hence the sequence check.
>          */
>         if (sequence == kcov->sequence && kcov->remote)
>                 kcov_move_area(kcov->mode, kcov->area, kcov->size, area);
>         spin_unlock(&kcov->lock);
>
> -       spin_lock(&kcov_remote_lock);
> -       kcov_remote_area_put(area, size);
> -       spin_unlock(&kcov_remote_lock);
> +       if (in_task()) {
> +               spin_lock(&kcov_remote_lock);
> +               kcov_remote_area_put(area, size);
> +               spin_unlock(&kcov_remote_lock);
> +       }
> +
> +       local_irq_restore(flags);
>
> +       /* Get in kcov_remote_start(). */
>         kcov_put(kcov);
>  }
>  EXPORT_SYMBOL(kcov_remote_stop);
> @@ -913,6 +1019,16 @@ EXPORT_SYMBOL(kcov_common_handle);
>
>  static int __init kcov_init(void)
>  {
> +       int cpu;
> +
> +       for_each_possible_cpu(cpu) {
> +               void *area = vmalloc(CONFIG_KCOV_IRQ_AREA_SIZE *
> +                               sizeof(unsigned long));
> +               if (!area)
> +                       return -ENOMEM;
> +               per_cpu_ptr(&kcov_percpu_data, cpu)->irq_area = area;
> +       }
> +
>         /*
>          * The kcov debugfs file won't ever get removed and thus,
>          * there is no need to protect it against removal races. The
> --- a/lib/Kconfig.debug~kcov-collect-coverage-from-interrupts
> +++ a/lib/Kconfig.debug
> @@ -1767,6 +1767,15 @@ config KCOV_INSTRUMENT_ALL
>           filesystem fuzzing with AFL) then you will want to enable coverage
>           for more specific subsets of files, and should say n here.
>
> +config KCOV_IRQ_AREA_SIZE
> +       hex "Size of interrupt coverage collection area in words"
> +       depends on KCOV
> +       default 0x40000
> +       help
> +         KCOV uses preallocated per-cpu areas to collect coverage from
> +         soft interrupts. This specifies the size of those areas in the
> +         number of unsigned long words.
> +
>  menuconfig RUNTIME_TESTING_MENU
>         bool "Runtime Testing"
>         def_bool y
> _


  reply	other threads:[~2020-04-07  7:50 UTC|newest]

Thread overview: 184+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-07  3:02 incoming Andrew Morton
2020-04-07  3:03 ` [patch 001/166] mm, memcg: bypass high reclaim iteration for cgroup hierarchy root Andrew Morton
2020-04-07  3:03 ` [patch 002/166] mm: don't prepare anon_vma if vma has VM_WIPEONFORK Andrew Morton
2020-04-07  3:03 ` [patch 003/166] Revert "mm/rmap.c: reuse mergeable anon_vma as parent when fork" Andrew Morton
2020-04-07  3:03 ` [patch 004/166] mm: set vm_next and vm_prev to NULL in vm_area_dup() Andrew Morton
2020-04-07  3:03 ` [patch 005/166] mm/vma: add missing VMA flag readable name for VM_SYNC Andrew Morton
2020-04-07  3:03 ` [patch 006/166] mm/vma: make vma_is_accessible() available for general use Andrew Morton
2020-04-07  3:03 ` [patch 007/166] mm/vma: replace all remaining open encodings with is_vm_hugetlb_page() Andrew Morton
2020-04-07  3:03 ` [patch 008/166] mm/vma: replace all remaining open encodings with vma_is_anonymous() Andrew Morton
2020-04-07  3:03 ` [patch 009/166] mm/vma: append unlikely() while testing VMA access permissions Andrew Morton
2020-04-07  3:04 ` [patch 010/166] mm/vmalloc: fix a typo in comment Andrew Morton
2020-04-07  3:04 ` [patch 011/166] mm: make it clear that gfp reclaim modifiers are valid only for sleepable allocations Andrew Morton
2020-04-07  3:04 ` [patch 012/166] mm/migrate.c: no need to check for i > start in do_pages_move() Andrew Morton
2020-04-07  3:04 ` [patch 013/166] mm/migrate.c: wrap do_move_pages_to_node() and store_status() Andrew Morton
2020-04-07  3:04 ` [patch 014/166] mm/migrate.c: check pagelist in move_pages_and_store_status() Andrew Morton
2020-04-07  3:04 ` [patch 015/166] mm/migrate.c: unify "not queued for migration" handling in do_pages_move() Andrew Morton
2020-04-07  3:04 ` [patch 016/166] mm/migrate.c: migrate PG_readahead flag Andrew Morton
2020-04-07  3:04 ` [patch 017/166] mm, shmem: add vmstat for hugepage fallback Andrew Morton
2020-04-07  3:04 ` [patch 018/166] mm, thp: track fallbacks due to failed memcg charges separately Andrew Morton
2020-04-07  3:04 ` [patch 019/166] include/linux/pagemap.h: optimise find_subpage for !THP Andrew Morton
2020-04-07  3:04 ` [patch 020/166] mm: remove CONFIG_TRANSPARENT_HUGE_PAGECACHE Andrew Morton
2020-04-07  3:04 ` [patch 021/166] mm/ksm.c: update get_user_pages() argument in comment Andrew Morton
2020-04-07  3:04 ` [patch 022/166] mm: code cleanup for MADV_FREE Andrew Morton
2020-04-07  3:04 ` [patch 023/166] mm: adjust shuffle code to allow for future coalescing Andrew Morton
2020-04-07  3:04 ` [patch 024/166] mm: use zone and order instead of free area in free_list manipulators Andrew Morton
2020-04-07  3:04 ` [patch 025/166] mm: add function __putback_isolated_page Andrew Morton
2020-04-07  3:04 ` [patch 026/166] mm: introduce Reported pages Andrew Morton
2020-04-07  3:05 ` [patch 027/166] virtio-balloon: pull page poisoning config out of free page hinting Andrew Morton
2020-04-07  3:05 ` [patch 028/166] virtio-balloon: add support for providing free page reports to host Andrew Morton
2020-04-07  3:05 ` [patch 029/166] mm/page_reporting: rotate reported pages to the tail of the list Andrew Morton
2020-04-07  3:05 ` [patch 030/166] mm/page_reporting: add budget limit on how many pages can be reported per pass Andrew Morton
2020-04-07  3:05 ` [patch 031/166] mm/page_reporting: add free page reporting documentation Andrew Morton
2020-04-07  3:05 ` [patch 032/166] virtio-balloon: switch back to OOM handler for VIRTIO_BALLOON_F_DEFLATE_ON_OOM Andrew Morton
2020-04-07  3:05 ` [patch 033/166] userfaultfd: wp: add helper for writeprotect check Andrew Morton
2020-04-07  3:05 ` [patch 034/166] userfaultfd: wp: hook userfault handler to write protection fault Andrew Morton
2020-04-07  3:05 ` [patch 035/166] userfaultfd: wp: add WP pagetable tracking to x86 Andrew Morton
2020-04-07  3:05 ` [patch 036/166] userfaultfd: wp: userfaultfd_pte/huge_pmd_wp() helpers Andrew Morton
2020-04-07  3:05 ` [patch 037/166] userfaultfd: wp: add UFFDIO_COPY_MODE_WP Andrew Morton
2020-04-07  3:05 ` [patch 038/166] mm: merge parameters for change_protection() Andrew Morton
2020-04-07  3:05 ` [patch 039/166] userfaultfd: wp: apply _PAGE_UFFD_WP bit Andrew Morton
2020-04-07  3:05 ` [patch 040/166] userfaultfd: wp: drop _PAGE_UFFD_WP properly when fork Andrew Morton
2020-04-07  3:05 ` [patch 041/166] userfaultfd: wp: add pmd_swp_*uffd_wp() helpers Andrew Morton
2020-04-07  3:06 ` [patch 042/166] userfaultfd: wp: support swap and page migration Andrew Morton
2020-04-07  3:06 ` [patch 043/166] khugepaged: skip collapse if uffd-wp detected Andrew Morton
2020-04-07  3:06 ` [patch 044/166] userfaultfd: wp: support write protection for userfault vma range Andrew Morton
2020-04-07  3:06 ` [patch 045/166] userfaultfd: wp: add the writeprotect API to userfaultfd ioctl Andrew Morton
2020-04-07  3:06 ` [patch 046/166] userfaultfd: wp: enabled write protection in userfaultfd API Andrew Morton
2020-04-07  3:06 ` [patch 047/166] userfaultfd: wp: don't wake up when doing write protect Andrew Morton
2020-04-07  3:06 ` [patch 048/166] userfaultfd: wp: UFFDIO_REGISTER_MODE_WP documentation update Andrew Morton
2020-04-07  3:06 ` [patch 049/166] userfaultfd: wp: declare _UFFDIO_WRITEPROTECT conditionally Andrew Morton
2020-04-07  3:06 ` [patch 050/166] userfaultfd: selftests: refactor statistics Andrew Morton
2020-04-07  3:06 ` [patch 051/166] userfaultfd: selftests: add write-protect test Andrew Morton
2020-04-07  3:06 ` [patch 052/166] drivers/base/memory.c: drop section_count Andrew Morton
2020-04-07  3:06 ` [patch 053/166] drivers/base/memory.c: drop pages_correctly_probed() Andrew Morton
2020-04-07  3:06 ` [patch 054/166] mm/page_ext.c: drop pfn_present() check when onlining Andrew Morton
2020-04-07  3:06 ` [patch 055/166] mm/memory_hotplug.c: only respect mem= parameter during boot stage Andrew Morton
2020-04-07  3:06 ` [patch 056/166] mm/memory_hotplug.c: simplify calculation of number of pages in __remove_pages() Andrew Morton
2020-04-07  3:06 ` [patch 057/166] mm/memory_hotplug.c: cleanup __add_pages() Andrew Morton
2020-04-07  3:07 ` [patch 058/166] mm/sparse.c: introduce new function fill_subsection_map() Andrew Morton
2020-04-07  3:07 ` [patch 059/166] mm/sparse.c: introduce a new function clear_subsection_map() Andrew Morton
2020-04-07  3:07 ` [patch 060/166] mm/sparse.c: only use subsection map in VMEMMAP case Andrew Morton
2020-04-07  3:07 ` [patch 061/166] mm/sparse.c: add note about only VMEMMAP supporting sub-section hotplug Andrew Morton
2020-04-07  3:07 ` [patch 062/166] mm/sparse.c: move subsection_map related functions together Andrew Morton
2020-04-07  3:07 ` [patch 063/166] drivers/base/memory: rename MMOP_ONLINE_KEEP to MMOP_ONLINE Andrew Morton
2020-04-07  3:07 ` [patch 064/166] drivers/base/memory: map MMOP_OFFLINE to 0 Andrew Morton
2020-04-07  3:07 ` [patch 065/166] drivers/base/memory: store mapping between MMOP_* and string in an array Andrew Morton
2020-04-07  3:07 ` [patch 066/166] powernv/memtrace: always online added memory blocks Andrew Morton
2020-04-07  3:07 ` [patch 067/166] hv_balloon: don't check for memhp_auto_online manually Andrew Morton
2020-04-07  3:07 ` [patch 068/166] mm/memory_hotplug: unexport memhp_auto_online Andrew Morton
2020-04-07  3:07 ` [patch 069/166] mm/memory_hotplug: convert memhp_auto_online to store an online_type Andrew Morton
2020-04-07  3:07 ` [patch 070/166] mm/memory_hotplug: allow to specify a default online_type Andrew Morton
2020-04-07  3:07 ` [patch 071/166] mm/memory_hotplug.c: use __pfn_to_section() instead of open-coding Andrew Morton
2020-04-07  3:07 ` [patch 072/166] mm/shmem.c: distribute switch variables for initialization Andrew Morton
2020-04-07  3:07 ` [patch 073/166] mm/shmem.c: clean code by removing unnecessary assignment Andrew Morton
2020-04-07  3:07 ` [patch 074/166] mm: huge tmpfs: try to split_huge_page() when punching hole Andrew Morton
2020-04-07  3:08 ` [patch 075/166] mm: prevent a warning when casting void* -> enum Andrew Morton
2020-04-07  3:08 ` [patch 076/166] mm/zswap: allow setting default status, compressor and allocator in Kconfig Andrew Morton
2020-04-07  3:08 ` [patch 077/166] mm/compaction: add missing annotation for compact_lock_irqsave Andrew Morton
2020-04-07  3:08 ` [patch 078/166] mm/hugetlb: add missing annotation for gather_surplus_pages() Andrew Morton
2020-04-07  3:08 ` [patch 079/166] mm/mempolicy: add missing annotation for queue_pages_pmd() Andrew Morton
2020-04-07  3:08 ` [patch 080/166] mm/slub: add missing annotation for get_map() Andrew Morton
2020-04-07  3:08 ` [patch 081/166] mm/slub: add missing annotation for put_map() Andrew Morton
2020-04-07  3:08 ` [patch 082/166] mm/zsmalloc: add missing annotation for migrate_read_lock() Andrew Morton
2020-04-07  3:08 ` [patch 083/166] mm/zsmalloc: add missing annotation for migrate_read_unlock() Andrew Morton
2020-04-07  3:08 ` [patch 084/166] mm/zsmalloc: add missing annotation for pin_tag() Andrew Morton
2020-04-07  3:08 ` [patch 085/166] mm/zsmalloc: add missing annotation for unpin_tag() Andrew Morton
2020-04-07  3:08 ` [patch 086/166] mm: fix ambiguous comments for better code readability Andrew Morton
2020-04-07  3:08 ` [patch 087/166] mm/mm_init.c: clean code. Use BUILD_BUG_ON when comparing compile time constant Andrew Morton
2020-04-07  3:08 ` [patch 088/166] mm: use fallthrough; Andrew Morton
2020-04-07  3:08 ` [patch 089/166] include/linux/swapops.h: correct guards for non_swap_entry() Andrew Morton
2020-04-07  3:08 ` [patch 090/166] include/linux/memremap.h: remove stale comments Andrew Morton
2020-04-07  3:08 ` [patch 091/166] mm/dmapool.c: micro-optimisation remove unnecessary branch Andrew Morton
2020-04-07  3:08 ` [patch 092/166] mm: remove dummy struct bootmem_data/bootmem_data_t Andrew Morton
2020-04-07  3:08 ` [patch 093/166] fs/proc/inode.c: annotate close_pdeo() for sparse Andrew Morton
2020-04-07  3:09 ` [patch 094/166] proc: faster open/read/close with "permanent" files Andrew Morton
2020-04-07  3:09 ` [patch 095/166] proc: speed up /proc/*/statm Andrew Morton
2020-04-07  3:09 ` [patch 096/166] proc: inline vma_stop into m_stop Andrew Morton
2020-04-07  3:09 ` [patch 097/166] proc: remove m_cache_vma Andrew Morton
2020-04-07  3:09 ` [patch 098/166] proc: use ppos instead of m->version Andrew Morton
2020-04-07  3:09 ` [patch 099/166] seq_file: remove m->version Andrew Morton
2020-04-07  3:09 ` [patch 100/166] proc: inline m_next_vma into m_next Andrew Morton
2020-04-07  3:09 ` [patch 101/166] asm-generic: fix unistd_32.h generation format Andrew Morton
2020-04-07  3:09 ` [patch 102/166] kernel/extable.c: use address-of operator on section symbols Andrew Morton
2020-04-07  3:09 ` [patch 103/166] sparc,x86: vdso: remove meaningless undefining CONFIG_OPTIMIZE_INLINING Andrew Morton
2020-04-07  3:09 ` [patch 104/166] compiler: remove CONFIG_OPTIMIZE_INLINING entirely Andrew Morton
2020-04-07  3:09 ` [patch 105/166] compiler.h: fix error in BUILD_BUG_ON() reporting Andrew Morton
2020-04-07  3:09 ` [patch 106/166] MAINTAINERS: list the section entries in the preferred order Andrew Morton
2020-04-07  3:09 ` [patch 107/166] bitops: always inline sign extension helpers Andrew Morton
2020-04-07  3:09 ` [patch 108/166] lib/test_lockup: test module to generate lockups Andrew Morton
2020-04-07  3:09 ` [patch 109/166] lib/test_lockup.c: fix spelling mistake "iteraions" -> "iterations" Andrew Morton
2020-04-07  3:09 ` [patch 110/166] lib/test_lockup.c: add parameters for locking generic vfs locks Andrew Morton
2020-04-07  3:09 ` [patch 111/166] lib/bch.c: replace zero-length array with flexible-array member Andrew Morton
2020-04-07  3:10 ` [patch 112/166] lib/ts_bm.c: " Andrew Morton
2020-04-07  3:10 ` [patch 113/166] lib/ts_fsm.c: " Andrew Morton
2020-04-07  3:10 ` [patch 114/166] lib/ts_kmp.c: " Andrew Morton
2020-04-07  3:10 ` [patch 115/166] lib/scatterlist: fix sg_copy_buffer() kerneldoc Andrew Morton
2020-04-07  3:10 ` [patch 116/166] lib: test_stackinit.c: XFAIL switch variable init tests Andrew Morton
2020-04-07  3:10 ` [patch 117/166] lib/stackdepot.c: check depot_index before accessing the stack slab Andrew Morton
2020-04-07  3:10 ` [patch 118/166] lib/stackdepot.c: build with -fno-builtin Andrew Morton
2020-04-07  3:10 ` [patch 119/166] kasan: stackdepot: move filter_irq_stacks() to stackdepot.c Andrew Morton
2020-04-07  3:10 ` [patch 120/166] percpu_counter: fix a data race at vm_committed_as Andrew Morton
2020-04-07  3:10 ` [patch 121/166] lib/test_bitmap.c: make use of EXP2_IN_BITS Andrew Morton
2020-04-07  3:10 ` [patch 122/166] lib/rbtree: fix coding style of assignments Andrew Morton
2020-04-07  3:10 ` [patch 123/166] lib/test_kmod.c: remove a NULL test Andrew Morton
2020-04-07  3:10 ` [patch 124/166] linux/bits.h: add compile time sanity check of GENMASK inputs Andrew Morton
2020-04-07  3:10 ` [patch 125/166] lib/list: prevent compiler reloads inside 'safe' list iteration Andrew Morton
2020-04-07 15:44   ` Linus Torvalds
2020-04-07 16:03     ` Chris Wilson
2020-04-07 17:28       ` Linus Torvalds
2020-04-07 17:39         ` Linus Torvalds
2020-04-07 18:04         ` Chris Wilson
2020-04-07 20:04           ` Linus Torvalds
2020-04-07 20:06             ` Linus Torvalds
2020-04-08 22:36           ` Paul E. McKenney
2020-04-08 20:26     ` Paul E. McKenney
2020-04-08 21:14       ` Linus Torvalds
2020-04-08 22:37         ` Paul E. McKenney
2020-04-08 22:44           ` Paul E. McKenney
2020-04-08 23:14         ` Sultan Alsawaf
2020-04-07  3:10 ` [patch 126/166] lib/dynamic_debug.c: use address-of operator on section symbols Andrew Morton
2020-04-07  3:10 ` [patch 127/166] checkpatch: remove email address comment from email address comparisons Andrew Morton
2020-04-07  3:10 ` [patch 128/166] checkpatch: check SPDX tags in YAML files Andrew Morton
2020-04-07  3:10 ` [patch 129/166] checkpatch: support "base-commit:" format Andrew Morton
2020-04-07  3:10 ` [patch 130/166] checkpatch: prefer fallthrough; over fallthrough comments Andrew Morton
2020-04-07  3:11 ` [patch 131/166] checkpatch: fix minor typo and mixed space+tab in indentation Andrew Morton
2020-04-07  3:11 ` [patch 132/166] checkpatch: fix multiple const * types Andrew Morton
2020-04-07  3:11 ` [patch 133/166] checkpatch: add command-line option for TAB size Andrew Morton
2020-04-07  3:11 ` [patch 134/166] checkpatch: improve Gerrit Change-Id: test Andrew Morton
2020-04-07  3:11 ` [patch 135/166] checkpatch: check proper licensing of Devicetree bindings Andrew Morton
2020-04-07 11:46   ` Laurent Pinchart
2020-04-07  3:11 ` [patch 136/166] checkpatch: avoid warning about uninitialized_var() Andrew Morton
2020-04-07  3:11 ` [patch 137/166] kselftest: introduce new epoll test case Andrew Morton
2020-04-07  3:11 ` [patch 138/166] fs/epoll: make nesting accounting safe for -rt kernel Andrew Morton
2020-04-07  3:11 ` [patch 139/166] fs/binfmt_elf.c: delete "loc" variable Andrew Morton
2020-04-07  3:11 ` [patch 140/166] fs/binfmt_elf.c: allocate less for static executable Andrew Morton
2020-04-07  3:11 ` [patch 141/166] fs/binfmt_elf.c: don't free interpreter's ELF pheaders on common path Andrew Morton
2020-04-07  3:11 ` [patch 142/166] samples/hw_breakpoint: drop HW_BREAKPOINT_R when reporting writes Andrew Morton
2020-04-07  3:11 ` [patch 143/166] samples/hw_breakpoint: drop use of kallsyms_lookup_name() Andrew Morton
2020-04-07  3:11 ` [patch 144/166] kallsyms: unexport kallsyms_lookup_name() and kallsyms_on_each_symbol() Andrew Morton
2020-04-07  3:11 ` [patch 145/166] reiserfs: clean up several indentation issues Andrew Morton
2020-04-07  3:11 ` [patch 146/166] kernel/kmod.c: fix a typo "assuems" -> "assumes" Andrew Morton
2020-04-07  3:11 ` [patch 147/166] gcov: gcc_4_7: replace zero-length array with flexible-array member Andrew Morton
2020-04-07  3:11 ` [patch 148/166] gcov: gcc_3_4: " Andrew Morton
2020-04-07  3:11 ` [patch 149/166] kernel/gcov/fs.c: " Andrew Morton
2020-04-07  3:12 ` [patch 150/166] init/Kconfig: clean up ANON_INODES and old IO schedulers options Andrew Morton
2020-04-07  3:12 ` [patch 151/166] kcov: cleanup debug messages Andrew Morton
2020-04-07  3:12 ` [patch 152/166] kcov: fix potential use-after-free in kcov_remote_start Andrew Morton
2020-04-07  3:12 ` [patch 153/166] kcov: move t->kcov assignments into kcov_start/stop Andrew Morton
2020-04-07  3:12 ` [patch 154/166] kcov: move t->kcov_sequence assignment Andrew Morton
2020-04-07  3:12 ` [patch 155/166] kcov: use t->kcov_mode as enabled indicator Andrew Morton
2020-04-07  3:12 ` [patch 156/166] kcov: collect coverage from interrupts Andrew Morton
2020-04-07  7:50   ` Andrey Konovalov [this message]
2020-04-07 15:20     ` Linus Torvalds
2020-04-07 15:25       ` Andrey Konovalov
2020-04-07  3:12 ` [patch 157/166] usb: core: kcov: collect coverage from usb complete callback Andrew Morton
2020-04-07  3:12 ` [patch 158/166] ubsan: add trap instrumentation option Andrew Morton
2020-04-07  3:12 ` [patch 159/166] ubsan: split "bounds" checker from other options Andrew Morton
2020-04-07  3:12 ` [patch 160/166] drivers/misc/lkdtm/bugs.c: add arithmetic overflow and array bounds checks Andrew Morton
2020-04-07  3:12 ` [patch 161/166] ubsan: check panic_on_warn Andrew Morton
2020-04-07  3:12 ` [patch 162/166] kasan: unset panic_on_warn before calling panic() Andrew Morton
2020-04-07  3:12 ` [patch 163/166] ubsan: include bug type in report header Andrew Morton
2020-04-07  3:12 ` [patch 164/166] lib/Kconfig.debug: fix a typo "capabilitiy" -> "capability" Andrew Morton
2020-04-07  3:12 ` [patch 165/166] ipc/mqueue.c: fix a brace coding style issue Andrew Morton
2020-04-07  3:12 ` [patch 166/166] ipc/shm.c: make compat_ksys_shmctl() static Andrew Morton

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=CAAeHK+wjMDmAk2xaFqYd6f1LVUaa296Vum5EeuSGskw4Bju5QA@mail.gmail.com \
    --to=andreyknvl@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@gmail.com \
    --cc=dvyukov@google.com \
    --cc=elver@google.com \
    --cc=glider@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-mm@kvack.org \
    --cc=mm-commits@vger.kernel.org \
    --cc=stern@rowland.harvard.edu \
    --cc=torvalds@linux-foundation.org \
    /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