On 09/10/2013 01:55 AM, Peter Zijlstra wrote: > 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().
So since reader->writer recurision is ok, as is reader->reader recurision, I wanted to avoid lockdep false positives if an irq lands in between the aquire/release calls. So by doing the acquire/release w/ irqs off on the read side, we only trap the writer->reader recursion issues. And agreed, the preempt_disable is overdoing it :) Thanks for the review! -john -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/