[Intel-gfx] [PATCH 06/13] drm/i915: Use binary search when looking up forcewake domains
Chris Wilson
chris at chris-wilson.co.uk
Thu Sep 29 16:16:05 UTC 2016
On Thu, Sep 29, 2016 at 04:35:49PM +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>
> Instead of the existing linear seach, now that we have sorted
> range tables, we can do a binary search on them for some
> potential miniscule performance gain, but more importantly
> for elegance and code size. Hopefully the perfomance gain is
> sufficient to offset the function calls which were not there
> before.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/intel_uncore.c | 28 ++++++++++++++++++++--------
> 1 file changed, 20 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index bee1482a5ece..ae5edaea16f7 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -26,6 +26,7 @@
> #include "i915_vgpu.h"
>
> #include <linux/pm_runtime.h>
> +#include <linux/bsearch.h>
>
> #define FORCEWAKE_ACK_TIMEOUT_MS 50
>
> @@ -589,20 +590,31 @@ struct intel_forcewake_range
> enum forcewake_domains domains;
> };
>
> +static int fw_range_cmp(const void *key, const void *elt)
> +{
> + struct intel_forcewake_range *entry =
> + (struct intel_forcewake_range *)elt;
> + u32 offset = (u32)((unsigned long)key);
> +
> + if (offset < entry->start)
> + return -1;
> + else if (offset > entry->end)
> + return 1;
> + else
> + return 0;
> +}
> +
> static enum forcewake_domains
> find_fw_domain(u32 offset, const struct intel_forcewake_range *ranges,
> unsigned int num_ranges)
> {
> - unsigned int i;
> - struct intel_forcewake_range *entry =
> - (struct intel_forcewake_range *)ranges;
> + struct intel_forcewake_range *entry;
>
> - for (i = 0; i < num_ranges; i++, entry++) {
> - if (offset >= entry->start && offset <= entry->end)
> - return entry->domains;
> - }
> + entry = bsearch((void *)(unsigned long)offset, (const void *)ranges,
> + num_ranges, sizeof(struct intel_forcewake_range),
> + fw_range_cmp);
How much for bsearch() to be turned into a generator macro?
> - return -1;
> + return entry ? entry->domains : -1;
> }
Looks ok, maybe pass in the default value to return if !entry, saves the
double check.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list