diff mbox series

lib: sbi: Improve sbi_hsm_hart_interruptible_mask

Message ID 20231127123933.48851-1-wxjstz@126.com
State Not Applicable
Headers show
Series lib: sbi: Improve sbi_hsm_hart_interruptible_mask | expand

Commit Message

Xiang W Nov. 27, 2023, 12:39 p.m. UTC
Improve bit scanning with for_each_set_bit.

Signed-off-by: Xiang W <wxjstz@126.com>
---
 lib/sbi/sbi_hsm.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

Comments

Anup Patel Dec. 10, 2023, 6:11 a.m. UTC | #1
On Mon, Nov 27, 2023 at 6:10 PM Xiang W <wxjstz@126.com> wrote:
>
> Improve bit scanning with for_each_set_bit.
>
> Signed-off-by: Xiang W <wxjstz@126.com>
> ---
>  lib/sbi/sbi_hsm.c | 10 +++-------
>  1 file changed, 3 insertions(+), 7 deletions(-)
>
> diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
> index 147f954..bffac27 100644
> --- a/lib/sbi/sbi_hsm.c
> +++ b/lib/sbi/sbi_hsm.c
> @@ -114,22 +114,18 @@ int sbi_hsm_hart_interruptible_mask(const struct sbi_domain *dom,
>                                     ulong hbase, ulong *out_hmask)
>  {
>         int hstate;
> -       ulong i, hmask, dmask;
> +       ulong i, dmask;
>
>         *out_hmask = 0;
>         if (!sbi_hartid_valid(hbase))
>                 return SBI_EINVAL;
>
>         dmask = sbi_domain_get_assigned_hartmask(dom, hbase);
> -       for (i = 0; i < BITS_PER_LONG; i++) {
> -               hmask = 1UL << i;
> -               if (!(dmask & hmask))
> -                       continue;
> -
> +       for_each_set_bit(i, &dmask, BITS_PER_LONG) {

We have intentionally avoided using for_each_set_bit() here because
for_each_set_bit() is quite heavy handed and involves function calls to
find_first_bit() and find_next_bit. The for_each_set_bitbetter for dealing
with large bitmaps but for small bitmaps it becomes an overkill.

Also, please keep in mind that sbi_hsm_hart_interruptible_mask() is
in hot-path because it is called by sbi_ipi_send_many().

>                 hstate = __sbi_hsm_hart_get_state(hbase + i);
>                 if (hstate == SBI_HSM_STATE_STARTED ||
>                     hstate == SBI_HSM_STATE_SUSPENDED)
> -                       *out_hmask |= hmask;
> +                       *out_hmask |= 1UL << i;
>         }
>
>         return 0;
> --
> 2.42.0
>
>
> --
> opensbi mailing list
> opensbi@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi

Regards,
Anup
diff mbox series

Patch

diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
index 147f954..bffac27 100644
--- a/lib/sbi/sbi_hsm.c
+++ b/lib/sbi/sbi_hsm.c
@@ -114,22 +114,18 @@  int sbi_hsm_hart_interruptible_mask(const struct sbi_domain *dom,
 				    ulong hbase, ulong *out_hmask)
 {
 	int hstate;
-	ulong i, hmask, dmask;
+	ulong i, dmask;
 
 	*out_hmask = 0;
 	if (!sbi_hartid_valid(hbase))
 		return SBI_EINVAL;
 
 	dmask = sbi_domain_get_assigned_hartmask(dom, hbase);
-	for (i = 0; i < BITS_PER_LONG; i++) {
-		hmask = 1UL << i;
-		if (!(dmask & hmask))
-			continue;
-
+	for_each_set_bit(i, &dmask, BITS_PER_LONG) {
 		hstate = __sbi_hsm_hart_get_state(hbase + i);
 		if (hstate == SBI_HSM_STATE_STARTED ||
 		    hstate == SBI_HSM_STATE_SUSPENDED)
-			*out_hmask |= hmask;
+			*out_hmask |= 1UL << i;
 	}
 
 	return 0;