Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1370475 > unrolled thread
| Started by | Michal Hocko <mhocko@kernel.org> |
|---|---|
| First post | 2016-04-04 11:10 +0200 |
| Last post | 2016-04-04 12:30 +0200 |
| Articles | 7 — 4 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCH 02/11] locking, rwsem: drop explicit memory barriers Michal Hocko <mhocko@kernel.org> - 2016-04-04 11:10 +0200
[PATCH 2/2] sh, rwsem: drop superfluous arch specific implementation Michal Hocko <mhocko@kernel.org> - 2016-04-04 11:10 +0200
Re: [PATCH 2/2] sh, rwsem: drop superfluous arch specific implementation Peter Zijlstra <peterz@infradead.org> - 2016-04-06 11:30 +0200
Re: [PATCH 2/2] sh, rwsem: drop superfluous arch specific implementation Geert Uytterhoeven <geert@linux-m68k.org> - 2016-04-06 12:00 +0200
Re: [PATCH 2/2] sh, rwsem: drop superfluous arch specific implementation Peter Zijlstra <peterz@infradead.org> - 2016-04-06 12:30 +0200
[PATCH 1/2] xtensa, rwsem: drop superfluous arch specific implementation Michal Hocko <mhocko@kernel.org> - 2016-04-04 11:10 +0200
Re: [PATCH 1/2] xtensa, rwsem: drop superfluous arch specific implementation Max Filippov <jcmvbkbc@gmail.com> - 2016-04-04 12:30 +0200
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-04-04 11:10 +0200 |
| Subject | Re: [PATCH 02/11] locking, rwsem: drop explicit memory barriers |
| Message-ID | <rk8Ge-NO-11@gated-at.bofh.it> |
On Fri 01-04-16 18:17:53, Davidlohr Bueso wrote: [...] > I think we can actually get rid of these files altogether. While I > don't know the archs, it does not appear to be implementing any kind > of workaround/optimization, which is obviously the whole purpose of > defining per-arch rwsem internals, unless the redundant barriers are > actually the purpose. So we could use the generic rwsem.h (which has > optimizations and ACQUIRE/ RELEASE semantics, although nops for either > sh or xtensa specifically). A first inspection shows that the code is > in fact the same and continue to use 32bit rwsems. OK, so this has passed my defconfig and allnoconfig for xtensa compile test, allyesconfig has failed due to some unrelated reasons: clk-qoriq.c:(.init.text+0x3ebd3): dangerous relocation: l32r: literal target out of range (try using text-section-literals): (.init.literal+0x17c60) and zillions of similar... The same error is without the patch I do not have a crosscompiler[1] for sh arch so I couldn't have tested it but there shouldn't be any issues in principal. I will send two patches as a follow up. --- [1] https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/ doesn't seem to have it. -- Michal Hocko SUSE Labs
[toc] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-04-04 11:10 +0200 |
| Subject | [PATCH 2/2] sh, rwsem: drop superfluous arch specific implementation |
| Message-ID | <rk8Ge-NO-27@gated-at.bofh.it> |
| In reply to | #1370475 |
From: Michal Hocko <mhocko@suse.com>
since "locking, rwsem: drop explicit memory barriers" the arch specific
code is basically same as the the generic one so we can drop the
superfluous code.
Suggested-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
arch/sh/include/asm/Kbuild | 1 +
arch/sh/include/asm/rwsem.h | 130 --------------------------------------------
2 files changed, 1 insertion(+), 130 deletions(-)
delete mode 100644 arch/sh/include/asm/rwsem.h
diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild
index aac452b26aa8..6d866c7a9b74 100644
--- a/arch/sh/include/asm/Kbuild
+++ b/arch/sh/include/asm/Kbuild
@@ -25,6 +25,7 @@ generic-y += percpu.h
generic-y += poll.h
generic-y += preempt.h
generic-y += resource.h
+generic-y += rwsem.h
generic-y += sembuf.h
generic-y += serial.h
generic-y += shmbuf.h
diff --git a/arch/sh/include/asm/rwsem.h b/arch/sh/include/asm/rwsem.h
deleted file mode 100644
index 8a457b83d2a5..000000000000
--- a/arch/sh/include/asm/rwsem.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * include/asm-sh/rwsem.h: R/W semaphores for SH using the stuff
- * in lib/rwsem.c.
- */
-
-#ifndef _ASM_SH_RWSEM_H
-#define _ASM_SH_RWSEM_H
-
-#ifndef _LINUX_RWSEM_H
-#error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
-#endif
-
-#ifdef __KERNEL__
-
-#define RWSEM_UNLOCKED_VALUE 0x00000000
-#define RWSEM_ACTIVE_BIAS 0x00000001
-#define RWSEM_ACTIVE_MASK 0x0000ffff
-#define RWSEM_WAITING_BIAS (-0x00010000)
-#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
-#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
-
-/*
- * lock for reading
- */
-static inline void __down_read(struct rw_semaphore *sem)
-{
- if (atomic_inc_return((atomic_t *)(&sem->count)) <= 0)
- rwsem_down_read_failed(sem);
-}
-
-static inline int __down_read_trylock(struct rw_semaphore *sem)
-{
- int tmp;
-
- while ((tmp = sem->count) >= 0) {
- if (tmp == cmpxchg(&sem->count, tmp,
- tmp + RWSEM_ACTIVE_READ_BIAS)) {
- return 1;
- }
- }
- return 0;
-}
-
-/*
- * lock for writing
- */
-static inline void __down_write(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS,
- (atomic_t *)(&sem->count));
- if (tmp != RWSEM_ACTIVE_WRITE_BIAS)
- rwsem_down_write_failed(sem);
-}
-
-static inline int __down_write_killable(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS,
- (atomic_t *)(&sem->count));
- if (tmp != RWSEM_ACTIVE_WRITE_BIAS)
- if (IS_ERR(rwsem_down_write_failed_killable(sem)))
- return -EINTR;
-
- return 0;
-}
-
-static inline int __down_write_trylock(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = cmpxchg(&sem->count, RWSEM_UNLOCKED_VALUE,
- RWSEM_ACTIVE_WRITE_BIAS);
- return tmp == RWSEM_UNLOCKED_VALUE;
-}
-
-/*
- * unlock after reading
- */
-static inline void __up_read(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = atomic_dec_return((atomic_t *)(&sem->count));
- if (tmp < -1 && (tmp & RWSEM_ACTIVE_MASK) == 0)
- rwsem_wake(sem);
-}
-
-/*
- * unlock after writing
- */
-static inline void __up_write(struct rw_semaphore *sem)
-{
- if (atomic_sub_return(RWSEM_ACTIVE_WRITE_BIAS,
- (atomic_t *)(&sem->count)) < 0)
- rwsem_wake(sem);
-}
-
-/*
- * implement atomic add functionality
- */
-static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
-{
- atomic_add(delta, (atomic_t *)(&sem->count));
-}
-
-/*
- * downgrade write lock to read lock
- */
-static inline void __downgrade_write(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = atomic_add_return(-RWSEM_WAITING_BIAS, (atomic_t *)(&sem->count));
- if (tmp < 0)
- rwsem_downgrade_wake(sem);
-}
-
-/*
- * implement exchange and add functionality
- */
-static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
-{
- return atomic_add_return(delta, (atomic_t *)(&sem->count));
-}
-
-#endif /* __KERNEL__ */
-#endif /* _ASM_SH_RWSEM_H */
--
2.8.0.rc3
[toc] | [prev] | [next] | [standalone]
| From | Peter Zijlstra <peterz@infradead.org> |
|---|---|
| Date | 2016-04-06 11:30 +0200 |
| Subject | Re: [PATCH 2/2] sh, rwsem: drop superfluous arch specific implementation |
| Message-ID | <rkRWH-1G1-15@gated-at.bofh.it> |
| In reply to | #1370479 |
+Cc maintainers, linux-sh list is very high signal-to-noise as its been
appropriated for renesas arm parts.
On Mon, Apr 04, 2016 at 11:06:40AM +0200, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> since "locking, rwsem: drop explicit memory barriers" the arch specific
> code is basically same as the the generic one so we can drop the
> superfluous code.
>
> Suggested-by: Davidlohr Bueso <dave@stgolabs.net>
> Signed-off-by: Michal Hocko <mhocko@suse.com>
> ---
> arch/sh/include/asm/Kbuild | 1 +
> arch/sh/include/asm/rwsem.h | 130 --------------------------------------------
> 2 files changed, 1 insertion(+), 130 deletions(-)
> delete mode 100644 arch/sh/include/asm/rwsem.h
>
> diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild
> index aac452b26aa8..6d866c7a9b74 100644
> --- a/arch/sh/include/asm/Kbuild
> +++ b/arch/sh/include/asm/Kbuild
> @@ -25,6 +25,7 @@ generic-y += percpu.h
> generic-y += poll.h
> generic-y += preempt.h
> generic-y += resource.h
> +generic-y += rwsem.h
> generic-y += sembuf.h
> generic-y += serial.h
> generic-y += shmbuf.h
> diff --git a/arch/sh/include/asm/rwsem.h b/arch/sh/include/asm/rwsem.h
> deleted file mode 100644
> index 8a457b83d2a5..000000000000
> --- a/arch/sh/include/asm/rwsem.h
> +++ /dev/null
> @@ -1,130 +0,0 @@
> -/*
> - * include/asm-sh/rwsem.h: R/W semaphores for SH using the stuff
> - * in lib/rwsem.c.
> - */
> -
> -#ifndef _ASM_SH_RWSEM_H
> -#define _ASM_SH_RWSEM_H
> -
> -#ifndef _LINUX_RWSEM_H
> -#error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
> -#endif
> -
> -#ifdef __KERNEL__
> -
> -#define RWSEM_UNLOCKED_VALUE 0x00000000
> -#define RWSEM_ACTIVE_BIAS 0x00000001
> -#define RWSEM_ACTIVE_MASK 0x0000ffff
> -#define RWSEM_WAITING_BIAS (-0x00010000)
> -#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
> -#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
> -
> -/*
> - * lock for reading
> - */
> -static inline void __down_read(struct rw_semaphore *sem)
> -{
> - if (atomic_inc_return((atomic_t *)(&sem->count)) <= 0)
> - rwsem_down_read_failed(sem);
> -}
> -
> -static inline int __down_read_trylock(struct rw_semaphore *sem)
> -{
> - int tmp;
> -
> - while ((tmp = sem->count) >= 0) {
> - if (tmp == cmpxchg(&sem->count, tmp,
> - tmp + RWSEM_ACTIVE_READ_BIAS)) {
> - return 1;
> - }
> - }
> - return 0;
> -}
> -
> -/*
> - * lock for writing
> - */
> -static inline void __down_write(struct rw_semaphore *sem)
> -{
> - int tmp;
> -
> - tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS,
> - (atomic_t *)(&sem->count));
> - if (tmp != RWSEM_ACTIVE_WRITE_BIAS)
> - rwsem_down_write_failed(sem);
> -}
> -
> -static inline int __down_write_killable(struct rw_semaphore *sem)
> -{
> - int tmp;
> -
> - tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS,
> - (atomic_t *)(&sem->count));
> - if (tmp != RWSEM_ACTIVE_WRITE_BIAS)
> - if (IS_ERR(rwsem_down_write_failed_killable(sem)))
> - return -EINTR;
> -
> - return 0;
> -}
> -
> -static inline int __down_write_trylock(struct rw_semaphore *sem)
> -{
> - int tmp;
> -
> - tmp = cmpxchg(&sem->count, RWSEM_UNLOCKED_VALUE,
> - RWSEM_ACTIVE_WRITE_BIAS);
> - return tmp == RWSEM_UNLOCKED_VALUE;
> -}
> -
> -/*
> - * unlock after reading
> - */
> -static inline void __up_read(struct rw_semaphore *sem)
> -{
> - int tmp;
> -
> - tmp = atomic_dec_return((atomic_t *)(&sem->count));
> - if (tmp < -1 && (tmp & RWSEM_ACTIVE_MASK) == 0)
> - rwsem_wake(sem);
> -}
> -
> -/*
> - * unlock after writing
> - */
> -static inline void __up_write(struct rw_semaphore *sem)
> -{
> - if (atomic_sub_return(RWSEM_ACTIVE_WRITE_BIAS,
> - (atomic_t *)(&sem->count)) < 0)
> - rwsem_wake(sem);
> -}
> -
> -/*
> - * implement atomic add functionality
> - */
> -static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
> -{
> - atomic_add(delta, (atomic_t *)(&sem->count));
> -}
> -
> -/*
> - * downgrade write lock to read lock
> - */
> -static inline void __downgrade_write(struct rw_semaphore *sem)
> -{
> - int tmp;
> -
> - tmp = atomic_add_return(-RWSEM_WAITING_BIAS, (atomic_t *)(&sem->count));
> - if (tmp < 0)
> - rwsem_downgrade_wake(sem);
> -}
> -
> -/*
> - * implement exchange and add functionality
> - */
> -static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
> -{
> - return atomic_add_return(delta, (atomic_t *)(&sem->count));
> -}
> -
> -#endif /* __KERNEL__ */
> -#endif /* _ASM_SH_RWSEM_H */
> --
> 2.8.0.rc3
>
[toc] | [prev] | [next] | [standalone]
| From | Geert Uytterhoeven <geert@linux-m68k.org> |
|---|---|
| Date | 2016-04-06 12:00 +0200 |
| Subject | Re: [PATCH 2/2] sh, rwsem: drop superfluous arch specific implementation |
| Message-ID | <rkSpI-1RZ-17@gated-at.bofh.it> |
| In reply to | #1372323 |
Dag Peter,
On Wed, Apr 6, 2016 at 11:26 AM, Peter Zijlstra <peterz@infradead.org> wrote:
> +Cc maintainers, linux-sh list is very high signal-to-noise as its been
> appropriated for renesas arm parts.
FTR, Renesas ARM parts have moved to linux-renesas-soc.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
[toc] | [prev] | [next] | [standalone]
| From | Peter Zijlstra <peterz@infradead.org> |
|---|---|
| Date | 2016-04-06 12:30 +0200 |
| Subject | Re: [PATCH 2/2] sh, rwsem: drop superfluous arch specific implementation |
| Message-ID | <rkSSK-2lx-17@gated-at.bofh.it> |
| In reply to | #1372350 |
On Wed, Apr 06, 2016 at 11:50:00AM +0200, Geert Uytterhoeven wrote: > Dag Peter, > > On Wed, Apr 6, 2016 at 11:26 AM, Peter Zijlstra <peterz@infradead.org> wrote: > > +Cc maintainers, linux-sh list is very high signal-to-noise as its been > > appropriated for renesas arm parts. > > FTR, Renesas ARM parts have moved to linux-renesas-soc. Ah, good to know that situation has been sorted. Thanks!
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-04-04 11:10 +0200 |
| Subject | [PATCH 1/2] xtensa, rwsem: drop superfluous arch specific implementation |
| Message-ID | <rk8Ge-NO-21@gated-at.bofh.it> |
| In reply to | #1370475 |
From: Michal Hocko <mhocko@suse.com>
since "locking, rwsem: drop explicit memory barriers" the arch specific
code is basically same as the the generic one so we can drop the
superfluous code.
Suggested-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
arch/xtensa/include/asm/Kbuild | 1 +
arch/xtensa/include/asm/rwsem.h | 134 ----------------------------------------
2 files changed, 1 insertion(+), 134 deletions(-)
delete mode 100644 arch/xtensa/include/asm/rwsem.h
diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild
index b56855a1382a..28cf4c5d65ef 100644
--- a/arch/xtensa/include/asm/Kbuild
+++ b/arch/xtensa/include/asm/Kbuild
@@ -22,6 +22,7 @@ generic-y += mm-arch-hooks.h
generic-y += percpu.h
generic-y += preempt.h
generic-y += resource.h
+generic-y += rwsem.h
generic-y += sections.h
generic-y += siginfo.h
generic-y += statfs.h
diff --git a/arch/xtensa/include/asm/rwsem.h b/arch/xtensa/include/asm/rwsem.h
deleted file mode 100644
index 6283823b8040..000000000000
--- a/arch/xtensa/include/asm/rwsem.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * include/asm-xtensa/rwsem.h
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Largely copied from include/asm-ppc/rwsem.h
- *
- * Copyright (C) 2001 - 2005 Tensilica Inc.
- */
-
-#ifndef _XTENSA_RWSEM_H
-#define _XTENSA_RWSEM_H
-
-#ifndef _LINUX_RWSEM_H
-#error "Please don't include <asm/rwsem.h> directly, use <linux/rwsem.h> instead."
-#endif
-
-#define RWSEM_UNLOCKED_VALUE 0x00000000
-#define RWSEM_ACTIVE_BIAS 0x00000001
-#define RWSEM_ACTIVE_MASK 0x0000ffff
-#define RWSEM_WAITING_BIAS (-0x00010000)
-#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
-#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
-
-/*
- * lock for reading
- */
-static inline void __down_read(struct rw_semaphore *sem)
-{
- if (atomic_add_return(1,(atomic_t *)(&sem->count)) <= 0)
- rwsem_down_read_failed(sem);
-}
-
-static inline int __down_read_trylock(struct rw_semaphore *sem)
-{
- int tmp;
-
- while ((tmp = sem->count) >= 0) {
- if (tmp == cmpxchg(&sem->count, tmp,
- tmp + RWSEM_ACTIVE_READ_BIAS)) {
- return 1;
- }
- }
- return 0;
-}
-
-/*
- * lock for writing
- */
-static inline void __down_write(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS,
- (atomic_t *)(&sem->count));
- if (tmp != RWSEM_ACTIVE_WRITE_BIAS)
- rwsem_down_write_failed(sem);
-}
-
-static inline int __down_write_killable(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS,
- (atomic_t *)(&sem->count));
- if (tmp != RWSEM_ACTIVE_WRITE_BIAS)
- if (IS_ERR(rwsem_down_write_failed_killable(sem)))
- return -EINTR;
-
- return 0;
-}
-
-static inline int __down_write_trylock(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = cmpxchg(&sem->count, RWSEM_UNLOCKED_VALUE,
- RWSEM_ACTIVE_WRITE_BIAS);
- return tmp == RWSEM_UNLOCKED_VALUE;
-}
-
-/*
- * unlock after reading
- */
-static inline void __up_read(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = atomic_sub_return(1,(atomic_t *)(&sem->count));
- if (tmp < -1 && (tmp & RWSEM_ACTIVE_MASK) == 0)
- rwsem_wake(sem);
-}
-
-/*
- * unlock after writing
- */
-static inline void __up_write(struct rw_semaphore *sem)
-{
- if (atomic_sub_return(RWSEM_ACTIVE_WRITE_BIAS,
- (atomic_t *)(&sem->count)) < 0)
- rwsem_wake(sem);
-}
-
-/*
- * implement atomic add functionality
- */
-static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
-{
- atomic_add(delta, (atomic_t *)(&sem->count));
-}
-
-/*
- * downgrade write lock to read lock
- */
-static inline void __downgrade_write(struct rw_semaphore *sem)
-{
- int tmp;
-
- tmp = atomic_add_return(-RWSEM_WAITING_BIAS, (atomic_t *)(&sem->count));
- if (tmp < 0)
- rwsem_downgrade_wake(sem);
-}
-
-/*
- * implement exchange and add functionality
- */
-static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
-{
- return atomic_add_return(delta, (atomic_t *)(&sem->count));
-}
-
-#endif /* _XTENSA_RWSEM_H */
--
2.8.0.rc3
[toc] | [prev] | [next] | [standalone]
| From | Max Filippov <jcmvbkbc@gmail.com> |
|---|---|
| Date | 2016-04-04 12:30 +0200 |
| Subject | Re: [PATCH 1/2] xtensa, rwsem: drop superfluous arch specific implementation |
| Message-ID | <rk9VF-1Ap-37@gated-at.bofh.it> |
| In reply to | #1370481 |
On Mon, Apr 4, 2016 at 12:06 PM, Michal Hocko <mhocko@kernel.org> wrote: > From: Michal Hocko <mhocko@suse.com> > > since "locking, rwsem: drop explicit memory barriers" the arch specific > code is basically same as the the generic one so we can drop the > superfluous code. > > Suggested-by: Davidlohr Bueso <dave@stgolabs.net> > Signed-off-by: Michal Hocko <mhocko@suse.com> > --- > arch/xtensa/include/asm/Kbuild | 1 + > arch/xtensa/include/asm/rwsem.h | 134 ---------------------------------------- > 2 files changed, 1 insertion(+), 134 deletions(-) > delete mode 100644 arch/xtensa/include/asm/rwsem.h Acked-by: Max Filippov <jcmvbkbc@gmail.com> -- Thanks. -- Max
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web