On Tue, Jul 03, 2018 at 05:11:57PM +0800, 王翔 wrote:
> >On Tue, Jul 03, 2018 at 04:23:07PM +0800, 王翔 wrote:
[...]
> Error print like this: 
> 
> ```
> 
> WARNING: Macros with flow control statements should be avoided
> #43: FILE: src/arch/riscv/include/smp.h:43:
> +#define SMP_PAUSE(active) do \
> +{ \
> +    __label__ l_entry, l_exit; \
> +    static int _flag_; \
> +    if (active == read_csr(mhartid)) \
> +        goto l_entry; \
> +    do {barrier(); } while (!_flag_); \
> +    goto l_exit; \
> +l_entry:

checkpatch doesn't like goto (or return) in macros, because it can be
unexpected for the author of the calling code, that a macro causes a
jump or return.

> WARNING: please, no spaces at the start of a line
> #45: FILE: src/arch/riscv/include/smp.h:45:
> +    __label__ l_entry, l_exit; \$

You should indent with tabs instead of spaces.

> ERROR: Macros with multiple statements should be enclosed in a do - while loop
> #54: FILE: src/arch/riscv/include/smp.h:54:
> +#define SMP_RESUME() \
> +    _flag_ = 1; \
> +l_exit: \
> +    barrier(); \
> +} while (0)

Oh! SMP_PAUSE actually jumps here! I would *not* expect that, when I
read code like this:

        SMP_PAUSE(active);
        foo();
        bar(42);
        SMP_RESUME();

Something like the following would be a lot clearer for me:

        if (mhartid() == active) {
                foo();
                bar(42);
        }

Or maybe:

        if (running_on_hart(active)) { ... }

But note that this lacks the barriers/locking that your code has.



Jonathan Neuschäfer

Attachment: signature.asc
Description: PGP signature

-- 
coreboot mailing list: coreboot@coreboot.org
https://mail.coreboot.org/mailman/listinfo/coreboot

Reply via email to