aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2017-10-24 06:22:49 -0400
committerIngo Molnar <mingo@kernel.org>2017-10-24 07:17:33 -0400
commit59ecbbe7b31cd2d86ff9a9f461a00f7e7533aedc (patch)
treecb293c6c7810f9d781bb6f0c4017b2b3dd8a27bb
parent506458efaf153c1ea480591c5602a5a3ba5a3b76 (diff)
locking/barriers: Kill lockless_dereference()
lockless_dereference() is a nice idea, but it gained little traction in kernel code since its introduction three years ago. This is partly because it's a pain to type, but also because using READ_ONCE() instead has worked correctly on all architectures apart from Alpha, which is a fully supported but somewhat niche architecture these days. Now that READ_ONCE() has been upgraded to contain an implicit smp_read_barrier_depends() and the few callers of lockless_dereference() have been converted, we can remove lockless_dereference() altogether. Signed-off-by: Will Deacon <will.deacon@arm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1508840570-22169-5-git-send-email-will.deacon@arm.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--Documentation/memory-barriers.txt12
-rw-r--r--Documentation/translations/ko_KR/memory-barriers.txt12
-rw-r--r--include/linux/compiler.h20
3 files changed, 0 insertions, 44 deletions
diff --git a/Documentation/memory-barriers.txt b/Documentation/memory-barriers.txt
index b759a60624fd..470a682f3fa4 100644
--- a/Documentation/memory-barriers.txt
+++ b/Documentation/memory-barriers.txt
@@ -1886,18 +1886,6 @@ There are some more advanced barrier functions:
1886 See Documentation/atomic_{t,bitops}.txt for more information. 1886 See Documentation/atomic_{t,bitops}.txt for more information.
1887 1887
1888 1888
1889 (*) lockless_dereference();
1890
1891 This can be thought of as a pointer-fetch wrapper around the
1892 smp_read_barrier_depends() data-dependency barrier.
1893
1894 This is also similar to rcu_dereference(), but in cases where
1895 object lifetime is handled by some mechanism other than RCU, for
1896 example, when the objects removed only when the system goes down.
1897 In addition, lockless_dereference() is used in some data structures
1898 that can be used both with and without RCU.
1899
1900
1901 (*) dma_wmb(); 1889 (*) dma_wmb();
1902 (*) dma_rmb(); 1890 (*) dma_rmb();
1903 1891
diff --git a/Documentation/translations/ko_KR/memory-barriers.txt b/Documentation/translations/ko_KR/memory-barriers.txt
index a7a813258013..ec3b46e27b7a 100644
--- a/Documentation/translations/ko_KR/memory-barriers.txt
+++ b/Documentation/translations/ko_KR/memory-barriers.txt
@@ -1858,18 +1858,6 @@ Mandatory 배리어들은 SMP 시스템에서도 UP 시스템에서도 SMP 효
1858 참고하세요. 1858 참고하세요.
1859 1859
1860 1860
1861 (*) lockless_dereference();
1862
1863 이 함수는 smp_read_barrier_depends() 데이터 의존성 배리어를 사용하는
1864 포인터 읽어오기 래퍼(wrapper) 함수로 생각될 수 있습니다.
1865
1866 객체의 라이프타임이 RCU 외의 메커니즘으로 관리된다는 점을 제외하면
1867 rcu_dereference() 와도 유사한데, 예를 들면 객체가 시스템이 꺼질 때에만
1868 제거되는 경우 등입니다. 또한, lockless_dereference() 은 RCU 와 함께
1869 사용될수도, RCU 없이 사용될 수도 있는 일부 데이터 구조에 사용되고
1870 있습니다.
1871
1872
1873 (*) dma_wmb(); 1861 (*) dma_wmb();
1874 (*) dma_rmb(); 1862 (*) dma_rmb();
1875 1863
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 7d7b77da9716..5a1cab48442c 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -346,24 +346,4 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
346 (volatile typeof(x) *)&(x); }) 346 (volatile typeof(x) *)&(x); })
347#define ACCESS_ONCE(x) (*__ACCESS_ONCE(x)) 347#define ACCESS_ONCE(x) (*__ACCESS_ONCE(x))
348 348
349/**
350 * lockless_dereference() - safely load a pointer for later dereference
351 * @p: The pointer to load
352 *
353 * Similar to rcu_dereference(), but for situations where the pointed-to
354 * object's lifetime is managed by something other than RCU. That
355 * "something other" might be reference counting or simple immortality.
356 *
357 * The seemingly unused variable ___typecheck_p validates that @p is
358 * indeed a pointer type by using a pointer to typeof(*p) as the type.
359 * Taking a pointer to typeof(*p) again is needed in case p is void *.
360 */
361#define lockless_dereference(p) \
362({ \
363 typeof(p) _________p1 = READ_ONCE(p); \
364 typeof(*(p)) *___typecheck_p __maybe_unused; \
365 smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
366 (_________p1); \
367})
368
369#endif /* __LINUX_COMPILER_H */ 349#endif /* __LINUX_COMPILER_H */