On Tue, 20 Oct 2015, Daniel Wagner wrote:
> +
> +extern void swake_up(struct swait_queue_head *q);
> +extern void swake_up_all(struct swait_queue_head *q);
> +extern void swake_up_locked(struct swait_queue_head *q);
I intentionally named these functions swait_wake* in my initial
implementation for two reasons:
- typoing wake_up vs. swake_up only emits a compiler warning and does
not break the build
- I really prefer new infrastructure to have a consistent prefix
which reflects the "subsystem". That's simpler to read and simpler
to grep for.
> +extern void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait);
> +extern void prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait, int state);
> +extern long prepare_to_swait_event(struct swait_queue_head *q, struct swait_queue *wait, int state);
> +
> +extern void __finish_swait(struct swait_queue_head *q, struct swait_queue *wait);
> +extern void finish_swait(struct swait_queue_head *q, struct swait_queue *wait);
Can we please go with the original names?
swait_prepare()
swait_prepare_locked()
swait_finish()
swait_finish_locked()
Hmm?
> +#define swait_event(wq, condition) \
Here we have the same swait vs. wait problem as above. So either we
come up with a slightly different name or have an explicit type check
in __swait_event event.
Thanks,
tglx
On 11/04/2015 11:33 AM, Thomas Gleixner wrote:
> On Tue, 20 Oct 2015, Daniel Wagner wrote:
>> +
>> +extern void swake_up(struct swait_queue_head *q);
>> +extern void swake_up_all(struct swait_queue_head *q);
>> +extern void swake_up_locked(struct swait_queue_head *q);
>
> I intentionally named these functions swait_wake* in my initial
> implementation for two reasons:
>
> - typoing wake_up vs. swake_up only emits a compiler warning and does
> not break the build
I played a bit around on this and came up with the patch below. The type
check results in an error.
> - I really prefer new infrastructure to have a consistent prefix
> which reflects the "subsystem". That's simpler to read and simpler
> to grep for.
>
>> +extern void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait);
>> +extern void prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait, int state);
>> +extern long prepare_to_swait_event(struct swait_queue_head *q, struct swait_queue *wait, int state);
>> +
>> +extern void __finish_swait(struct swait_queue_head *q, struct swait_queue *wait);
>> +extern void finish_swait(struct swait_queue_head *q, struct swait_queue *wait);
>
> Can we please go with the original names?
>
> swait_prepare()
> swait_prepare_locked()
> swait_finish()
> swait_finish_locked()
>
> Hmm?
I defer to Peter :)
>> +#define swait_event(wq, condition) \
>
> Here we have the same swait vs. wait problem as above. So either we
> come up with a slightly different name or have an explicit type check
> in __swait_event event.
What about something like this:
diff --git a/include/linux/swait.h b/include/linux/swait.h
index c1f9c62..f59369d 100644
--- a/include/linux/swait.h
+++ b/include/linux/swait.h
@@ -6,6 +6,9 @@
#include <linux/spinlock.h>
#include <asm/current.h>
+#define compiletime_assert_same_type(a, b) \
+ compiletime_assert(__same_type(a, b), "Need to match correct type");
+
/*
* Simple wait queues
*
@@ -66,6 +69,7 @@ extern void __init_swait_queue_head(struct swait_queue_head *q, const char *name
#define init_swait_queue_head(q) \
do { \
static struct lock_class_key __key; \
+ compiletime_assert_same_type(struct swait_queue_head *, q); \
__init_swait_queue_head((q), #q, &__key); \
} while (0)
On Wed, Nov 04, 2015 at 11:33:51AM +0100, Thomas Gleixner wrote:
> On Tue, 20 Oct 2015, Daniel Wagner wrote:
> > +
> > +extern void swake_up(struct swait_queue_head *q);
> > +extern void swake_up_all(struct swait_queue_head *q);
> > +extern void swake_up_locked(struct swait_queue_head *q);
>
> I intentionally named these functions swait_wake* in my initial
> implementation for two reasons:
>
> - typoing wake_up vs. swake_up only emits a compiler warning and does
> not break the build
-Werror ftw, but yes good point.
> - I really prefer new infrastructure to have a consistent prefix
> which reflects the "subsystem". That's simpler to read and simpler
> to grep for.
I generally agree, but seeing how this is really an 'extension' of
existing infrastructure, I went along with this.
> > +extern void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait);
> > +extern void prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait, int state);
> > +extern long prepare_to_swait_event(struct swait_queue_head *q, struct swait_queue *wait, int state);
> > +
> > +extern void __finish_swait(struct swait_queue_head *q, struct swait_queue *wait);
> > +extern void finish_swait(struct swait_queue_head *q, struct swait_queue *wait);
>
> Can we please go with the original names?
>
> swait_prepare()
> swait_prepare_locked()
> swait_finish()
> swait_finish_locked()
>
> Hmm?
>
> > +#define swait_event(wq, condition) \
>
> Here we have the same swait vs. wait problem as above. So either we
> come up with a slightly different name or have an explicit type check
> in __swait_event event.
Type check macros, otherwise you break the naming scheme you so
adamantly push for (or end up with horrid stuff like
swait_wait_event()).
I suppose we can do the rename as you propose to avoid single letter
typoes, but it does bug me to have two nearly identical bits of infra
with such dissimilar names.
On Wed, 18 Nov 2015, Peter Zijlstra wrote:
> I suppose we can do the rename as you propose to avoid single letter
> typoes, but it does bug me to have two nearly identical bits of infra
> with such dissimilar names.
I can see your point, but OTOH the existing interface is ugly and
copying it does not make it any better.
But I'm really not religious about that. Up to you :)
Thanks,
tglx