qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC v5 027/126] misc: introduce ERRP_AUTO_PROPAGATE


From: Vladimir Sementsov-Ogievskiy
Subject: Re: [RFC v5 027/126] misc: introduce ERRP_AUTO_PROPAGATE
Date: Mon, 14 Oct 2019 08:51:31 +0000

11.10.2019 21:44, Eric Blake wrote:
> On 10/11/19 11:04 AM, Vladimir Sementsov-Ogievskiy wrote:
>> If we want to add some info to errp (by error_prepend() or
>> error_append_hint()), we must use the ERRP_AUTO_PROPAGATE macro.
>> Otherwise, this info will not be added when errp == &fatal_err
>> (the program will exit prior to the error_append_hint() or
>> error_prepend() call).  Fix such cases.
>>
>> If we want to check error after errp-function call, we need to
>> introduce local_err and than propagate it to errp. Instead, use
>> ERRP_AUTO_PROPAGATE macro, benefits are:
>> 1. No need of explicit error_propagate call
>> 2. No need of explicit local_err variable: use errp directly
>> 3. ERRP_AUTO_PROPAGATE leaves errp as is if it's not NULL or
>>     &error_fatel, this means that we don't break error_abort
>>     (we'll abort on error_set, not on error_propagate)
>>
>> This commit (together with its neighbors) was generated by
>>
>> for f in $(git grep -l errp \*.[ch]); do \
>>      spatch --sp-file scripts/coccinelle/auto-propagated-errp.cocci \
>>      --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff $f; \
>> done;
>>
>> then fix a bit of compilation problems: coccinelle for some reason
>> leaves several
>> f() {
>>      ...
>>      goto out;
>>      ...
>>      out:
>> }
>> patterns, with "out:" at function end.
> 
> Was that still happening even after your tweaks to the .cocci script?

Yes, seem coccinella succesfully removes

out:
error_prapagate

pattern in general, but fails to work if there is additional "return;" :

return;
out:
error_proapagate

> But manual touch-up after cocci is not unheard of, so it is not a showstopper 
> to the series.  Still, it might be nicer if this disclaimer only appears on 
> the patches within the series where it actually matters, rather than on every 
> message in the series even when no tweaks were needed (as this patch is an 
> example where the touchup was not needed).

Hmm.. Not sure. I think it's good to have in each commit an instruction how to 
generate the whole sequence. Still, what you want is not difficult: just 
instead of fixing all compilation errors at once, commit the changes and than 
play with git rebase -x 'make -j9'.

> 
>>
>> then
>> ./python/commit-per-subsystem.py MAINTAINERS "$(< auto-msg)"
>>
> 
> If we don't check the python script into git, then changing this to a URL to 
> one of the threads where you posted the script in an earlier version of the 
> patch is also acceptable.
> 
>> (auto-msg was a file with this commit message)
>>
>> Still, for backporting it may be more comfortable to use only the first
>> command and then do one huge commit.
>>
>> Reported-by: Kevin Wolf <address@hidden>
>> Reported-by: Greg Kurz <address@hidden>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
>> ---
>>   hw/misc/ivshmem.c | 37 ++++++++++++++++---------------------
>>   hw/misc/tmp105.c  |  7 +++----
>>   hw/misc/tmp421.c  |  7 +++----
>>   3 files changed, 22 insertions(+), 29 deletions(-)
>>
> 
>> @@ -864,6 +858,7 @@ static void ivshmem_write_config(PCIDevice *pdev, 
>> uint32_t address,
>>   static void ivshmem_common_realize(PCIDevice *dev, Error **errp)
>>   {
>> +    ERRP_AUTO_PROPAGATE();
>>       IVShmemState *s = IVSHMEM_COMMON(dev);
>>       Error *err = NULL;
> 
> Umm, so why did Coccinelle not remove this line, or retouch lower down at:
> 
>      if (!ivshmem_is_master(s)) {
>          error_setg(&s->migration_blocker,
>                     "Migration is disabled when using feature 'peer mode' in 
> devi
> ce 'ivshmem'");
>          migrate_add_blocker(s->migration_blocker, &local_err);
>          if (local_err) {
>              error_propagate(errp, local_err);
>              error_free(s->migration_blocker);
>              return;
>          }
>      }
> 
> 
> But the conversions that Coccinelle made look correct.
> 

Hmmm. strange. So it does nothing, except add a macro invocation?

Intersting: if I comment definition for local_err, it correctly updates code 
around err,
if I comment definition for err, it correctly updates code around local_err.

So, rule0 works, but rule1 don't know what to do with two Error * variables.

Seems, simplest thing is to pre-refactor it, to drop local_err variable.

-- 
Best regards,
Vladimir

reply via email to

[Prev in Thread] Current Thread [Next in Thread]