[XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
The purpose of this macro is to encapsulate the well-known expression 'x & -x' that in 2's complement architectures on unsigned integers will give a mask where only the least significant nonzero bit of 'x' is set, or 0 if none are set. A deviation for ECLAIR is also introduced. Signed-off-by: Nicola Vetrini --- Changes in v2: - rename to LOWEST_BIT Changes in v3: - entry for deviations.rst - comment on the macro defn Changes in v4: - Change the macro's name to ISOLATE_LOW_BIT --- automation/eclair_analysis/ECLAIR/deviations.ecl | 7 +++ docs/misra/deviations.rst| 8 xen/include/xen/macros.h | 10 -- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/automation/eclair_analysis/ECLAIR/deviations.ecl b/automation/eclair_analysis/ECLAIR/deviations.ecl index fa56e5c00a27..139dabc8477f 100644 --- a/automation/eclair_analysis/ECLAIR/deviations.ecl +++ b/automation/eclair_analysis/ECLAIR/deviations.ecl @@ -246,6 +246,13 @@ constant expressions are required.\"" "any()"} -doc_end +-doc_begin="The macro ISOLATE_LOW_BIT encapsulates a well-known pattern to obtain +a mask where only the lowest bit set in the argument is set, if any, for unsigned +integers arguments on two's complement architectures +(all the architectures supported by Xen satisfy this requirement)." +-config=MC3R1.R10.1,reports+={safe, "any_area(any_loc(any_exp(macro(^ISOLATE_LOW_BIT$"} +-doc_end + # # Series 13 # diff --git a/docs/misra/deviations.rst b/docs/misra/deviations.rst index 8511a189253b..d76b28279e59 100644 --- a/docs/misra/deviations.rst +++ b/docs/misra/deviations.rst @@ -192,6 +192,14 @@ Deviations related to MISRA C:2012 Rules: See automation/eclair_analysis/deviations.ecl for the full explanation. - Tagged as `safe` for ECLAIR. + * - R10.1 + - The macro ISOLATE_LOW_BIT encapsulates the well-known pattern (x & -x) + applied to unsigned integer values on 2's complement architectures + (i.e., all architectures supported by Xen), used to obtain a mask where + just the least significant nonzero bit of x is set. + If no bits are set, 0 is returned. + - Tagged as `safe` for ECLAIR. + * - R13.5 - All developers and reviewers can be safely assumed to be well aware of the short-circuit evaluation strategy for logical operators. diff --git a/xen/include/xen/macros.h b/xen/include/xen/macros.h index d0caae7db298..4e1b1f4e4b56 100644 --- a/xen/include/xen/macros.h +++ b/xen/include/xen/macros.h @@ -8,8 +8,14 @@ #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) +/* + * Given an unsigned integer argument, expands to a mask where just the least + * significant nonzero bit of the argument is set, or 0 if no bits are set. + */ +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) + +#define MASK_EXTR(v, m) (((v) & (m)) / ISOLATE_LOW_BIT(m)) +#define MASK_INSR(v, m) (((v) * ISOLATE_LOW_BIT(m)) & (m)) #define count_args_(dot, a1, a2, a3, a4, a5, a6, a7, a8, x, ...) x #define count_args(args...) \ -- 2.34.1
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On Fri, 26 Oct 2023, Nicola Vetrini wrote: > The purpose of this macro is to encapsulate the well-known expression > 'x & -x' that in 2's complement architectures on unsigned integers will > give a mask where only the least significant nonzero bit of 'x' is set, > or 0 if none are set. > > A deviation for ECLAIR is also introduced. > > Signed-off-by: Nicola Vetrini Reviewed-by: Stefano Stabellini
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 27.10.2023 15:34, Nicola Vetrini wrote: > --- a/xen/include/xen/macros.h > +++ b/xen/include/xen/macros.h > @@ -8,8 +8,14 @@ > #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) > #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) > > -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) > -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) > +/* > + * Given an unsigned integer argument, expands to a mask where just the least > + * significant nonzero bit of the argument is set, or 0 if no bits are set. > + */ > +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) Not even considering future Misra changes (which aiui may require that anyway), this generalization of the macro imo demands that its argument now be evaluated only once. Also another thought regarding the name: Would ISOLATE_LSB() be acceptable to everyone having voiced a view on the set of proposed names? It would be at least a little shorter ... Jan
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On Mon, 30 Oct 2023, Jan Beulich wrote: > On 27.10.2023 15:34, Nicola Vetrini wrote: > > --- a/xen/include/xen/macros.h > > +++ b/xen/include/xen/macros.h > > @@ -8,8 +8,14 @@ > > #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) > > #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) > > > > -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) > > -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) > > +/* > > + * Given an unsigned integer argument, expands to a mask where just the > > least > > + * significant nonzero bit of the argument is set, or 0 if no bits are set. > > + */ > > +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) > > Not even considering future Misra changes (which aiui may require that > anyway), this generalization of the macro imo demands that its argument > now be evaluated only once. Fur sure that would be an improvement, but I don't see a trivial way to do it and this issue is also present today before the patch. I think it would be better to avoid scope-creeping this patch as we are already at v4 for something that was expected to be a trivial mechanical change. I would rather review the fix as a separate patch, maybe sent by you as you probably have a specific implementation in mind? > Also another thought regarding the name: Would ISOLATE_LSB() be acceptable > to everyone having voiced a view on the set of proposed names? It would be > at least a little shorter ... I would be OK with that
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 30.10.2023 23:44, Stefano Stabellini wrote: > On Mon, 30 Oct 2023, Jan Beulich wrote: >> On 27.10.2023 15:34, Nicola Vetrini wrote: >>> --- a/xen/include/xen/macros.h >>> +++ b/xen/include/xen/macros.h >>> @@ -8,8 +8,14 @@ >>> #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) >>> #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) >>> >>> -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) >>> -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) >>> +/* >>> + * Given an unsigned integer argument, expands to a mask where just the >>> least >>> + * significant nonzero bit of the argument is set, or 0 if no bits are set. >>> + */ >>> +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) >> >> Not even considering future Misra changes (which aiui may require that >> anyway), this generalization of the macro imo demands that its argument >> now be evaluated only once. > > Fur sure that would be an improvement, but I don't see a trivial way to > do it and this issue is also present today before the patch. This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but the new macro has wider use, and there was no issue elsewhere so far. > I think it > would be better to avoid scope-creeping this patch as we are already at > v4 for something that was expected to be a trivial mechanical change. I > would rather review the fix as a separate patch, maybe sent by you as > you probably have a specific implementation in mind? #define ISOLATE_LOW_BIT(x) ({ \ typeof(x) x_ = (x); \ x_ & -x_; \ }) Hard to see the scope creep here. What I would consider scope creep I specifically didn't even ask for: I'd like this macro to be overridable by an arch. Specifically (see my earlier naming hint) I'd like to use x86's BMI insn BLSI in the context of "x86: allow Kconfig control over psABI level", when ABI v2 or higher is in use. Jan
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 2023-10-31 08:43, Jan Beulich wrote: On 30.10.2023 23:44, Stefano Stabellini wrote: On Mon, 30 Oct 2023, Jan Beulich wrote: On 27.10.2023 15:34, Nicola Vetrini wrote: --- a/xen/include/xen/macros.h +++ b/xen/include/xen/macros.h @@ -8,8 +8,14 @@ #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) +/* + * Given an unsigned integer argument, expands to a mask where just the least + * significant nonzero bit of the argument is set, or 0 if no bits are set. + */ +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) Not even considering future Misra changes (which aiui may require that anyway), this generalization of the macro imo demands that its argument now be evaluated only once. Fur sure that would be an improvement, but I don't see a trivial way to do it and this issue is also present today before the patch. This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but the new macro has wider use, and there was no issue elsewhere so far. I think it would be better to avoid scope-creeping this patch as we are already at v4 for something that was expected to be a trivial mechanical change. I would rather review the fix as a separate patch, maybe sent by you as you probably have a specific implementation in mind? #define ISOLATE_LOW_BIT(x) ({ \ typeof(x) x_ = (x); \ x_ & -x_; \ }) Hard to see the scope creep here. What I would consider scope creep I specifically didn't even ask for: I'd like this macro to be overridable by an arch. Specifically (see my earlier naming hint) I'd like to use x86's BMI insn BLSI in the context of "x86: allow Kconfig control over psABI level", when ABI v2 or higher is in use. Jan I appreciate you suggesting an implementation; I'll send a v5 incorporating it. -- Nicola Vetrini, BSc Software Engineer, BUGSENG srl (https://bugseng.com)
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 2023-10-31 09:28, Nicola Vetrini wrote: On 2023-10-31 08:43, Jan Beulich wrote: On 30.10.2023 23:44, Stefano Stabellini wrote: On Mon, 30 Oct 2023, Jan Beulich wrote: On 27.10.2023 15:34, Nicola Vetrini wrote: --- a/xen/include/xen/macros.h +++ b/xen/include/xen/macros.h @@ -8,8 +8,14 @@ #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) +/* + * Given an unsigned integer argument, expands to a mask where just the least + * significant nonzero bit of the argument is set, or 0 if no bits are set. + */ +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) Not even considering future Misra changes (which aiui may require that anyway), this generalization of the macro imo demands that its argument now be evaluated only once. Fur sure that would be an improvement, but I don't see a trivial way to do it and this issue is also present today before the patch. This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but the new macro has wider use, and there was no issue elsewhere so far. I think it would be better to avoid scope-creeping this patch as we are already at v4 for something that was expected to be a trivial mechanical change. I would rather review the fix as a separate patch, maybe sent by you as you probably have a specific implementation in mind? #define ISOLATE_LOW_BIT(x) ({ \ typeof(x) x_ = (x); \ x_ & -x_; \ }) Hard to see the scope creep here. What I would consider scope creep I specifically didn't even ask for: I'd like this macro to be overridable by an arch. Specifically (see my earlier naming hint) I'd like to use x86's BMI insn BLSI in the context of "x86: allow Kconfig control over psABI level", when ABI v2 or higher is in use. Jan I appreciate you suggesting an implementation; I'll send a v5 incorporating it. There's an issue with this approach, though: since the macro is used indirectly in expressions that are e.g. case labels or array sizes, the build fails (see [1] for instance). Perhaps it's best to leave it as is? [1] https://gitlab.com/xen-project/people/bugseng/xen/-/jobs/5423693947 -- Nicola Vetrini, BSc Software Engineer, BUGSENG srl (https://bugseng.com)
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 31.10.2023 11:03, Nicola Vetrini wrote: > On 2023-10-31 09:28, Nicola Vetrini wrote: >> On 2023-10-31 08:43, Jan Beulich wrote: >>> On 30.10.2023 23:44, Stefano Stabellini wrote: On Mon, 30 Oct 2023, Jan Beulich wrote: > On 27.10.2023 15:34, Nicola Vetrini wrote: >> --- a/xen/include/xen/macros.h >> +++ b/xen/include/xen/macros.h >> @@ -8,8 +8,14 @@ >> #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) >> #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) >> >> -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) >> -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) >> +/* >> + * Given an unsigned integer argument, expands to a mask where >> just the least >> + * significant nonzero bit of the argument is set, or 0 if no bits >> are set. >> + */ >> +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) > > Not even considering future Misra changes (which aiui may require > that > anyway), this generalization of the macro imo demands that its > argument > now be evaluated only once. Fur sure that would be an improvement, but I don't see a trivial way to do it and this issue is also present today before the patch. >>> >>> This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but the >>> new >>> macro has wider use, and there was no issue elsewhere so far. >>> I think it would be better to avoid scope-creeping this patch as we are already at v4 for something that was expected to be a trivial mechanical change. I would rather review the fix as a separate patch, maybe sent by you as you probably have a specific implementation in mind? >>> >>> #define ISOLATE_LOW_BIT(x) ({ \ >>> typeof(x) x_ = (x); \ >>> x_ & -x_; \ >>> }) >>> >>> Hard to see the scope creep here. What I would consider scope creep I >>> specifically didn't even ask for: I'd like this macro to be >>> overridable >>> by an arch. Specifically (see my earlier naming hint) I'd like to use >>> x86's BMI insn BLSI in the context of "x86: allow Kconfig control over >>> psABI level", when ABI v2 or higher is in use. >> >> I appreciate you suggesting an implementation; I'll send a v5 >> incorporating it. > > There's an issue with this approach, though: since the macro is used > indirectly > in expressions that are e.g. case labels or array sizes, the build fails > (see [1] for instance). > Perhaps it's best to leave it as is? Hmm. I'm afraid it's not an option to "leave as is", not the least because - as said - I'm under the impression that another Misra rule requires macro arguments to be evaluated exactly once. Best I can think of right away is to have a macro for limited use (to address such build issues) plus an inline function (for general use). But yes, maybe that then indeed needs to be a 2nd step. Jan > [1] https://gitlab.com/xen-project/people/bugseng/xen/-/jobs/5423693947 >
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 2023-10-31 11:20, Jan Beulich wrote: On 31.10.2023 11:03, Nicola Vetrini wrote: On 2023-10-31 09:28, Nicola Vetrini wrote: On 2023-10-31 08:43, Jan Beulich wrote: On 30.10.2023 23:44, Stefano Stabellini wrote: On Mon, 30 Oct 2023, Jan Beulich wrote: On 27.10.2023 15:34, Nicola Vetrini wrote: --- a/xen/include/xen/macros.h +++ b/xen/include/xen/macros.h @@ -8,8 +8,14 @@ #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) +/* + * Given an unsigned integer argument, expands to a mask where just the least + * significant nonzero bit of the argument is set, or 0 if no bits are set. + */ +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) Not even considering future Misra changes (which aiui may require that anyway), this generalization of the macro imo demands that its argument now be evaluated only once. Fur sure that would be an improvement, but I don't see a trivial way to do it and this issue is also present today before the patch. This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but the new macro has wider use, and there was no issue elsewhere so far. I think it would be better to avoid scope-creeping this patch as we are already at v4 for something that was expected to be a trivial mechanical change. I would rather review the fix as a separate patch, maybe sent by you as you probably have a specific implementation in mind? #define ISOLATE_LOW_BIT(x) ({ \ typeof(x) x_ = (x); \ x_ & -x_; \ }) Hard to see the scope creep here. What I would consider scope creep I specifically didn't even ask for: I'd like this macro to be overridable by an arch. Specifically (see my earlier naming hint) I'd like to use x86's BMI insn BLSI in the context of "x86: allow Kconfig control over psABI level", when ABI v2 or higher is in use. I appreciate you suggesting an implementation; I'll send a v5 incorporating it. There's an issue with this approach, though: since the macro is used indirectly in expressions that are e.g. case labels or array sizes, the build fails (see [1] for instance). Perhaps it's best to leave it as is? Hmm. I'm afraid it's not an option to "leave as is", not the least because - as said - I'm under the impression that another Misra rule requires macro arguments to be evaluated exactly once. Best I can think of right away is to have a macro for limited use (to address such build issues) plus an inline function (for general use). But yes, maybe that then indeed needs to be a 2nd step. Jan [1] https://gitlab.com/xen-project/people/bugseng/xen/-/jobs/5423693947 There is no such MISRA Rule afaik: R23.7 is similar, but only for C11 generic selections. -- Nicola Vetrini, BSc Software Engineer, BUGSENG srl (https://bugseng.com)
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 31.10.2023 08:43, Jan Beulich wrote: > What I would consider scope creep I > specifically didn't even ask for: I'd like this macro to be overridable > by an arch. Specifically (see my earlier naming hint) I'd like to use > x86's BMI insn BLSI in the context of "x86: allow Kconfig control over > psABI level", when ABI v2 or higher is in use. Actually I need to withdraw that. It meanwhile occurred to me that the compiler ought to recognize this pattern. And indeed gcc doesn't even have a builtin for it; its BMI intrinsic for BLSI (on x86 that is) specifically expands to x & -x, which the backend then is expected to deal with as appropriate. And indeed it can be observed to, with my "x86: allow Kconfig control over psABI level" in place. Just as a reminder: I'd still like to see the further renaming done (to ISOLATE_LSB()). If I was to commit this patch, I'd be fine doing so while committing. Jan
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On Thu, 9 Nov 2023, Jan Beulich wrote: > On 31.10.2023 08:43, Jan Beulich wrote: > > What I would consider scope creep I > > specifically didn't even ask for: I'd like this macro to be overridable > > by an arch. Specifically (see my earlier naming hint) I'd like to use > > x86's BMI insn BLSI in the context of "x86: allow Kconfig control over > > psABI level", when ABI v2 or higher is in use. > > Actually I need to withdraw that. It meanwhile occurred to me that the > compiler ought to recognize this pattern. And indeed gcc doesn't even > have a builtin for it; its BMI intrinsic for BLSI (on x86 that is) > specifically expands to x & -x, which the backend then is expected to > deal with as appropriate. And indeed it can be observed to, with my > "x86: allow Kconfig control over psABI level" in place. > > Just as a reminder: I'd still like to see the further renaming done > (to ISOLATE_LSB()). If I was to commit this patch, I'd be fine doing > so while committing. Please do
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 31.10.2023 11:20, Jan Beulich wrote: > On 31.10.2023 11:03, Nicola Vetrini wrote: >> On 2023-10-31 09:28, Nicola Vetrini wrote: >>> On 2023-10-31 08:43, Jan Beulich wrote: On 30.10.2023 23:44, Stefano Stabellini wrote: > On Mon, 30 Oct 2023, Jan Beulich wrote: >> On 27.10.2023 15:34, Nicola Vetrini wrote: >>> --- a/xen/include/xen/macros.h >>> +++ b/xen/include/xen/macros.h >>> @@ -8,8 +8,14 @@ >>> #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) >>> #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) >>> >>> -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) >>> -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) >>> +/* >>> + * Given an unsigned integer argument, expands to a mask where >>> just the least >>> + * significant nonzero bit of the argument is set, or 0 if no bits >>> are set. >>> + */ >>> +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) >> >> Not even considering future Misra changes (which aiui may require >> that >> anyway), this generalization of the macro imo demands that its >> argument >> now be evaluated only once. > > Fur sure that would be an improvement, but I don't see a trivial way > to > do it and this issue is also present today before the patch. This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but the new macro has wider use, and there was no issue elsewhere so far. > I think it > would be better to avoid scope-creeping this patch as we are already > at > v4 for something that was expected to be a trivial mechanical change. > I > would rather review the fix as a separate patch, maybe sent by you as > you probably have a specific implementation in mind? #define ISOLATE_LOW_BIT(x) ({ \ typeof(x) x_ = (x); \ x_ & -x_; \ }) Hard to see the scope creep here. What I would consider scope creep I specifically didn't even ask for: I'd like this macro to be overridable by an arch. Specifically (see my earlier naming hint) I'd like to use x86's BMI insn BLSI in the context of "x86: allow Kconfig control over psABI level", when ABI v2 or higher is in use. >>> >>> I appreciate you suggesting an implementation; I'll send a v5 >>> incorporating it. >> >> There's an issue with this approach, though: since the macro is used >> indirectly >> in expressions that are e.g. case labels or array sizes, the build fails >> (see [1] for instance). >> Perhaps it's best to leave it as is? > > Hmm. I'm afraid it's not an option to "leave as is", not the least because > - as said - I'm under the impression that another Misra rule requires > macro arguments to be evaluated exactly once. Best I can think of right > away is to have a macro for limited use (to address such build issues) > plus an inline function (for general use). But yes, maybe that then indeed > needs to be a 2nd step. While I've committed this patch (hoping that I got the necessary context adjustment right for the automation/eclair_analysis/ECLAIR/deviations.ecl change), I'd like to come back to this before going further with users of the new macro: I still think we ought to try to get to the single evaluation wherever possible. The macro would then be used only in cases where the alternative construct (perhaps an isolate_lsb() macro, living perhaps in xen/bitops.h) cannot be used. ISOLATE_LSB() would then want to gain a comment directing people to the "better" sibling. Thoughts? Jan
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 2023-11-16 09:26, Jan Beulich wrote: On 31.10.2023 11:20, Jan Beulich wrote: On 31.10.2023 11:03, Nicola Vetrini wrote: On 2023-10-31 09:28, Nicola Vetrini wrote: On 2023-10-31 08:43, Jan Beulich wrote: On 30.10.2023 23:44, Stefano Stabellini wrote: On Mon, 30 Oct 2023, Jan Beulich wrote: On 27.10.2023 15:34, Nicola Vetrini wrote: --- a/xen/include/xen/macros.h +++ b/xen/include/xen/macros.h @@ -8,8 +8,14 @@ #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) +/* + * Given an unsigned integer argument, expands to a mask where just the least + * significant nonzero bit of the argument is set, or 0 if no bits are set. + */ +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) Not even considering future Misra changes (which aiui may require that anyway), this generalization of the macro imo demands that its argument now be evaluated only once. Fur sure that would be an improvement, but I don't see a trivial way to do it and this issue is also present today before the patch. This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but the new macro has wider use, and there was no issue elsewhere so far. I think it would be better to avoid scope-creeping this patch as we are already at v4 for something that was expected to be a trivial mechanical change. I would rather review the fix as a separate patch, maybe sent by you as you probably have a specific implementation in mind? #define ISOLATE_LOW_BIT(x) ({ \ typeof(x) x_ = (x); \ x_ & -x_; \ }) Hard to see the scope creep here. What I would consider scope creep I specifically didn't even ask for: I'd like this macro to be overridable by an arch. Specifically (see my earlier naming hint) I'd like to use x86's BMI insn BLSI in the context of "x86: allow Kconfig control over psABI level", when ABI v2 or higher is in use. I appreciate you suggesting an implementation; I'll send a v5 incorporating it. There's an issue with this approach, though: since the macro is used indirectly in expressions that are e.g. case labels or array sizes, the build fails (see [1] for instance). Perhaps it's best to leave it as is? Hmm. I'm afraid it's not an option to "leave as is", not the least because - as said - I'm under the impression that another Misra rule requires macro arguments to be evaluated exactly once. Best I can think of right away is to have a macro for limited use (to address such build issues) plus an inline function (for general use). But yes, maybe that then indeed needs to be a 2nd step. While I've committed this patch (hoping that I got the necessary context adjustment right for the automation/eclair_analysis/ECLAIR/deviations.ecl change), I'd like to come back to this before going further with users of the new macro: I still think we ought to try to get to the single evaluation wherever possible. The macro would then be used only in cases where the alternative construct (perhaps an isolate_lsb() macro, living perhaps in xen/bitops.h) cannot be used. ISOLATE_LSB() would then want to gain a comment directing people to the "better" sibling. Thoughts? Having the users in place would help me estimate the remaining work that needs to be done on this rule and see if my local counts match up with the counts in staging. -- Nicola Vetrini, BSc Software Engineer, BUGSENG srl (https://bugseng.com)
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 16.11.2023 11:02, Nicola Vetrini wrote: > On 2023-11-16 09:26, Jan Beulich wrote: >> On 31.10.2023 11:20, Jan Beulich wrote: >>> On 31.10.2023 11:03, Nicola Vetrini wrote: On 2023-10-31 09:28, Nicola Vetrini wrote: > On 2023-10-31 08:43, Jan Beulich wrote: >> On 30.10.2023 23:44, Stefano Stabellini wrote: >>> On Mon, 30 Oct 2023, Jan Beulich wrote: On 27.10.2023 15:34, Nicola Vetrini wrote: > --- a/xen/include/xen/macros.h > +++ b/xen/include/xen/macros.h > @@ -8,8 +8,14 @@ > #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) > #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) > > -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) > -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) > +/* > + * Given an unsigned integer argument, expands to a mask where > just the least > + * significant nonzero bit of the argument is set, or 0 if no > bits > are set. > + */ > +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) Not even considering future Misra changes (which aiui may require that anyway), this generalization of the macro imo demands that its argument now be evaluated only once. >>> >>> Fur sure that would be an improvement, but I don't see a trivial >>> way >>> to >>> do it and this issue is also present today before the patch. >> >> This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but >> the >> new >> macro has wider use, and there was no issue elsewhere so far. >> >>> I think it >>> would be better to avoid scope-creeping this patch as we are >>> already >>> at >>> v4 for something that was expected to be a trivial mechanical >>> change. >>> I >>> would rather review the fix as a separate patch, maybe sent by you >>> as >>> you probably have a specific implementation in mind? >> >> #define ISOLATE_LOW_BIT(x) ({ \ >> typeof(x) x_ = (x); \ >> x_ & -x_; \ >> }) >> >> Hard to see the scope creep here. What I would consider scope creep >> I >> specifically didn't even ask for: I'd like this macro to be >> overridable >> by an arch. Specifically (see my earlier naming hint) I'd like to >> use >> x86's BMI insn BLSI in the context of "x86: allow Kconfig control >> over >> psABI level", when ABI v2 or higher is in use. > > I appreciate you suggesting an implementation; I'll send a v5 > incorporating it. There's an issue with this approach, though: since the macro is used indirectly in expressions that are e.g. case labels or array sizes, the build fails (see [1] for instance). Perhaps it's best to leave it as is? >>> >>> Hmm. I'm afraid it's not an option to "leave as is", not the least >>> because >>> - as said - I'm under the impression that another Misra rule requires >>> macro arguments to be evaluated exactly once. Best I can think of >>> right >>> away is to have a macro for limited use (to address such build issues) >>> plus an inline function (for general use). But yes, maybe that then >>> indeed >>> needs to be a 2nd step. >> >> While I've committed this patch (hoping that I got the necessary >> context >> adjustment right for the >> automation/eclair_analysis/ECLAIR/deviations.ecl >> change), I'd like to come back to this before going further with users >> of >> the new macro: I still think we ought to try to get to the single >> evaluation wherever possible. The macro would then be used only in >> cases >> where the alternative construct (perhaps an isolate_lsb() macro, living >> perhaps in xen/bitops.h) cannot be used. ISOLATE_LSB() would then want >> to >> gain a comment directing people to the "better" sibling. Thoughts? > > Having the users in place would help me estimate the remaining work that > needs to be done on this rule and see if my local counts match up with > the counts in staging. By "having the users in place", you mean you want other patches in this and the dependent series to be committed as-is (except for the name change)? That's what I'd like to avoid, as it would mean touching all those use sites again where the proposed isolate_lsb() could be used instead. I'd rather see all use sites be put into their final shape right away. Jan
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On Thu, 16 Nov 2023, Jan Beulich wrote: > On 16.11.2023 11:02, Nicola Vetrini wrote: > > On 2023-11-16 09:26, Jan Beulich wrote: > >> On 31.10.2023 11:20, Jan Beulich wrote: > >>> On 31.10.2023 11:03, Nicola Vetrini wrote: > On 2023-10-31 09:28, Nicola Vetrini wrote: > > On 2023-10-31 08:43, Jan Beulich wrote: > >> On 30.10.2023 23:44, Stefano Stabellini wrote: > >>> On Mon, 30 Oct 2023, Jan Beulich wrote: > On 27.10.2023 15:34, Nicola Vetrini wrote: > > --- a/xen/include/xen/macros.h > > +++ b/xen/include/xen/macros.h > > @@ -8,8 +8,14 @@ > > #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) > > #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) > > > > -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) > > -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) > > +/* > > + * Given an unsigned integer argument, expands to a mask where > > just the least > > + * significant nonzero bit of the argument is set, or 0 if no > > bits > > are set. > > + */ > > +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) > > Not even considering future Misra changes (which aiui may require > that > anyway), this generalization of the macro imo demands that its > argument > now be evaluated only once. > >>> > >>> Fur sure that would be an improvement, but I don't see a trivial > >>> way > >>> to > >>> do it and this issue is also present today before the patch. > >> > >> This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but > >> the > >> new > >> macro has wider use, and there was no issue elsewhere so far. > >> > >>> I think it > >>> would be better to avoid scope-creeping this patch as we are > >>> already > >>> at > >>> v4 for something that was expected to be a trivial mechanical > >>> change. > >>> I > >>> would rather review the fix as a separate patch, maybe sent by you > >>> as > >>> you probably have a specific implementation in mind? > >> > >> #define ISOLATE_LOW_BIT(x) ({ \ > >> typeof(x) x_ = (x); \ > >> x_ & -x_; \ > >> }) > >> > >> Hard to see the scope creep here. What I would consider scope creep > >> I > >> specifically didn't even ask for: I'd like this macro to be > >> overridable > >> by an arch. Specifically (see my earlier naming hint) I'd like to > >> use > >> x86's BMI insn BLSI in the context of "x86: allow Kconfig control > >> over > >> psABI level", when ABI v2 or higher is in use. > > > > I appreciate you suggesting an implementation; I'll send a v5 > > incorporating it. > > There's an issue with this approach, though: since the macro is used > indirectly > in expressions that are e.g. case labels or array sizes, the build > fails > (see [1] for instance). > Perhaps it's best to leave it as is? > >>> > >>> Hmm. I'm afraid it's not an option to "leave as is", not the least > >>> because > >>> - as said - I'm under the impression that another Misra rule requires > >>> macro arguments to be evaluated exactly once. Best I can think of > >>> right > >>> away is to have a macro for limited use (to address such build issues) > >>> plus an inline function (for general use). But yes, maybe that then > >>> indeed > >>> needs to be a 2nd step. > >> > >> While I've committed this patch (hoping that I got the necessary > >> context > >> adjustment right for the > >> automation/eclair_analysis/ECLAIR/deviations.ecl > >> change), I'd like to come back to this before going further with users > >> of > >> the new macro: I still think we ought to try to get to the single > >> evaluation wherever possible. The macro would then be used only in > >> cases > >> where the alternative construct (perhaps an isolate_lsb() macro, living > >> perhaps in xen/bitops.h) cannot be used. ISOLATE_LSB() would then want > >> to > >> gain a comment directing people to the "better" sibling. Thoughts? > > > > Having the users in place would help me estimate the remaining work that > > needs to be done on this rule and see if my local counts match up with > > the counts in staging. > > By "having the users in place", you mean you want other patches in this > and the dependent series to be committed as-is (except for the name > change)? That's what I'd like to avoid, as it would mean touching all > those use sites again where the proposed isolate_lsb() could be used > instead. I'd rather see all use sites be put into their final shape > right away. This request is coming a bit late and also after all the patches have been reviewed already. I for one am not looking forward to review them again. That said, if you could be more specified maybe it could become actionable: - do you have a pseudo code implementatio
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On 17.11.2023 01:43, Stefano Stabellini wrote: > On Thu, 16 Nov 2023, Jan Beulich wrote: >> On 16.11.2023 11:02, Nicola Vetrini wrote: >>> On 2023-11-16 09:26, Jan Beulich wrote: On 31.10.2023 11:20, Jan Beulich wrote: > On 31.10.2023 11:03, Nicola Vetrini wrote: >> On 2023-10-31 09:28, Nicola Vetrini wrote: >>> On 2023-10-31 08:43, Jan Beulich wrote: On 30.10.2023 23:44, Stefano Stabellini wrote: > On Mon, 30 Oct 2023, Jan Beulich wrote: >> On 27.10.2023 15:34, Nicola Vetrini wrote: >>> --- a/xen/include/xen/macros.h >>> +++ b/xen/include/xen/macros.h >>> @@ -8,8 +8,14 @@ >>> #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) >>> #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) >>> >>> -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) >>> -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) >>> +/* >>> + * Given an unsigned integer argument, expands to a mask where >>> just the least >>> + * significant nonzero bit of the argument is set, or 0 if no >>> bits >>> are set. >>> + */ >>> +#define ISOLATE_LOW_BIT(x) ((x) & -(x)) >> >> Not even considering future Misra changes (which aiui may require >> that >> anyway), this generalization of the macro imo demands that its >> argument >> now be evaluated only once. > > Fur sure that would be an improvement, but I don't see a trivial > way > to > do it and this issue is also present today before the patch. This was an issue here for MASK_EXTR() and MASK_INSR(), yes, but the new macro has wider use, and there was no issue elsewhere so far. > I think it > would be better to avoid scope-creeping this patch as we are > already > at > v4 for something that was expected to be a trivial mechanical > change. > I > would rather review the fix as a separate patch, maybe sent by you > as > you probably have a specific implementation in mind? #define ISOLATE_LOW_BIT(x) ({ \ typeof(x) x_ = (x); \ x_ & -x_; \ }) Hard to see the scope creep here. What I would consider scope creep I specifically didn't even ask for: I'd like this macro to be overridable by an arch. Specifically (see my earlier naming hint) I'd like to use x86's BMI insn BLSI in the context of "x86: allow Kconfig control over psABI level", when ABI v2 or higher is in use. >>> >>> I appreciate you suggesting an implementation; I'll send a v5 >>> incorporating it. >> >> There's an issue with this approach, though: since the macro is used >> indirectly >> in expressions that are e.g. case labels or array sizes, the build >> fails >> (see [1] for instance). >> Perhaps it's best to leave it as is? > > Hmm. I'm afraid it's not an option to "leave as is", not the least > because > - as said - I'm under the impression that another Misra rule requires > macro arguments to be evaluated exactly once. Best I can think of > right > away is to have a macro for limited use (to address such build issues) > plus an inline function (for general use). But yes, maybe that then > indeed > needs to be a 2nd step. While I've committed this patch (hoping that I got the necessary context adjustment right for the automation/eclair_analysis/ECLAIR/deviations.ecl change), I'd like to come back to this before going further with users of the new macro: I still think we ought to try to get to the single evaluation wherever possible. The macro would then be used only in cases where the alternative construct (perhaps an isolate_lsb() macro, living perhaps in xen/bitops.h) cannot be used. ISOLATE_LSB() would then want to gain a comment directing people to the "better" sibling. Thoughts? >>> >>> Having the users in place would help me estimate the remaining work that >>> needs to be done on this rule and see if my local counts match up with >>> the counts in staging. >> >> By "having the users in place", you mean you want other patches in this >> and the dependent series to be committed as-is (except for the name >> change)? That's what I'd like to avoid, as it would mean touching all >> those use sites again where the proposed isolate_lsb() could be used >> instead. I'd rather see all use sites be put into their final shape >> right away. > > This request is coming a bit late and also after all the patches have > been reviewed already. I for one am not looking forward to review them > again. > > That said, if you could be more specified maybe it
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
Hi Jan, While I've committed this patch (hoping that I got the necessary context adjustment right for the automation/eclair_analysis/ECLAIR/deviations.ecl change), I'd like to come back to this before going further with users of the new macro: I still think we ought to try to get to the single evaluation wherever possible. The macro would then be used only in cases where the alternative construct (perhaps an isolate_lsb() macro, living perhaps in xen/bitops.h) cannot be used. ISOLATE_LSB() would then want to gain a comment directing people to the "better" sibling. Thoughts? Having the users in place would help me estimate the remaining work that needs to be done on this rule and see if my local counts match up with the counts in staging. By "having the users in place", you mean you want other patches in this and the dependent series to be committed as-is (except for the name change)? That's what I'd like to avoid, as it would mean touching all those use sites again where the proposed isolate_lsb() could be used instead. I'd rather see all use sites be put into their final shape right away. This request is coming a bit late and also after all the patches have been reviewed already. I for one am not looking forward to review them again. That said, if you could be more specified maybe it could become actionable: - do you have a pseudo code implementation of the "better" macro you would like to propose? May I remind you that I made this request (including a draft implementation) before already, and Nicola then merely found that the evaluate-once form simply cannot be used everywhere? Anybody could have thought of the option of "splitting" the macro. After all I hope that there is no disagreement on macro arguments better being evaluated just once, whenever possible. - do you have an list of call sites you would like to be changed to use the "better" macro? No, I don't have a list. But the pattern is pretty clear: The "better" form ought to be used wherever it actually can be used. Also, you might remember past discussions about time spent making changes yourself vs. others doing the same. This is one of those cases that it would be faster for you to make the change and send a patch than explaining someone else how to do it, then review the result (and review it again as it probably won't be exactly as you asked the first time.) If you don't want the call sites to be changes twice, may I suggest you provide a patch on top of Nicola's series, I review and ack your patch, and Nicola or I rebase & resend the series so that the call sites are only changes once as you would like? I think that's going to be way faster. I'll see if I can find time to do so. I don't normally work on top of other people's uncommitted patches, though ... So I may also choose to go a slightly different route. (You realize though that all still pending patches using the new macro need touching again anyway, don't you?) Jan Then perhaps it's best if I give it a try at doing the single evaluation macro, so that I can make a series modifying the call sites only once on top of that and send everything in one go. Before doing that, though, I'll make a thread where various aspects that are not so clear yet can be discussed, so that we can devise a robust solution (also to dig this out of this deep thread). -- Nicola Vetrini, BSc Software Engineer, BUGSENG srl (https://bugseng.com)
Re: [XEN PATCH][for-4.19 v4 1/8] xen/include: add macro ISOLATE_LOW_BIT
On Fri, 17 Nov 2023, Nicola Vetrini wrote: > Hi Jan, > > > > > > > While I've committed this patch (hoping that I got the necessary > > > > > > context > > > > > > adjustment right for the > > > > > > automation/eclair_analysis/ECLAIR/deviations.ecl > > > > > > change), I'd like to come back to this before going further with > > > > > > users > > > > > > of > > > > > > the new macro: I still think we ought to try to get to the single > > > > > > evaluation wherever possible. The macro would then be used only in > > > > > > cases > > > > > > where the alternative construct (perhaps an isolate_lsb() macro, > > > > > > living > > > > > > perhaps in xen/bitops.h) cannot be used. ISOLATE_LSB() would then > > > > > > want > > > > > > to > > > > > > gain a comment directing people to the "better" sibling. Thoughts? > > > > > > > > > > Having the users in place would help me estimate the remaining work > > > > > that > > > > > needs to be done on this rule and see if my local counts match up with > > > > > the counts in staging. > > > > > > > > By "having the users in place", you mean you want other patches in this > > > > and the dependent series to be committed as-is (except for the name > > > > change)? That's what I'd like to avoid, as it would mean touching all > > > > those use sites again where the proposed isolate_lsb() could be used > > > > instead. I'd rather see all use sites be put into their final shape > > > > right away. > > > > > > This request is coming a bit late and also after all the patches have > > > been reviewed already. I for one am not looking forward to review them > > > again. > > > > > > That said, if you could be more specified maybe it could become > > > actionable: > > > > > > - do you have a pseudo code implementation of the "better" macro you > > > would like to propose? > > > > May I remind you that I made this request (including a draft implementation) > > before already, and Nicola then merely found that the evaluate-once form > > simply cannot be used everywhere? Anybody could have thought of the option > > of "splitting" the macro. After all I hope that there is no disagreement on > > macro arguments better being evaluated just once, whenever possible. > > > > > - do you have an list of call sites you would like to be changed to use > > > the "better" macro? > > > > No, I don't have a list. But the pattern is pretty clear: The "better" form > > ought to be used wherever it actually can be used. > > > > > Also, you might remember past discussions about time spent making > > > changes yourself vs. others doing the same. This is one of those cases > > > that it would be faster for you to make the change and send a patch than > > > explaining someone else how to do it, then review the result (and > > > review it again as it probably won't be exactly as you asked the first > > > time.) > > > > > > If you don't want the call sites to be changes twice, may I suggest you > > > provide a patch on top of Nicola's series, I review and ack your patch, > > > and Nicola or I rebase & resend the series so that the call sites are > > > only changes once as you would like? I think that's going to be way > > > faster. > > > > I'll see if I can find time to do so. I don't normally work on top of > > other people's uncommitted patches, though ... So I may also choose to go > > a slightly different route. (You realize though that all still pending > > patches using the new macro need touching again anyway, don't you?) > > > > Jan > > Then perhaps it's best if I give it a try at doing the single evaluation > macro, so that I can make a series modifying the call sites only once on top > of that and send everything in one go. Before doing that, though, I'll make a > thread where various aspects that are not so clear yet can be discussed, so > that we can devise a robust solution (also to dig this out of this deep > thread). In the meantime I committed patches from #5 onward as they don't depend on ISOLATE_LSB