All of lore.kernel.org
 help / color / mirror / Atom feed
From: Byungchul Park <byungchul.park@lge.com>
To: peterz@infradead.org, mingo@kernel.org
Cc: tglx@linutronix.de, walken@google.com, boqun.feng@gmail.com,
	kirill@shutemov.name, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org, akpm@linux-foundation.org,
	willy@infradead.org, npiggin@gmail.com, kernel-team@lge.com
Subject: Re: [PATCH v8 11/14] lockdep: Apply crossrelease to PG_locked locks
Date: Tue, 5 Sep 2017 10:03:59 +0900	[thread overview]
Message-ID: <20170905010359.GQ3240@X58A-UD3R> (raw)
In-Reply-To: <1502089981-21272-12-git-send-email-byungchul.park@lge.com>

On Mon, Aug 07, 2017 at 04:12:58PM +0900, Byungchul Park wrote:
> Although lock_page() and its family can cause deadlock, the lock
> correctness validator could not be applied to them until now, becasue
> things like unlock_page() might be called in a different context from
> the acquisition context, which violates lockdep's assumption.
> 
> Thanks to CONFIG_LOCKDEP_CROSSRELEASE, we can now apply the lockdep
> detector to page locks. Applied it.

I expect applying this into lock_page() is more useful than
wait_for_completion(). Could you consider this as the next?

