[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
- [RFC v5 016/126] hw/sd: rename Error ** parameter to more common errp, (continued)
- [RFC v5 016/126] hw/sd: rename Error ** parameter to more common errp, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 013/126] qga: rename Error ** parameter to more common errp, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 017/126] hw/tpm: rename Error ** parameter to more common errp, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 020/126] include/qom/object.h: rename Error ** parameter to more common errp, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 021/126] qapi/error: add (Error **errp) cleaning APIs, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 027/126] misc: introduce ERRP_AUTO_PROPAGATE, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 012/126] hw/i386/amd_iommu: rename Error ** parameter to more common errp, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 022/126] backends/cryptodev: drop local_err from cryptodev_backend_complete(), Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 036/126] SPARC Machines: introduce ERRP_AUTO_PROPAGATE, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 034/126] MIPS Machines: introduce ERRP_AUTO_PROPAGATE, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 018/126] hw/usb: rename Error ** parameter to more common errp, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 041/126] IPack: introduce ERRP_AUTO_PROPAGATE, Vladimir Sementsov-Ogievskiy, 2019/10/11
- [RFC v5 032/126] Hosts: introduce ERRP_AUTO_PROPAGATE, Vladimir Sementsov-Ogievskiy, 2019/10/11