From: Byungchul Park <byungchul.park@lge.com>
To: Ingo Molnar <mingo@kernel.org>
Cc: peterz@infradead.org, axboe@kernel.dk, tglx@linutronix.de,
linux-kernel@vger.kernel.org, linux-mm@kvack.org, tj@kernel.org,
johannes.berg@intel.com, oleg@redhat.com, amir73il@gmail.com,
david@fromorbit.com, darrick.wong@oracle.com,
linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-block@vger.kernel.org, hch@infradead.org,
idryomov@gmail.com, kernel-team@lge.com
Subject: Re: [PATCH v3 8/8] block: Assign a lock_class per gendisk used for wait_for_completion()
Date: Wed, 25 Oct 2017 09:26:12 +0900 [thread overview]
Message-ID: <20171025002612.GN3310@X58A-UD3R> (raw)
In-Reply-To: <20171024101551.sftqsy5mk34fxru7@gmail.com>
On Tue, Oct 24, 2017 at 12:15:51PM +0200, Ingo Molnar wrote:
> > @@ -1409,9 +1403,12 @@ struct gendisk *alloc_disk_node(int minors, int node_id)
> > disk_to_dev(disk)->type = &disk_type;
> > device_initialize(disk_to_dev(disk));
> > }
> > +
> > + lockdep_init_map(&disk->lockdep_map, lock_name, key, 0);
>
> lockdep_init_map() depends on CONFIG_DEBUG_LOCK_ALLOC IIRC, but the data structure
> change you made depends on CONFIG_LOCKDEP_COMPLETIONS:
OMG, my mistake! I am very sorry. I will fix it.
BTW, lockdep_init_map() seems to decide whether using lockdep_map or
ignoring it, depending on CONFIG_LOCKDEP than CONFIG_DEBUG_LOCK_ALLOC.
> > return disk;
> > }
> > -EXPORT_SYMBOL(alloc_disk_node);
> > +EXPORT_SYMBOL(__alloc_disk_node);
> >
> > struct kobject *get_disk(struct gendisk *disk)
> > {
> > diff --git a/include/linux/genhd.h b/include/linux/genhd.h
> > index 6d85a75..9832e3c 100644
> > --- a/include/linux/genhd.h
> > +++ b/include/linux/genhd.h
> > @@ -206,6 +206,9 @@ struct gendisk {
> > #endif /* CONFIG_BLK_DEV_INTEGRITY */
> > int node_id;
> > struct badblocks *bb;
> > +#ifdef CONFIG_LOCKDEP_COMPLETIONS
> > + struct lockdep_map lockdep_map;
> > +#endif
> > };
>
> Which is risking a future build failure at minimum.
>
> Isn't lockdep_map a zero size structure that is always defined? If yes then
> there's no need for an #ifdef.
No, a zero size structure for lockdep_map is not provided yet.
There are two options I can do:
1. Add a zero size structure for lockdep_map and remove #ifdef
2. Replace CONFIG_LOCKDEP_COMPLETIONS with CONFIG_LOCKDEP here.
Or something else?
Which one do you prefer?
> Also:
>
> >
> > static inline struct gendisk *part_to_disk(struct hd_struct *part)
> > @@ -590,8 +593,7 @@ extern struct hd_struct * __must_check add_partition(struct gendisk *disk,
> > extern void delete_partition(struct gendisk *, int);
> > extern void printk_all_partitions(void);
> >
> > -extern struct gendisk *alloc_disk_node(int minors, int node_id);
> > -extern struct gendisk *alloc_disk(int minors);
> > +extern struct gendisk *__alloc_disk_node(int minors, int node_id, struct lock_class_key *key, const char *lock_name);
> > extern struct kobject *get_disk(struct gendisk *disk);
> > extern void put_disk(struct gendisk *disk);
> > extern void blk_register_region(dev_t devt, unsigned long range,
> > @@ -615,6 +617,22 @@ extern ssize_t part_fail_store(struct device *dev,
> > const char *buf, size_t count);
> > #endif /* CONFIG_FAIL_MAKE_REQUEST */
> >
> > +#ifdef CONFIG_LOCKDEP_COMPLETIONS
> > +#define alloc_disk_node(m, id) \
> > +({ \
> > + static struct lock_class_key __key; \
> > + const char *__lock_name; \
> > + \
> > + __lock_name = "(complete)"#m"("#id")"; \
> > + \
> > + __alloc_disk_node(m, id, &__key, __lock_name); \
> > +})
> > +#else
> > +#define alloc_disk_node(m, id) __alloc_disk_node(m, id, NULL, NULL)
> > +#endif
> > +
> > +#define alloc_disk(m) alloc_disk_node(m, NUMA_NO_NODE)
> > +
> > static inline int hd_ref_init(struct hd_struct *part)
> > {
> > if (percpu_ref_init(&part->ref, __delete_partition, 0,
>
> Why is the lockdep_map passed in to the init function? Since it's wrapped in an
> ugly fashion anyway, why not introduce a clean inline function that calls
This is the way workqueue adopted for that purpose. BTW, can I make
a lock_class_key distinguishable from another of a different gendisk,
using inline function?
> lockdep_init_map() on the returned structure.
Ok. I will make it work on the returned structre instead of passing it.
> No #ifdefs required, and no uglification of the alloc_disk_node() interface.
Ok. I will remove this #ifdef.
Thank you very much.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2017-10-25 0:26 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-24 9:38 [PATCH v3 0/8] cross-release: enhence performance and fix false positives Byungchul Park
2017-10-24 9:38 ` [PATCH v3 1/8] block: use DECLARE_COMPLETION_ONSTACK in submit_bio_wait Byungchul Park
2017-10-24 9:38 ` [PATCH v3 2/8] lockdep: Introduce CROSSRELEASE_STACK_TRACE and make it not unwind as default Byungchul Park
2017-10-24 10:05 ` Ingo Molnar
2017-10-25 1:01 ` Byungchul Park
2017-10-25 5:53 ` Ingo Molnar
2017-10-24 10:06 ` Ingo Molnar
2017-10-24 9:38 ` [PATCH v3 3/8] lockdep: Remove BROKEN flag of LOCKDEP_CROSSRELEASE Byungchul Park
2017-10-24 10:06 ` Ingo Molnar
2017-10-24 9:38 ` [PATCH v3 4/8] lockdep: Add a kernel parameter, crossrelease_fullstack Byungchul Park
2017-10-24 10:08 ` Ingo Molnar
2017-10-24 23:45 ` Byungchul Park
2017-10-24 9:38 ` [PATCH v3 5/8] completion: Add support for initializing completion with lockdep_map Byungchul Park
2017-10-24 9:38 ` [PATCH v3 6/8] lockdep: Remove unnecessary acquisitions wrt workqueue flush Byungchul Park
2017-10-24 9:38 ` [PATCH v3 7/8] genhd.h: Remove trailing white space Byungchul Park
2017-10-24 10:10 ` Ingo Molnar
2017-10-24 9:38 ` [PATCH v3 8/8] block: Assign a lock_class per gendisk used for wait_for_completion() Byungchul Park
2017-10-24 10:15 ` Ingo Molnar
2017-10-25 0:26 ` Byungchul Park [this message]
2017-10-25 5:55 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171025002612.GN3310@X58A-UD3R \
--to=byungchul.park@lge.com \
--cc=amir73il@gmail.com \
--cc=axboe@kernel.dk \
--cc=darrick.wong@oracle.com \
--cc=david@fromorbit.com \
--cc=hch@infradead.org \
--cc=idryomov@gmail.com \
--cc=johannes.berg@intel.com \
--cc=kernel-team@lge.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).