Cédric Le Goater <c...@redhat.com> writes: > On 1/30/25 18:55, Alex Williamson wrote: >> On Thu, 30 Jan 2025 14:43:38 +0100 >> Cédric Le Goater <c...@redhat.com> wrote: >> >>> Depending on the configuration, a passthrough device may produce >>> recurring DMA mapping errors at runtime and produce a lot of >>> output. It is useful to report only once. >>> >>> Cc: Markus Armbruster <arm...@redhat.com> >>> Signed-off-by: Cédric Le Goater <c...@redhat.com> >>> --- >>> include/qapi/error.h | 5 +++++ >>> util/error.c | 9 +++++++++ >>> 2 files changed, 14 insertions(+) >>> >>> diff --git a/include/qapi/error.h b/include/qapi/error.h >>> index >>> 71f8fb2c50eee9a544992d0c05263c9793956fe1..b6ea274882b9788b64d4bb213c3458d7c674a881 >>> 100644 >>> --- a/include/qapi/error.h >>> +++ b/include/qapi/error.h >>> @@ -448,6 +448,11 @@ void error_free_or_abort(Error **errp); >>> */ >>> void warn_report_err(Error *err); >>> +/* >>> + * Convenience function to call warn_report_err() once. >>> + */ >>> +void warn_report_once_err(Error *err); >>> + >> Turning it into a macro would do what you want: >> #define warn_report_once_err(err) ({ \ >> static bool print_once_; \ >> if (!print_once_) { \ >> warn_report_err(err); \ >> print_once_ = true; \ >> } \ >> }) >> So long as we only want once per call site and not once per object, >> which would pull in something like warn_report_once_cond(). Thanks, > > yeah. I came up with this : > > /* > * TODO: move to util/ > */ > static bool warn_report_once_err_cond(bool *printed, Error *err) > { > if (*printed) { > error_free(err); > return false; > } > *printed = true; > warn_report_err(err); > return true; > } > > #define warn_report_once_err(err) \ > ({ \ > static bool print_once_; \ > warn_report_once_err_cond(&print_once_, err); \ > }) > > > I don't know where to put it though. It sits in between qapi/error.h > and qemu/error-report.h.
Stuff involving the Error type should not go into qemu/error-report.h. Precedence: warn_report_err() & friends are in qapi/error.h even though they're straightforward wrappers around warn_report() & friends for easy use with Error.