lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Tue, 14 Apr 2015 12:26:52 +0200
From:	Ingo Molnar <mingo@...nel.org>
To:	Peter Zijlstra <peterz@...radead.org>
Cc:	rusty@...tcorp.com.au, mathieu.desnoyers@...icios.com,
	oleg@...hat.com, paulmck@...ux.vnet.ibm.com,
	torvalds@...ux-foundation.org, linux-kernel@...r.kernel.org,
	andi@...stfloor.org, rostedt@...dmis.org, tglx@...utronix.de,
	laijs@...fujitsu.com, linux@...izon.com,
	Andrea Arcangeli <aarcange@...hat.com>,
	David Woodhouse <David.Woodhouse@...el.com>,
	Rik van Riel <riel@...hat.com>,
	Michel Lespinasse <walken@...gle.com>
Subject: Re: [PATCH v5 05/10] seqlock: Better document
 raw_write_seqcount_latch()


* Peter Zijlstra <peterz@...radead.org> wrote:

> On Mon, Apr 13, 2015 at 09:17:50PM +0200, Peter Zijlstra wrote:
> > On Mon, Apr 13, 2015 at 06:32:02PM +0200, Ingo Molnar wrote:
> > > 
> > > Btw., I realize this is just a sample, but couldn't this be written 
> > > more optimally as:
> > > 
> > > 	do {
> > > 		seq = READ_ONCE(latch->seq);
> > > 		smp_read_barrier_depends();
> > > 
> > > 		idx = seq & 0x01;
> > > 		entry = data_query(latch->data[idx], ...);
> > > 
> > > 		smp_rmb();
> > > 	} while (seq != latch->seq);
> > > 
> 
> > Should we look at introducing yet another seq primitive?
> 
> Like so?
> 
> ---
> --- a/include/linux/seqlock.h
> +++ b/include/linux/seqlock.h
> @@ -233,6 +233,11 @@ static inline void raw_write_seqcount_en
>  	s->sequence++;
>  }
>  
> +static inline int raw_read_seqcount_latch(seqcount_t *s)
> +{
> +	return lockless_dereference(s->sequence);
> +}
> +
>  /**
>   * raw_write_seqcount_latch - redirect readers to even/odd copy
>   * @s: pointer to seqcount_t
> @@ -284,8 +289,7 @@ static inline void raw_write_seqcount_en
>   *	unsigned seq, idx;
>   *
>   *	do {
> - *		seq = latch->seq;
> - *		smp_rmb();
> + *		seq = lockless_dereference(latch->seq);
>   *
>   *		idx = seq & 0x01;
>   *		entry = data_query(latch->data[idx], ...);
> --- a/kernel/time/timekeeping.c
> +++ b/kernel/time/timekeeping.c
> @@ -393,7 +393,7 @@ static __always_inline u64 __ktime_get_f
>  	u64 now;
>  
>  	do {
> -		seq = raw_read_seqcount(&tkf->seq);
> +		seq = raw_read_seqcount_latch(&tkf->seq);
>  		tkr = tkf->base + (seq & 0x01);
>  		now = ktime_to_ns(tkr->base) + timekeeping_get_ns(tkr);
>  	} while (read_seqcount_retry(&tkf->seq, seq));

Sounds good to me!

Thanks,

	Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