[igt-dev] [PATCH i-g-t] lib: Use a bsearch to find the module name

Jani Nikula jani.nikula at linux.intel.com
Mon Sep 3 10:34:53 UTC 2018


On Mon, 03 Sep 2018, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Quoting Petri Latvala (2018-09-03 10:39:31)
>> On Sat, Sep 01, 2018 at 07:09:11PM +0100, Chris Wilson wrote:
>> > Even with a small number of known drivers (6), a bsearch will take at
>> > most 3 steps, whereas the linear search will take 3 steps on average. In
>> > the future with more known drivers, the logN bsearch will be even more
>> > advantageous.
>> > 
>> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>> > Cc: Katarzyna Dec <katarzyna.dec at intel.com>
>> > ---
>> >  lib/drmtest.c | 12 +++++++++---
>> >  1 file changed, 9 insertions(+), 3 deletions(-)
>> > 
>> > diff --git a/lib/drmtest.c b/lib/drmtest.c
>> > index 93228f900..bfb38f1e9 100644
>> > --- a/lib/drmtest.c
>> > +++ b/lib/drmtest.c
>> > @@ -222,9 +222,15 @@ static int open_device(const char *name, unsigned int chipset)
>> >       if (__get_drm_device_name(fd, dev_name, sizeof(dev_name) - 1) == -1)
>> >               goto err;
>> >  
>> > -     for (const struct module *m = modules; m->module; m++) {
>> > -             if (strcmp(m->module, dev_name) == 0) {
>> > -                     chip = m->bit;
>> > +     for (int start = 0, end = ARRAY_SIZE(modules) - 1; start < end; ){
>> > +             int mid = start + (end - start) / 2;
>> > +             int ret = strcmp(modules[mid].module, dev_name);
>> > +             if (ret < 0) {
>> > +                     end = mid;
>> > +             } else if (ret > 0) {
>> > +                     start = mid + 1;
>> 
>> 
>> Isn't this the wrong way around?
>
> * blinks.
>
> Yes. Shame on me for assuming that a run through igt was good enough to
> flush out the kinks. It just happens that vgem occupies the initial mid,
> so anything that wanted vgem-only got it; everything else hit the
> DRIVER_ANY.
>
> amdgpu -> skip. Ah. Hmm, that should have been flagged :|

Just sayin'


diff --git a/lib/drmtest.c b/lib/drmtest.c
index adff1a81fffb..3a050211146e 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -209,11 +209,19 @@ static const struct module {
 	{}
 };
 
+static int module_compare(const void *_m1, const void *_m2)
+{
+	const struct module *m1 = _m1, *m2 = _m2;
+
+	return strcmp(m1->module, m2->module);
+}
+
 static int open_device(const char *name, unsigned int chipset)
 {
 	char dev_name[16] = "";
 	int chip = DRIVER_ANY;
 	int fd;
+	struct module key, *res;
 
 	fd = open(name, O_RDWR);
 	if (fd == -1)
@@ -222,18 +230,11 @@ static int open_device(const char *name, unsigned int chipset)
 	if (__get_drm_device_name(fd, dev_name, sizeof(dev_name) - 1) == -1)
 		goto err;
 
-	for (int start = 0, end = ARRAY_SIZE(modules) - 1; start < end; ){
-		int mid = start + (end - start) / 2;
-		int ret = strcmp(modules[mid].module, dev_name);
-		if (ret < 0) {
-			start = mid + 1;
-		} else if (ret > 0) {
-			end = mid;
-		} else {
-			chip = modules[mid].bit;
-			break;
-		}
-	}
+	key.module = dev_name;
+	res = bsearch(&key, modules, ARRAY_SIZE(modules) - 1,
+		      sizeof(modules[0]), module_compare);
+	if (res)
+		chip = res->bit;
 	if (chipset & chip)
 		return fd;
 

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the igt-dev mailing list