2021-06-16 19:10:46

by Xiongwei Song

[permalink] [raw]
Subject: [PATCH] locking/lockdep: unlikely bfs error check

From: Xiongwei Song <[email protected]>

The error from graph walk is small probability event, so unlikely
bfs_error can improve performance a little bit.

Signed-off-by: Xiongwei Song <[email protected]>
---
kernel/locking/lockdep.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 074fd6418c20..af8c9203cd3e 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -2646,7 +2646,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
bfs_init_rootb(&this, prev);

ret = __bfs_backwards(&this, &usage_mask, usage_accumulate, usage_skip, NULL);
- if (bfs_error(ret)) {
+ if (unlikely(bfs_error(ret))) {
print_bfs_bug(ret);
return 0;
}
@@ -2664,7 +2664,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
bfs_init_root(&that, next);

ret = find_usage_forwards(&that, forward_mask, &target_entry1);
- if (bfs_error(ret)) {
+ if (unlikely(bfs_error(ret))) {
print_bfs_bug(ret);
return 0;
}
@@ -2679,7 +2679,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
backward_mask = original_mask(target_entry1->class->usage_mask);

ret = find_usage_backwards(&this, backward_mask, &target_entry);
- if (bfs_error(ret)) {
+ if (unlikely(bfs_error(ret))) {
print_bfs_bug(ret);
return 0;
}
@@ -2998,7 +2998,7 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
* Is the <prev> -> <next> link redundant?
*/
ret = check_redundant(prev, next);
- if (bfs_error(ret))
+ if (unlikely(bfs_error(ret)))
return 0;
else if (ret == BFS_RMATCH)
return 2;
@@ -3911,7 +3911,7 @@ check_usage_forwards(struct task_struct *curr, struct held_lock *this,

bfs_init_root(&root, this);
ret = find_usage_forwards(&root, usage_mask, &target_entry);
- if (bfs_error(ret)) {
+ if (unlikely(bfs_error(ret))) {
print_bfs_bug(ret);
return 0;
}
@@ -3946,7 +3946,7 @@ check_usage_backwards(struct task_struct *curr, struct held_lock *this,

bfs_init_rootb(&root, this);
ret = find_usage_backwards(&root, usage_mask, &target_entry);
- if (bfs_error(ret)) {
+ if (unlikely(bfs_error(ret))) {
print_bfs_bug(ret);
return 0;
}
--
2.30.2


2021-06-16 19:11:11

by Xiongwei Song

[permalink] [raw]
Subject: [PATCH] locking/lockdep: print possible warning after counting deps

From: Xiongwei Song <[email protected]>

The graph walk might hit error when counting dependencies. Once the
return value is negative, print a warning to reminder users.

Signed-off-by: Xiongwei Song <[email protected]>
---
kernel/locking/lockdep.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 7641bd407239..074fd6418c20 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -2028,8 +2028,12 @@ static unsigned long __lockdep_count_forward_deps(struct lock_list *this)
{
unsigned long count = 0;
struct lock_list *target_entry;
+ enum bfs_result ret;
+
+ ret = __bfs_forwards(this, (void *)&count, noop_count, NULL, &target_entry);

- __bfs_forwards(this, (void *)&count, noop_count, NULL, &target_entry);
+ if (unlikely(bfs_error(ret)))
+ print_bfs_bug(ret);

return count;
}
@@ -2053,8 +2057,12 @@ static unsigned long __lockdep_count_backward_deps(struct lock_list *this)
{
unsigned long count = 0;
struct lock_list *target_entry;
+ enum bfs_result ret;
+
+ ret = __bfs_backwards(this, (void *)&count, noop_count, NULL, &target_entry);

- __bfs_backwards(this, (void *)&count, noop_count, NULL, &target_entry);
+ if (unlikely(bfs_error(ret)))
+ print_bfs_bug(ret);

return count;
}
--
2.30.2

2021-06-16 20:21:36

by Waiman Long

[permalink] [raw]
Subject: Re: [PATCH] locking/lockdep: unlikely bfs error check

On 6/16/21 10:42 AM, Xiongwei Song wrote:
> From: Xiongwei Song <[email protected]>
>
> The error from graph walk is small probability event, so unlikely
> bfs_error can improve performance a little bit.
>
> Signed-off-by: Xiongwei Song <[email protected]>
> ---
> kernel/locking/lockdep.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
> index 074fd6418c20..af8c9203cd3e 100644
> --- a/kernel/locking/lockdep.c
> +++ b/kernel/locking/lockdep.c
> @@ -2646,7 +2646,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
> bfs_init_rootb(&this, prev);
>
> ret = __bfs_backwards(&this, &usage_mask, usage_accumulate, usage_skip, NULL);
> - if (bfs_error(ret)) {
> + if (unlikely(bfs_error(ret))) {
> print_bfs_bug(ret);
> return 0;
> }
> @@ -2664,7 +2664,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
> bfs_init_root(&that, next);
>
> ret = find_usage_forwards(&that, forward_mask, &target_entry1);
> - if (bfs_error(ret)) {
> + if (unlikely(bfs_error(ret))) {
> print_bfs_bug(ret);
> return 0;
> }
> @@ -2679,7 +2679,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
> backward_mask = original_mask(target_entry1->class->usage_mask);
>
> ret = find_usage_backwards(&this, backward_mask, &target_entry);
> - if (bfs_error(ret)) {
> + if (unlikely(bfs_error(ret))) {
> print_bfs_bug(ret);
> return 0;
> }
> @@ -2998,7 +2998,7 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
> * Is the <prev> -> <next> link redundant?
> */
> ret = check_redundant(prev, next);
> - if (bfs_error(ret))
> + if (unlikely(bfs_error(ret)))
> return 0;
> else if (ret == BFS_RMATCH)
> return 2;
> @@ -3911,7 +3911,7 @@ check_usage_forwards(struct task_struct *curr, struct held_lock *this,
>
> bfs_init_root(&root, this);
> ret = find_usage_forwards(&root, usage_mask, &target_entry);
> - if (bfs_error(ret)) {
> + if (unlikely(bfs_error(ret))) {
> print_bfs_bug(ret);
> return 0;
> }
> @@ -3946,7 +3946,7 @@ check_usage_backwards(struct task_struct *curr, struct held_lock *this,
>
> bfs_init_rootb(&root, this);
> ret = find_usage_backwards(&root, usage_mask, &target_entry);
> - if (bfs_error(ret)) {
> + if (unlikely(bfs_error(ret))) {
> print_bfs_bug(ret);
> return 0;
> }

I think it is better to put the unlikely() directly into the bfs_error()
inline function instead of sprinkling it all over the place.

Cheers,
Longman

2021-06-16 20:26:19

by Xiongwei Song

[permalink] [raw]
Subject: Re: [PATCH] locking/lockdep: unlikely bfs error check



> On Jun 16, 2021, at 10:48 PM, Waiman Long <[email protected]> wrote:
>
> On 6/16/21 10:42 AM, Xiongwei Song wrote:
>> From: Xiongwei Song <[email protected]>
>>
>> The error from graph walk is small probability event, so unlikely
>> bfs_error can improve performance a little bit.
>>
>> Signed-off-by: Xiongwei Song <[email protected]>
>> ---
>> kernel/locking/lockdep.c | 12 ++++++------
>> 1 file changed, 6 insertions(+), 6 deletions(-)
>>
>> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
>> index 074fd6418c20..af8c9203cd3e 100644
>> --- a/kernel/locking/lockdep.c
>> +++ b/kernel/locking/lockdep.c
>> @@ -2646,7 +2646,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
>> bfs_init_rootb(&this, prev);
>> ret = __bfs_backwards(&this, &usage_mask, usage_accumulate, usage_skip, NULL);
>> - if (bfs_error(ret)) {
>> + if (unlikely(bfs_error(ret))) {
>> print_bfs_bug(ret);
>> return 0;
>> }
>> @@ -2664,7 +2664,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
>> bfs_init_root(&that, next);
>> ret = find_usage_forwards(&that, forward_mask, &target_entry1);
>> - if (bfs_error(ret)) {
>> + if (unlikely(bfs_error(ret))) {
>> print_bfs_bug(ret);
>> return 0;
>> }
>> @@ -2679,7 +2679,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
>> backward_mask = original_mask(target_entry1->class->usage_mask);
>> ret = find_usage_backwards(&this, backward_mask, &target_entry);
>> - if (bfs_error(ret)) {
>> + if (unlikely(bfs_error(ret))) {
>> print_bfs_bug(ret);
>> return 0;
>> }
>> @@ -2998,7 +2998,7 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
>> * Is the <prev> -> <next> link redundant?
>> */
>> ret = check_redundant(prev, next);
>> - if (bfs_error(ret))
>> + if (unlikely(bfs_error(ret)))
>> return 0;
>> else if (ret == BFS_RMATCH)
>> return 2;
>> @@ -3911,7 +3911,7 @@ check_usage_forwards(struct task_struct *curr, struct held_lock *this,
>> bfs_init_root(&root, this);
>> ret = find_usage_forwards(&root, usage_mask, &target_entry);
>> - if (bfs_error(ret)) {
>> + if (unlikely(bfs_error(ret))) {
>> print_bfs_bug(ret);
>> return 0;
>> }
>> @@ -3946,7 +3946,7 @@ check_usage_backwards(struct task_struct *curr, struct held_lock *this,
>> bfs_init_rootb(&root, this);
>> ret = find_usage_backwards(&root, usage_mask, &target_entry);
>> - if (bfs_error(ret)) {
>> + if (unlikely(bfs_error(ret))) {
>> print_bfs_bug(ret);
>> return 0;
>> }
>
> I think it is better to put the unlikely() directly into the bfs_error() inline function instead of sprinkling it all over the place.

Sounds good. Thank you for the suggestion. I will update the patch.

Regards,
Xiongwei

>
> Cheers,
> Longman
>

2021-06-16 20:29:27

by Waiman Long

[permalink] [raw]
Subject: Re: [PATCH] locking/lockdep: unlikely bfs error check

On 6/16/21 10:59 AM, Xiongwei Song wrote:
>
>> On Jun 16, 2021, at 10:48 PM, Waiman Long <[email protected]> wrote:
>>
>> On 6/16/21 10:42 AM, Xiongwei Song wrote:
>>> From: Xiongwei Song <[email protected]>
>>>
>>> The error from graph walk is small probability event, so unlikely
>>> bfs_error can improve performance a little bit.
>>>
>>> Signed-off-by: Xiongwei Song <[email protected]>
>>> ---
>>> kernel/locking/lockdep.c | 12 ++++++------
>>> 1 file changed, 6 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
>>> index 074fd6418c20..af8c9203cd3e 100644
>>> --- a/kernel/locking/lockdep.c
>>> +++ b/kernel/locking/lockdep.c
>>> @@ -2646,7 +2646,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
>>> bfs_init_rootb(&this, prev);
>>> ret = __bfs_backwards(&this, &usage_mask, usage_accumulate, usage_skip, NULL);
>>> - if (bfs_error(ret)) {
>>> + if (unlikely(bfs_error(ret))) {
>>> print_bfs_bug(ret);
>>> return 0;
>>> }
>>> @@ -2664,7 +2664,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
>>> bfs_init_root(&that, next);
>>> ret = find_usage_forwards(&that, forward_mask, &target_entry1);
>>> - if (bfs_error(ret)) {
>>> + if (unlikely(bfs_error(ret))) {
>>> print_bfs_bug(ret);
>>> return 0;
>>> }
>>> @@ -2679,7 +2679,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
>>> backward_mask = original_mask(target_entry1->class->usage_mask);
>>> ret = find_usage_backwards(&this, backward_mask, &target_entry);
>>> - if (bfs_error(ret)) {
>>> + if (unlikely(bfs_error(ret))) {
>>> print_bfs_bug(ret);
>>> return 0;
>>> }
>>> @@ -2998,7 +2998,7 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
>>> * Is the <prev> -> <next> link redundant?
>>> */
>>> ret = check_redundant(prev, next);
>>> - if (bfs_error(ret))
>>> + if (unlikely(bfs_error(ret)))
>>> return 0;
>>> else if (ret == BFS_RMATCH)
>>> return 2;
>>> @@ -3911,7 +3911,7 @@ check_usage_forwards(struct task_struct *curr, struct held_lock *this,
>>> bfs_init_root(&root, this);
>>> ret = find_usage_forwards(&root, usage_mask, &target_entry);
>>> - if (bfs_error(ret)) {
>>> + if (unlikely(bfs_error(ret))) {
>>> print_bfs_bug(ret);
>>> return 0;
>>> }
>>> @@ -3946,7 +3946,7 @@ check_usage_backwards(struct task_struct *curr, struct held_lock *this,
>>> bfs_init_rootb(&root, this);
>>> ret = find_usage_backwards(&root, usage_mask, &target_entry);
>>> - if (bfs_error(ret)) {
>>> + if (unlikely(bfs_error(ret))) {
>>> print_bfs_bug(ret);
>>> return 0;
>>> }
>> I think it is better to put the unlikely() directly into the bfs_error() inline function instead of sprinkling it all over the place.
> Sounds good. Thank you for the suggestion. I will update the patch.

Another nit. It is a bit odd that sent out two patches separately though
they do seem to have a bit of dependency. I think you should post them
as a 2-patch series.

Cheers,
Longman

2021-06-17 02:48:52

by Xiongwei Song

[permalink] [raw]
Subject: Re: [PATCH] locking/lockdep: unlikely bfs error check

On Wed, Jun 16, 2021 at 11:11 PM Waiman Long <[email protected]> wrote:
>
> On 6/16/21 10:59 AM, Xiongwei Song wrote:
> >
> >> On Jun 16, 2021, at 10:48 PM, Waiman Long <[email protected]> wrote:
> >>
> >> On 6/16/21 10:42 AM, Xiongwei Song wrote:
> >>> From: Xiongwei Song <[email protected]>
> >>>
> >>> The error from graph walk is small probability event, so unlikely
> >>> bfs_error can improve performance a little bit.
> >>>
> >>> Signed-off-by: Xiongwei Song <[email protected]>
> >>> ---
> >>> kernel/locking/lockdep.c | 12 ++++++------
> >>> 1 file changed, 6 insertions(+), 6 deletions(-)
> >>>
> >>> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
> >>> index 074fd6418c20..af8c9203cd3e 100644
> >>> --- a/kernel/locking/lockdep.c
> >>> +++ b/kernel/locking/lockdep.c
> >>> @@ -2646,7 +2646,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
> >>> bfs_init_rootb(&this, prev);
> >>> ret = __bfs_backwards(&this, &usage_mask, usage_accumulate, usage_skip, NULL);
> >>> - if (bfs_error(ret)) {
> >>> + if (unlikely(bfs_error(ret))) {
> >>> print_bfs_bug(ret);
> >>> return 0;
> >>> }
> >>> @@ -2664,7 +2664,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
> >>> bfs_init_root(&that, next);
> >>> ret = find_usage_forwards(&that, forward_mask, &target_entry1);
> >>> - if (bfs_error(ret)) {
> >>> + if (unlikely(bfs_error(ret))) {
> >>> print_bfs_bug(ret);
> >>> return 0;
> >>> }
> >>> @@ -2679,7 +2679,7 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
> >>> backward_mask = original_mask(target_entry1->class->usage_mask);
> >>> ret = find_usage_backwards(&this, backward_mask, &target_entry);
> >>> - if (bfs_error(ret)) {
> >>> + if (unlikely(bfs_error(ret))) {
> >>> print_bfs_bug(ret);
> >>> return 0;
> >>> }
> >>> @@ -2998,7 +2998,7 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
> >>> * Is the <prev> -> <next> link redundant?
> >>> */
> >>> ret = check_redundant(prev, next);
> >>> - if (bfs_error(ret))
> >>> + if (unlikely(bfs_error(ret)))
> >>> return 0;
> >>> else if (ret == BFS_RMATCH)
> >>> return 2;
> >>> @@ -3911,7 +3911,7 @@ check_usage_forwards(struct task_struct *curr, struct held_lock *this,
> >>> bfs_init_root(&root, this);
> >>> ret = find_usage_forwards(&root, usage_mask, &target_entry);
> >>> - if (bfs_error(ret)) {
> >>> + if (unlikely(bfs_error(ret))) {
> >>> print_bfs_bug(ret);
> >>> return 0;
> >>> }
> >>> @@ -3946,7 +3946,7 @@ check_usage_backwards(struct task_struct *curr, struct held_lock *this,
> >>> bfs_init_rootb(&root, this);
> >>> ret = find_usage_backwards(&root, usage_mask, &target_entry);
> >>> - if (bfs_error(ret)) {
> >>> + if (unlikely(bfs_error(ret))) {
> >>> print_bfs_bug(ret);
> >>> return 0;
> >>> }
> >> I think it is better to put the unlikely() directly into the bfs_error() inline function instead of sprinkling it all over the place.
> > Sounds good. Thank you for the suggestion. I will update the patch.
>
> Another nit. It is a bit odd that sent out two patches separately though
> they do seem to have a bit of dependency. I think you should post them
> as a 2-patch series.

Ok. Let me do it. Thank you again.

Regards,
Xiongwei

> Cheers,
> Longman
>

2021-06-17 02:50:52

by Xiongwei Song

[permalink] [raw]
Subject: Re: [PATCH] locking/lockdep: print possible warning after counting deps

Please ignore this patch. I will resend as Longman's suggestions.
Please see https://lkml.org/lkml/2021/6/16/949.

Regards,
Xiongwei


On Wed, Jun 16, 2021 at 10:42 PM Xiongwei Song <[email protected]> wrote:
>
> From: Xiongwei Song <[email protected]>
>
> The graph walk might hit error when counting dependencies. Once the
> return value is negative, print a warning to reminder users.
>
> Signed-off-by: Xiongwei Song <[email protected]>
> ---
> kernel/locking/lockdep.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
> index 7641bd407239..074fd6418c20 100644
> --- a/kernel/locking/lockdep.c
> +++ b/kernel/locking/lockdep.c
> @@ -2028,8 +2028,12 @@ static unsigned long __lockdep_count_forward_deps(struct lock_list *this)
> {
> unsigned long count = 0;
> struct lock_list *target_entry;
> + enum bfs_result ret;
> +
> + ret = __bfs_forwards(this, (void *)&count, noop_count, NULL, &target_entry);
>
> - __bfs_forwards(this, (void *)&count, noop_count, NULL, &target_entry);
> + if (unlikely(bfs_error(ret)))
> + print_bfs_bug(ret);
>
> return count;
> }
> @@ -2053,8 +2057,12 @@ static unsigned long __lockdep_count_backward_deps(struct lock_list *this)
> {
> unsigned long count = 0;
> struct lock_list *target_entry;
> + enum bfs_result ret;
> +
> + ret = __bfs_backwards(this, (void *)&count, noop_count, NULL, &target_entry);
>
> - __bfs_backwards(this, (void *)&count, noop_count, NULL, &target_entry);
> + if (unlikely(bfs_error(ret)))
> + print_bfs_bug(ret);
>
> return count;
> }
> --
> 2.30.2
>