From: "Bernatowicz, Marcin" <marcin.bernatowicz@linux.intel.com>
To: igt-dev@lists.freedesktop.org
Cc: Adam Miszczak <adam.miszczak@linux.intel.com>,
Lukasz Laguna <lukasz.laguna@intel.com>,
Jakub Kolakowski <jakub1.kolakowski@intel.com>,
Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>,
Chris Wilson <chris.p.wilson@intel.com>
Subject: Re: [PATCH i-g-t] lib/igt_core: Refactor libpciaccess init/cleanup wrappers
Date: Thu, 29 Aug 2024 13:58:37 +0200 [thread overview]
Message-ID: <bc863495-ca9e-416c-9497-545cc1cdd401@linux.intel.com> (raw)
In-Reply-To: <20240829075811.87076-1-marcin.bernatowicz@linux.intel.com>
On 8/29/2024 9:58 AM, Marcin Bernatowicz wrote:
> Enable reinitialization of the libpciaccess global state, necessary
> to correctly handle dynamic add/remove of PCI devices, such as the
> creation/removal of Virtual Functions (VFs). Update
> igt_pci_system_cleanup() to conditionally call pci_system_cleanup()
> based on the initialization state. Introduce igt_pci_system_reinit()
> for explicit reinitialization of the libpciaccess global state,
> particularly useful after PCI device changes, to be used in
> subsequent patches.
>
> Signed-off-by: Marcin Bernatowicz <marcin.bernatowicz@linux.intel.com>
> Cc: Adam Miszczak <adam.miszczak@linux.intel.com>
> Cc: Lukasz Laguna <lukasz.laguna@intel.com>
> Cc: Jakub Kolakowski <jakub1.kolakowski@intel.com>
> Cc: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
> Cc: Chris Wilson <chris.p.wilson@intel.com>
> ---
> lib/igt_core.c | 42 ++++++++++++++++++++++++++++++++++++------
> lib/igt_core.h | 36 ++++++++++++++++++++++++------------
> 2 files changed, 60 insertions(+), 18 deletions(-)
>
> diff --git a/lib/igt_core.c b/lib/igt_core.c
> index 3ff3e0392..4710899bf 100644
> --- a/lib/igt_core.c
> +++ b/lib/igt_core.c
> @@ -3414,21 +3414,51 @@ void igt_srandom(void)
> }
>
> /* IGT wrappers around libpciaccess init/cleanup functions */
> +static int pci_system_initialized;
> +static pthread_mutex_t pci_system_mutex = PTHREAD_MUTEX_INITIALIZER;
> +
> +void igt_pci_system_cleanup(void)
> +{
> + pthread_mutex_lock(&pci_system_mutex);
> + if (pci_system_initialized) {
> + pci_system_cleanup();
> + pci_system_initialized = 0;
> + }
> + pthread_mutex_unlock(&pci_system_mutex);
> +}
>
> static void pci_system_exit_handler(int sig)
> {
> - pci_system_cleanup();
> + igt_pci_system_cleanup();
> }
>
> -static void __pci_system_init(void)
> +int igt_pci_system_init(void)
> {
> - if (!igt_warn_on_f(pci_system_init(), "Could not initialize libpciaccess global data\n"))
> + int ret = 0;
> + bool install_handler = false;
> +
> + pthread_mutex_lock(&pci_system_mutex);
> + if (!pci_system_initialized) {
> + ret = igt_warn_on_f(pci_system_init(),
> + "Could not initialize libpciaccess global data\n");
> + if (ret) {
> + pci_system_initialized = 0;
> + } else {
> + pci_system_initialized = 1;
> + install_handler = true;
> + }
To be simplified with:
if (!pci_system_initialized) {
ret = igt_warn_on_f(pci_system_init(), "Could not initialize...\n");
if (!ret) {
pci_system_initialized = 1;
install_handler = true;
}
}
> + }
> + pthread_mutex_unlock(&pci_system_mutex);
> +
> + if (install_handler)
> igt_install_exit_handler(pci_system_exit_handler);
> +
> + return ret;
> }
>
> -int igt_pci_system_init(void)
> +int igt_pci_system_reinit(void)
> {
> - static pthread_once_t once_control = PTHREAD_ONCE_INIT;
> + igt_pci_system_cleanup();
>
> - return pthread_once(&once_control, __pci_system_init);
> + return igt_pci_system_init();
> }
> diff --git a/lib/igt_core.h b/lib/igt_core.h
> index 06c5314bf..0d7e948a8 100644
> --- a/lib/igt_core.h
> +++ b/lib/igt_core.h
> @@ -1518,28 +1518,40 @@ void igt_kmsg(const char *format, ...);
> * igt_pci_system_init:
> * IGT wrapper around pci_system_init()
> *
> - * Runs pci_system_init() and installs pci_system_cleanup() as IGT exit handler when
> - * called first per thread, subsequent calls are noop. Tests should use this wrapper
> + * Runs pci_system_init() and installs igt_pci_system_cleanup() as IGT exit handler when
> + * called first per thread, subsequent calls are noop. Tests should use this wrapper
> * instead of pci_system_init() to avoid memory leaking which happens each time a call
> * to pci_system_init() is repeated not preceded by pci_system_cleanup() (may easily
> * happen in consequence of long jumps performed by IGT flow control functions).
> *
> - * Return value: equal return value of pthread_once() (return value of pci_system_init()
> - * can't be passed through pthread_once())
> + * Return:
> + * Return value of pci_system_init() or 0 if pci system is already initialized.
> */
> int igt_pci_system_init(void);
>
> +/**
> + * igt_pci_system_reinit:
> + * Reinitialize libpciaccess global data.
> + *
> + * Executes igt_pci_system_cleanup() and igt_pci_system_init() to refresh
> + * the PCI system state, typically needed after PCI devices are added or
> + * removed.
> + *
> + * Note: All previously obtained handles (pci_dev, mmio) become invalid
> + * after this call. Do not use old handles post-reinitialization.
> + *
> + * Return: Outcome of igt_pci_system_init().
> + */
> +int igt_pci_system_reinit(void);
> +
> /**
> * igt_pci_system_cleanup():
> - * IGT replacement for pci_system_cleanup()
> + * IGT wrapper around pci_system_cleanup()
> *
> - * For use in IGT library and tests to avoid destroying libpciaccess global data.
> - * Direct calls to pci_system_cleanup() should be either dropped or replaced with this
> - * wrapper (for code clarity), otherwise subsequent access to libpciaccess global data
> - * may be lost unless preceded by direct call to pci_system_init() (not recommended).
> + * Runs pci_system_cleanup() if igt_pci_system_init() was successfully called
> + * before. This allows to refresh the libpciaccess global data when followed
> + * by igt_pci_system_init(), see igt_pci_system_reinit().
> */
> -static inline void igt_pci_system_cleanup(void)
> -{
> -}
> +void igt_pci_system_cleanup(void);
>
> #endif /* IGT_CORE_H */
next prev parent reply other threads:[~2024-08-29 11:58 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-29 7:58 [PATCH i-g-t] lib/igt_core: Refactor libpciaccess init/cleanup wrappers Marcin Bernatowicz
2024-08-29 9:30 ` ✓ CI.xeBAT: success for " Patchwork
2024-08-29 9:32 ` ✓ Fi.CI.BAT: " Patchwork
2024-08-29 11:58 ` Bernatowicz, Marcin [this message]
2024-08-29 21:18 ` ✗ CI.xeFULL: failure " Patchwork
2024-08-30 7:44 ` ✗ Fi.CI.IGT: " Patchwork
2024-09-11 10:27 ` [PATCH i-g-t] " Peter Senna Tschudin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=bc863495-ca9e-416c-9497-545cc1cdd401@linux.intel.com \
--to=marcin.bernatowicz@linux.intel.com \
--cc=adam.miszczak@linux.intel.com \
--cc=chris.p.wilson@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=jakub1.kolakowski@intel.com \
--cc=janusz.krzysztofik@linux.intel.com \
--cc=lukasz.laguna@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.