[igt-dev] [PATCH i-g-t v8 4/6] lib/drmtest: save skip offset for first opened device
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Thu Oct 5 16:29:45 UTC 2023
On Wed, Oct 04, 2023 at 06:49:40PM +0200, Kamil Konieczny wrote:
> On some boards with many discrete GPU cards it may happen that
> on-board one is integrated and will be skipped during opening
> a first device. With out-of-order try and open it may result
> with off-by-one error opening wrong card. Fixed this with saving
> skip offset for first device name.
>
> Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> ---
> lib/drmtest.c | 17 +++++++++++++++--
> 1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index dbfa0282d..5e559737e 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -292,6 +292,8 @@ static struct {
> }_opened_fds[64];
>
> static int _opened_fds_count;
> +static int _opened_fds0_skip;
> +static int _opened_fds0_chipset;
>
> static void _set_opened_fd(int idx, int fd)
> {
> @@ -350,7 +352,11 @@ static int __search_and_open(const char *base, int offset, unsigned int chipset,
> if (forced)
> igt_debug("Force option used: Using driver %s\n", forced);
>
> - offset += as_idx;
> + if (offset == 0 && as_idx != 0 && _opened_fds0_chipset == chipset)
> + offset += as_idx + _opened_fds0_skip;
> + else
> + offset += as_idx;
> +
> for (int i = 0; i < 16; i++) {
> char name[80];
> int fd;
> @@ -361,8 +367,15 @@ static int __search_and_open(const char *base, int offset, unsigned int chipset,
> continue;
>
> fd = open_device(name, chipset);
> - if (fd != -1)
> + if (fd != -1) {
> + if (i != 0 && offset == as_idx && as_idx == 0
> + && chipset != DRIVER_VGEM && chipset != DRIVER_ANY) {
> + _opened_fds0_skip = i;
> + _opened_fds0_chipset = chipset;
> + }
> +
I wondered can we simplify above. What you really need is to open
as_idx card of requested chipset. The most time consuming part is
underneath open_device() function. At the moment you're already
tracking is as_idx slot occupied. You can introduce additional
variable counter before the loop and increment it each time you
hit as_idx is occupied - if (_is_already_counted()) or when
fd = open_driver() will succeed. But you need to compare as_idx
with current counter. If not equal close fd and continue. This
would allow you to handle out-of-order calls with not monotonic
as_idx.
--
Zbigniew
> return fd;
> + }
> }
>
> return -1;
> --
> 2.42.0
>
More information about the igt-dev
mailing list