Messages in this thread | | | Date | Tue, 10 Sep 2013 10:55:45 +0200 | From | Peter Zijlstra <> | Subject | Re: [PATCH] [RFC] seqcount: Add lockdep functionality to seqcount/seqlock structures |
| |
On Mon, Sep 09, 2013 at 09:42:46PM -0700, John Stultz wrote: > @@ -38,10 +39,58 @@ > */ > typedef struct seqcount { > unsigned sequence; > +#ifdef CONFIG_DEBUG_LOCK_ALLOC > + struct lockdep_map dep_map; > +#endif > } seqcount_t; > > -#define SEQCNT_ZERO { 0 } > -#define seqcount_init(x) do { *(x) = (seqcount_t) SEQCNT_ZERO; } while (0) > + > + > + > +static inline void __seqcount_init(seqcount_t *s, const char *name, > + struct lock_class_key *key) > +{ > +#ifdef CONFIG_DEBUG_LOCK_ALLOC > + /* > + * Make sure we are not reinitializing a held lock: > + */ > + lockdep_init_map(&s->dep_map, name, key, 0); > +#endif > + s->sequence = 0; > +} > + > + > +#ifdef CONFIG_DEBUG_LOCK_ALLOC > +# define SEQCOUNT_DEP_MAP_INIT(lockname) \ > + .dep_map = { .name = #lockname } \ > + > +# define seqcount_init(s) \ > + do { \ > + static struct lock_class_key __key; \ > + __seqcount_init((s), #s, &__key); \ > + } while (0) > + > +static inline void seqcount_reader_access(const seqcount_t *s) > +{ > + seqcount_t *l = (seqcount_t *)s; > + unsigned long flags; > + > + preempt_disable(); > + local_irq_save(flags); > + seqcount_acquire_read(&l->dep_map, 0, 0, _RET_IP_); > + seqcount_release(&l->dep_map, 1, _RET_IP_); > + local_irq_restore(flags); > + preempt_enable(); > +}
Why the preempt and local_irq thing? Also preempt_disable is quite superfluous if you do local_irq_disable().
> + > +#else > +# define SEQCOUNT_DEP_MAP_INIT(lockname) > +# define seqcount_init(s) __seqcount_init(s, NULL, NULL) > +# define seqcount_reader_access(x) > +#endif > + > +#define SEQCNT_ZERO(lockname) { .sequence = 0, SEQCOUNT_DEP_MAP_INIT(lockname)} > +
| |