> Signed-off-by: Byungchul Park <byungchul.park@lge.com>
> ---
>  include/linux/mm_types.h |   8 ++++
>  include/linux/pagemap.h  | 101 ++++++++++++++++++++++++++++++++++++++++++++---
>  lib/Kconfig.debug        |   8 ++++
>  mm/filemap.c             |   4 +-
>  mm/page_alloc.c          |   3 ++
>  5 files changed, 116 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index ff15181..f1e3dba 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -16,6 +16,10 @@
>  
>  #include <asm/mmu.h>
>  
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +#include <linux/lockdep.h>
> +#endif
> +
>  #ifndef AT_VECTOR_SIZE_ARCH
>  #define AT_VECTOR_SIZE_ARCH 0
>  #endif
> @@ -216,6 +220,10 @@ struct page {
>  #ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS
>  	int _last_cpupid;
>  #endif
> +
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +	struct lockdep_map_cross map;
> +#endif
>  }
>  /*
>   * The struct page can be forced to be double word aligned so that atomic ops
> diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> index 9717ca8..9f448c6 100644
> --- a/include/linux/pagemap.h
> +++ b/include/linux/pagemap.h
> @@ -14,6 +14,9 @@
>  #include <linux/bitops.h>
>  #include <linux/hardirq.h> /* for in_interrupt() */
>  #include <linux/hugetlb_inline.h>
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +#include <linux/lockdep.h>
> +#endif
>  
>  /*
>   * Bits in mapping->flags.
> @@ -450,26 +453,91 @@ static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
>  	return pgoff;
>  }
>  
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +#define lock_page_init(p)						\
> +do {									\
> +	static struct lock_class_key __key;				\
> +	lockdep_init_map_crosslock((struct lockdep_map *)&(p)->map,	\
> +			"(PG_locked)" #p, &__key, 0);			\
> +} while (0)
> +
> +static inline void lock_page_acquire(struct page *page, int try)
> +{
> +	page = compound_head(page);
> +	lock_acquire_exclusive((struct lockdep_map *)&page->map, 0,
> +			       try, NULL, _RET_IP_);
> +}
> +
> +static inline void lock_page_release(struct page *page)
> +{
> +	page = compound_head(page);
> +	/*
> +	 * lock_commit_crosslock() is necessary for crosslocks.
> +	 */
> +	lock_commit_crosslock((struct lockdep_map *)&page->map);
> +	lock_release((struct lockdep_map *)&page->map, 0, _RET_IP_);
> +}
> +#else
> +static inline void lock_page_init(struct page *page) {}
> +static inline void lock_page_free(struct page *page) {}
> +static inline void lock_page_acquire(struct page *page, int try) {}
> +static inline void lock_page_release(struct page *page) {}
> +#endif
> +
>  extern void __lock_page(struct page *page);
>  extern int __lock_page_killable(struct page *page);
>  extern int __lock_page_or_retry(struct page *page, struct mm_struct *mm,
>  				unsigned int flags);
> -extern void unlock_page(struct page *page);
> +extern void do_raw_unlock_page(struct page *page);
>  
> -static inline int trylock_page(struct page *page)
> +static inline void unlock_page(struct page *page)
> +{
> +	lock_page_release(page);
> +	do_raw_unlock_page(page);
> +}
> +
> +static inline int do_raw_trylock_page(struct page *page)
>  {
>  	page = compound_head(page);
>  	return (likely(!test_and_set_bit_lock(PG_locked, &page->flags)));
>  }
>  
> +static inline int trylock_page(struct page *page)
> +{
> +	if (do_raw_trylock_page(page)) {
> +		lock_page_acquire(page, 1);
> +		return 1;
> +	}
> +	return 0;
> +}
> +
>  /*
>   * lock_page may only be called if we have the page's inode pinned.
>   */
>  static inline void lock_page(struct page *page)
>  {
>  	might_sleep();
> -	if (!trylock_page(page))
> +
> +	if (!do_raw_trylock_page(page))
>  		__lock_page(page);
> +	/*
> +	 * acquire() must be after actual lock operation for crosslocks.
> +	 * This way a crosslock and current lock can be ordered like:
> +	 *
> +	 *	CONTEXT 1		CONTEXT 2
> +	 *	---------		---------
> +	 *	lock A (cross)
> +	 *	acquire A
> +	 *	  X = atomic_inc_return(&cross_gen_id)
> +	 *	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +	 *				acquire B
> +	 *				  Y = atomic_read_acquire(&cross_gen_id)
> +	 *				lock B
> +	 *
> +	 * so that 'lock A and then lock B' can be seen globally,
> +	 * if X <= Y.
> +	 */
> +	lock_page_acquire(page, 0);
>  }
>  
>  /*
> @@ -479,9 +547,20 @@ static inline void lock_page(struct page *page)
>   */
>  static inline int lock_page_killable(struct page *page)
>  {
> +	int ret;
> +
>  	might_sleep();
> -	if (!trylock_page(page))
> -		return __lock_page_killable(page);
> +
> +	if (!do_raw_trylock_page(page)) {
> +		ret = __lock_page_killable(page);
> +		if (ret)
> +			return ret;
> +	}
> +	/*
> +	 * acquire() must be after actual lock operation for crosslocks.
> +	 * This way a crosslock and other locks can be ordered.
> +	 */
> +	lock_page_acquire(page, 0);
>  	return 0;
>  }
>  
> @@ -496,7 +575,17 @@ static inline int lock_page_or_retry(struct page *page, struct mm_struct *mm,
>  				     unsigned int flags)
>  {
>  	might_sleep();
> -	return trylock_page(page) || __lock_page_or_retry(page, mm, flags);
> +
> +	if (do_raw_trylock_page(page) || __lock_page_or_retry(page, mm, flags)) {
> +		/*
> +		 * acquire() must be after actual lock operation for crosslocks.
> +		 * This way a crosslock and other locks can be ordered.
> +		 */
> +		lock_page_acquire(page, 0);
> +		return 1;
> +	}
> +
> +	return 0;
>  }
>  
>  /*
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index 4ba8adc..99b5f76 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -1093,6 +1093,14 @@ config LOCKDEP_COMPLETE
>  	 A deadlock caused by wait_for_completion() and complete() can be
>  	 detected by lockdep using crossrelease feature.
>  
> +config LOCKDEP_PAGELOCK
> +	bool "Lock debugging: allow PG_locked lock to use deadlock detector"
> +	select LOCKDEP_CROSSRELEASE
> +	default n
> +	help
> +	 PG_locked lock is a kind of crosslock. Using crossrelease feature,
> +	 PG_locked lock can work with runtime deadlock detector.
> +
>  config PROVE_LOCKING
>  	bool "Lock debugging: prove locking correctness"
>  	depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
> diff --git a/mm/filemap.c b/mm/filemap.c
> index a497024..0d83bf0 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -1083,7 +1083,7 @@ static inline bool clear_bit_unlock_is_negative_byte(long nr, volatile void *mem
>   * portably (architectures that do LL/SC can test any bit, while x86 can
>   * test the sign bit).
>   */
> -void unlock_page(struct page *page)
> +void do_raw_unlock_page(struct page *page)
>  {
>  	BUILD_BUG_ON(PG_waiters != 7);
>  	page = compound_head(page);
> @@ -1091,7 +1091,7 @@ void unlock_page(struct page *page)
>  	if (clear_bit_unlock_is_negative_byte(PG_locked, &page->flags))
>  		wake_up_page_bit(page, PG_locked);
>  }
> -EXPORT_SYMBOL(unlock_page);
> +EXPORT_SYMBOL(do_raw_unlock_page);
>  
>  /**
>   * end_page_writeback - end writeback against a page
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 6d30e91..2cbf412 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -5406,6 +5406,9 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
>  		} else {
>  			__init_single_pfn(pfn, zone, nid);
>  		}
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +		lock_page_init(pfn_to_page(pfn));
> +#endif
>  	}
>  }
>  
> -- 
> 1.9.1

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Byungchul Park <byungchul.park@lge.com>
To: peterz@infradead.org, mingo@kernel.org
Cc: tglx@linutronix.de, walken@google.com, boqun.feng@gmail.com,
	kirill@shutemov.name, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org, akpm@linux-foundation.org,
	willy@infradead.org, npiggin@gmail.com, kernel-team@lge.com
Subject: Re: [PATCH v8 11/14] lockdep: Apply crossrelease to PG_locked locks
Date: Tue, 5 Sep 2017 10:03:59 +0900	[thread overview]
Message-ID: <20170905010359.GQ3240@X58A-UD3R> (raw)
In-Reply-To: <1502089981-21272-12-git-send-email-byungchul.park@lge.com>

On Mon, Aug 07, 2017 at 04:12:58PM +0900, Byungchul Park wrote:
> Although lock_page() and its family can cause deadlock, the lock
> correctness validator could not be applied to them until now, becasue
> things like unlock_page() might be called in a different context from
> the acquisition context, which violates lockdep's assumption.
> 
> Thanks to CONFIG_LOCKDEP_CROSSRELEASE, we can now apply the lockdep
> detector to page locks. Applied it.

I expect applying this into lock_page() is more useful than
wait_for_completion(). Could you consider this as the next?

> Signed-off-by: Byungchul Park <byungchul.park@lge.com>
> ---
>  include/linux/mm_types.h |   8 ++++
>  include/linux/pagemap.h  | 101 ++++++++++++++++++++++++++++++++++++++++++++---
>  lib/Kconfig.debug        |   8 ++++
>  mm/filemap.c             |   4 +-
>  mm/page_alloc.c          |   3 ++
>  5 files changed, 116 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index ff15181..f1e3dba 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -16,6 +16,10 @@
>  
>  #include <asm/mmu.h>
>  
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +#include <linux/lockdep.h>
> +#endif
> +
>  #ifndef AT_VECTOR_SIZE_ARCH
>  #define AT_VECTOR_SIZE_ARCH 0
>  #endif
> @@ -216,6 +220,10 @@ struct page {
>  #ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS
>  	int _last_cpupid;
>  #endif
> +
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +	struct lockdep_map_cross map;
> +#endif
>  }
>  /*
>   * The struct page can be forced to be double word aligned so that atomic ops
> diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> index 9717ca8..9f448c6 100644
> --- a/include/linux/pagemap.h
> +++ b/include/linux/pagemap.h
> @@ -14,6 +14,9 @@
>  #include <linux/bitops.h>
>  #include <linux/hardirq.h> /* for in_interrupt() */
>  #include <linux/hugetlb_inline.h>
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +#include <linux/lockdep.h>
> +#endif
>  
>  /*
>   * Bits in mapping->flags.
> @@ -450,26 +453,91 @@ static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
>  	return pgoff;
>  }
>  
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +#define lock_page_init(p)						\
> +do {									\
> +	static struct lock_class_key __key;				\
> +	lockdep_init_map_crosslock((struct lockdep_map *)&(p)->map,	\
> +			"(PG_locked)" #p, &__key, 0);			\
> +} while (0)
> +
> +static inline void lock_page_acquire(struct page *page, int try)
> +{
> +	page = compound_head(page);
> +	lock_acquire_exclusive((struct lockdep_map *)&page->map, 0,
> +			       try, NULL, _RET_IP_);
> +}
> +
> +static inline void lock_page_release(struct page *page)
> +{
> +	page = compound_head(page);
> +	/*
> +	 * lock_commit_crosslock() is necessary for crosslocks.
> +	 */
> +	lock_commit_crosslock((struct lockdep_map *)&page->map);
> +	lock_release((struct lockdep_map *)&page->map, 0, _RET_IP_);
> +}
> +#else
> +static inline void lock_page_init(struct page *page) {}
> +static inline void lock_page_free(struct page *page) {}
> +static inline void lock_page_acquire(struct page *page, int try) {}
> +static inline void lock_page_release(struct page *page) {}
> +#endif
> +
>  extern void __lock_page(struct page *page);
>  extern int __lock_page_killable(struct page *page);
>  extern int __lock_page_or_retry(struct page *page, struct mm_struct *mm,
>  				unsigned int flags);
> -extern void unlock_page(struct page *page);
> +extern void do_raw_unlock_page(struct page *page);
>  
> -static inline int trylock_page(struct page *page)
> +static inline void unlock_page(struct page *page)
> +{
> +	lock_page_release(page);
> +	do_raw_unlock_page(page);
> +}
> +
> +static inline int do_raw_trylock_page(struct page *page)
>  {
>  	page = compound_head(page);
>  	return (likely(!test_and_set_bit_lock(PG_locked, &page->flags)));
>  }
>  
> +static inline int trylock_page(struct page *page)
> +{
> +	if (do_raw_trylock_page(page)) {
> +		lock_page_acquire(page, 1);
> +		return 1;
> +	}
> +	return 0;
> +}
> +
>  /*
>   * lock_page may only be called if we have the page's inode pinned.
>   */
>  static inline void lock_page(struct page *page)
>  {
>  	might_sleep();
> -	if (!trylock_page(page))
> +
> +	if (!do_raw_trylock_page(page))
>  		__lock_page(page);
> +	/*
> +	 * acquire() must be after actual lock operation for crosslocks.
> +	 * This way a crosslock and current lock can be ordered like:
> +	 *
> +	 *	CONTEXT 1		CONTEXT 2
> +	 *	---------		---------
> +	 *	lock A (cross)
> +	 *	acquire A
> +	 *	  X = atomic_inc_return(&cross_gen_id)
> +	 *	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +	 *				acquire B
> +	 *				  Y = atomic_read_acquire(&cross_gen_id)
> +	 *				lock B
> +	 *
> +	 * so that 'lock A and then lock B' can be seen globally,
> +	 * if X <= Y.
> +	 */
> +	lock_page_acquire(page, 0);
>  }
>  
>  /*
> @@ -479,9 +547,20 @@ static inline void lock_page(struct page *page)
>   */
>  static inline int lock_page_killable(struct page *page)
>  {
> +	int ret;
> +
>  	might_sleep();
> -	if (!trylock_page(page))
> -		return __lock_page_killable(page);
> +
> +	if (!do_raw_trylock_page(page)) {
> +		ret = __lock_page_killable(page);
> +		if (ret)
> +			return ret;
> +	}
> +	/*
> +	 * acquire() must be after actual lock operation for crosslocks.
> +	 * This way a crosslock and other locks can be ordered.
> +	 */
> +	lock_page_acquire(page, 0);
>  	return 0;
>  }
>  
> @@ -496,7 +575,17 @@ static inline int lock_page_or_retry(struct page *page, struct mm_struct *mm,
>  				     unsigned int flags)
>  {
>  	might_sleep();
> -	return trylock_page(page) || __lock_page_or_retry(page, mm, flags);
> +
> +	if (do_raw_trylock_page(page) || __lock_page_or_retry(page, mm, flags)) {
> +		/*
> +		 * acquire() must be after actual lock operation for crosslocks.
> +		 * This way a crosslock and other locks can be ordered.
> +		 */
> +		lock_page_acquire(page, 0);
> +		return 1;
> +	}
> +
> +	return 0;
>  }
>  
>  /*
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index 4ba8adc..99b5f76 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -1093,6 +1093,14 @@ config LOCKDEP_COMPLETE
>  	 A deadlock caused by wait_for_completion() and complete() can be
>  	 detected by lockdep using crossrelease feature.
>  
> +config LOCKDEP_PAGELOCK
> +	bool "Lock debugging: allow PG_locked lock to use deadlock detector"
> +	select LOCKDEP_CROSSRELEASE
> +	default n
> +	help
> +	 PG_locked lock is a kind of crosslock. Using crossrelease feature,
> +	 PG_locked lock can work with runtime deadlock detector.
> +
>  config PROVE_LOCKING
>  	bool "Lock debugging: prove locking correctness"
>  	depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
> diff --git a/mm/filemap.c b/mm/filemap.c
> index a497024..0d83bf0 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -1083,7 +1083,7 @@ static inline bool clear_bit_unlock_is_negative_byte(long nr, volatile void *mem
>   * portably (architectures that do LL/SC can test any bit, while x86 can
>   * test the sign bit).
>   */
> -void unlock_page(struct page *page)
> +void do_raw_unlock_page(struct page *page)
>  {
>  	BUILD_BUG_ON(PG_waiters != 7);
>  	page = compound_head(page);
> @@ -1091,7 +1091,7 @@ void unlock_page(struct page *page)
>  	if (clear_bit_unlock_is_negative_byte(PG_locked, &page->flags))
>  		wake_up_page_bit(page, PG_locked);
>  }
> -EXPORT_SYMBOL(unlock_page);
> +EXPORT_SYMBOL(do_raw_unlock_page);
>  
>  /**
>   * end_page_writeback - end writeback against a page
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 6d30e91..2cbf412 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -5406,6 +5406,9 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
>  		} else {
>  			__init_single_pfn(pfn, zone, nid);
>  		}
> +#ifdef CONFIG_LOCKDEP_PAGELOCK
> +		lock_page_init(pfn_to_page(pfn));
> +#endif
>  	}
>  }
>  
> -- 
> 1.9.1

  parent reply	other threads:[~2017-09-05  1:04 UTC|newest]

Thread overview: 152+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-07  7:12 [PATCH v8 00/14] lockdep: Implement crossrelease feature Byungchul Park
2017-08-07  7:12 ` Byungchul Park
2017-08-07  7:12 ` [PATCH v8 01/14] lockdep: Refactor lookup_chain_cache() Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-10 12:18   ` [tip:locking/core] locking/lockdep: " tip-bot for Byungchul Park
2017-08-07  7:12 ` [PATCH v8 02/14] lockdep: Add a function building a chain between two classes Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-10 12:18   ` [tip:locking/core] locking/lockdep: " tip-bot for Byungchul Park
2017-08-07  7:12 ` [PATCH v8 03/14] lockdep: Change the meaning of check_prev_add()'s return value Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-10 12:19   ` [tip:locking/core] locking/lockdep: " tip-bot for Byungchul Park
2017-08-07  7:12 ` [PATCH v8 04/14] lockdep: Make check_prev_add() able to handle external stack_trace Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-10 12:19   ` [tip:locking/core] locking/lockdep: " tip-bot for Byungchul Park
2017-08-07  7:12 ` [PATCH v8 05/14] lockdep: Implement crossrelease feature Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-09 14:05   ` Peter Zijlstra
2017-08-09 14:05     ` Peter Zijlstra
2017-08-10  1:30     ` Byungchul Park
2017-08-10  1:30       ` Byungchul Park
2017-08-10  9:21       ` Peter Zijlstra
2017-08-10  9:21         ` Peter Zijlstra
2017-08-10 12:19   ` [tip:locking/core] locking/lockdep: Implement the 'crossrelease' feature tip-bot for Byungchul Park
2017-08-07  7:12 ` [PATCH v8 06/14] lockdep: Detect and handle hist_lock ring buffer overwrite Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-09 14:16   ` Peter Zijlstra
2017-08-09 14:16     ` Peter Zijlstra
2017-08-10  1:32     ` Byungchul Park
2017-08-10  1:32       ` Byungchul Park
2017-08-10  9:22       ` Peter Zijlstra
2017-08-10  9:22         ` Peter Zijlstra
2017-08-10 10:32     ` Byungchul Park
2017-08-10 10:32       ` Byungchul Park
2017-08-10 11:59   ` Boqun Feng
2017-08-10 12:11     ` Byungchul Park
2017-08-10 12:11       ` Byungchul Park
2017-08-10 12:51       ` Boqun Feng
2017-08-10 13:17         ` Boqun Feng
2017-08-10 13:17           ` Boqun Feng
2017-08-11  0:44           ` Byungchul Park
2017-08-11  0:44             ` Byungchul Park
2017-08-11  3:43           ` Byungchul Park
2017-08-11  3:43             ` Byungchul Park
2017-08-11  8:03             ` Boqun Feng
2017-08-11  8:52               ` Byungchul Park
2017-08-11  8:52                 ` Byungchul Park
2017-08-11  9:44                 ` Byungchul Park
2017-08-11  9:44                   ` Byungchul Park
2017-08-11 13:06                   ` Byungchul Park
2017-08-11 13:06                     ` Byungchul Park
2017-08-14  7:05                     ` Boqun Feng
2017-08-14  7:22                       ` Byungchul Park
2017-08-14  7:22                         ` Byungchul Park
2017-08-14  7:29                       ` Byungchul Park
2017-08-14  7:29                         ` Byungchul Park
2017-08-11  0:40         ` Byungchul Park
2017-08-11  0:40           ` Byungchul Park
2017-08-11  1:03           ` Boqun Feng
2017-08-10 12:20   ` [tip:locking/core] locking/lockdep: " tip-bot for Byungchul Park
2017-08-07  7:12 ` [PATCH v8 07/14] lockdep: Handle non(or multi)-acquisition of a crosslock Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-10 12:20   ` [tip:locking/core] locking/lockdep: " tip-bot for Byungchul Park
2017-08-07  7:12 ` [PATCH v8 08/14] lockdep: Make print_circular_bug() aware of crossrelease Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-10 12:21   ` [tip:locking/core] locking/lockdep: " tip-bot for Byungchul Park
2017-08-07  7:12 ` [PATCH v8 09/14] lockdep: Apply crossrelease to completions Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-07 10:20   ` kbuild test robot
2017-08-07 11:45   ` kbuild test robot
2017-08-09  9:51   ` Peter Zijlstra
2017-08-09  9:51     ` Peter Zijlstra
2017-08-09 10:24     ` Peter Zijlstra
2017-08-09 10:24       ` Peter Zijlstra
2017-08-10  1:24       ` Byungchul Park
2017-08-10  1:24         ` Byungchul Park
2017-08-10 12:21   ` [tip:locking/core] locking/lockdep: " tip-bot for Byungchul Park
2017-08-14  8:50   ` [PATCH v8 09/14] lockdep: " Arnd Bergmann
2017-08-14  8:50     ` Arnd Bergmann
2017-08-18 23:43     ` Boqun Feng
2017-08-18 23:43       ` Boqun Feng
2017-08-19 12:51       ` Arnd Bergmann
2017-08-19 12:51         ` Arnd Bergmann
2017-08-19 13:34         ` Arnd Bergmann
2017-08-19 13:34           ` Arnd Bergmann
2017-08-23 14:43           ` Boqun Feng
2017-08-20  3:18         ` Boqun Feng
2017-08-07  7:12 ` [PATCH v8 10/14] pagemap.h: Remove trailing white space Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-07  7:12 ` [PATCH v8 11/14] lockdep: Apply crossrelease to PG_locked locks Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-07 10:36   ` kbuild test robot
2017-08-10  1:35   ` Byungchul Park
2017-08-10  1:35     ` Byungchul Park
2017-08-10  9:25     ` Peter Zijlstra
2017-08-10  9:25       ` Peter Zijlstra
2017-09-05  1:03   ` Byungchul Park [this message]
2017-09-05  1:03     ` Byungchul Park
2017-08-07  7:12 ` [PATCH v8 12/14] lockdep: Apply lock_acquire(release) on __Set(__Clear)PageLocked Byungchul Park
2017-08-07  7:12   ` Byungchul Park
2017-08-07  7:13 ` [PATCH v8 13/14] lockdep: Move data of CONFIG_LOCKDEP_PAGELOCK from page to page_ext Byungchul Park
2017-08-07  7:13   ` Byungchul Park
2017-08-07 10:43   ` kbuild test robot
2017-08-07  7:13 ` [PATCH v8 14/14] lockdep: Crossrelease feature documentation Byungchul Park
2017-08-07  7:13   ` Byungchul Park
2017-08-07 15:58   ` kbuild test robot
2017-08-10 12:22   ` [tip:locking/core] locking/lockdep: Add 'crossrelease' " tip-bot for Byungchul Park
2017-08-09 15:50 ` [PATCH v8 00/14] lockdep: Implement crossrelease feature Peter Zijlstra
2017-08-09 15:50   ` Peter Zijlstra
2017-08-10  0:55   ` Byungchul Park
2017-08-10  0:55     ` Byungchul Park
2017-08-10  3:47     ` Byungchul Park
2017-08-10  3:47       ` Byungchul Park
2017-08-10 10:52     ` Byungchul Park
2017-08-10 10:52       ` Byungchul Park
2017-08-10  9:37   ` Byungchul Park
2017-08-10  9:37     ` Byungchul Park
2017-08-10 10:52     ` Peter Zijlstra
2017-08-10 10:52       ` Peter Zijlstra
2017-08-10 11:10 ` Ingo Molnar
2017-08-10 11:10   ` Ingo Molnar
2017-08-10 11:45   ` Byungchul Park
2017-08-10 11:45     ` Byungchul Park
2017-08-14 10:57     ` Ingo Molnar
2017-08-14 10:57       ` Ingo Molnar
2017-08-14 11:10       ` Byungchul Park
2017-08-14 11:10         ` Byungchul Park
2017-08-15  8:20 ` Ingo Molnar
2017-08-15  8:20   ` Ingo Molnar
2017-08-16  0:16   ` Byungchul Park
2017-08-16  0:16     ` Byungchul Park
2017-08-16  4:05     ` Boqun Feng
2017-08-16  4:05       ` Boqun Feng
2017-08-16  4:37       ` Byungchul Park
2017-08-16  4:37         ` Byungchul Park
2017-08-16  5:40         ` Boqun Feng
2017-08-16  6:37           ` Byungchul Park
2017-08-16  6:37             ` Byungchul Park
2017-08-16  5:05       ` Byungchul Park
2017-08-16  5:05         ` Byungchul Park
2017-08-16  5:58         ` Boqun Feng
2017-08-16  7:14           ` Byungchul Park
2017-08-16  7:14             ` Byungchul Park
2017-08-16  8:06             ` Byungchul Park
2017-08-16  8:06               ` Byungchul Park
2017-08-16  9:38               ` Byungchul Park
2017-08-16  9:38                 ` Byungchul Park
2017-08-17  7:48       ` Ingo Molnar
2017-08-17  7:48         ` Ingo Molnar
2017-08-17  8:04         ` Boqun Feng
2017-08-17  8:12           ` Ingo Molnar
2017-08-17  8:12             ` Ingo Molnar
2017-08-17  8:33             ` Boqun Feng

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=20170905010359.GQ3240@X58A-UD3R \
    --to=byungchul.park@lge.com \
    --cc=akpm@linux-foundation.org \
    --cc=boqun.feng@gmail.com \
    --cc=kernel-team@lge.com \
    --cc=kirill@shutemov.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mingo@kernel.org \
    --cc=npiggin@gmail.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=walken@google.com \
    --cc=willy@infradead.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 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.