All of lore.kernel.org
 help / color / mirror / Atom feed
From: Saravana Kannan <skannan@codeaurora.org>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Linux PM list <linux-pm@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Viresh Kumar <viresh.kumar@linaro.org>,
	Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>,
	Juri Lelli <juri.lelli@arm.com>,
	Steve Muckle <steve.muckle@linaro.org>
Subject: Re: [PATCH 1/11] cpufreq: Clean up default and fallback governor setup
Date: Wed, 03 Feb 2016 16:55:35 -0800	[thread overview]
Message-ID: <56B2A187.3080500@codeaurora.org> (raw)
In-Reply-To: <8241294.RLKfcoktTC@vostro.rjw.lan>

On 02/03/2016 03:14 PM, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>
> The preprocessor magic used for setting the default cpufreq governor
> (and for using the performance governor as a fallback one for that
> matter) is really nasty, so replace it with __weak functions and
> overrides.
>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---
>   drivers/cpufreq/cpufreq.c              |   37 ++++++++++++++++++---------------
>   drivers/cpufreq/cpufreq_conservative.c |   10 +++++---
>   drivers/cpufreq/cpufreq_ondemand.c     |   34 ++++++++++++++++--------------
>   drivers/cpufreq/cpufreq_performance.c  |   18 ++++++++++++----
>   drivers/cpufreq/cpufreq_powersave.c    |   10 +++++---
>   drivers/cpufreq/cpufreq_userspace.c    |   10 +++++---
>   include/linux/cpufreq.h                |   25 +---------------------
>   7 files changed, 73 insertions(+), 71 deletions(-)
>
> Index: linux-pm/drivers/cpufreq/cpufreq.c
> ===================================================================
> --- linux-pm.orig/drivers/cpufreq/cpufreq.c
> +++ linux-pm/drivers/cpufreq/cpufreq.c
> @@ -1003,6 +1003,11 @@ static int cpufreq_add_dev_interface(str
>   	return cpufreq_add_dev_symlink(policy);
>   }
>
> +__weak struct cpufreq_governor *cpufreq_default_governor(void)
> +{
> +	return NULL;
> +}
> +
>   static int cpufreq_init_policy(struct cpufreq_policy *policy)
>   {
>   	struct cpufreq_governor *gov = NULL;
> @@ -1012,11 +1017,14 @@ static int cpufreq_init_policy(struct cp
>
>   	/* Update governor of new_policy to the governor used before hotplug */
>   	gov = find_governor(policy->last_governor);
> -	if (gov)
> +	if (gov) {
>   		pr_debug("Restoring governor %s for cpu %d\n",
>   				policy->governor->name, policy->cpu);
> -	else
> -		gov = CPUFREQ_DEFAULT_GOVERNOR;
> +	} else {
> +		gov = cpufreq_default_governor();
> +		if (!gov)
> +			return -ENODATA;
> +	}
>
>   	new_policy.governor = gov;
>
> @@ -1964,21 +1972,16 @@ int cpufreq_driver_target(struct cpufreq
>   }
>   EXPORT_SYMBOL_GPL(cpufreq_driver_target);
>
> +__weak struct cpufreq_governor *cpufreq_fallback_governor(void)
> +{
> +	return NULL;
> +}
> +
>   static int __cpufreq_governor(struct cpufreq_policy *policy,
>   					unsigned int event)
>   {
>   	int ret;
>
> -	/* Only must be defined when default governor is known to have latency
> -	   restrictions, like e.g. conservative or ondemand.
> -	   That this is the case is already ensured in Kconfig
> -	*/
> -#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
> -	struct cpufreq_governor *gov = &cpufreq_gov_performance;
> -#else
> -	struct cpufreq_governor *gov = NULL;
> -#endif
> -
>   	/* Don't start any governor operations if we are entering suspend */
>   	if (cpufreq_suspended)
>   		return 0;
> @@ -1992,12 +1995,14 @@ static int __cpufreq_governor(struct cpu
>   	if (policy->governor->max_transition_latency &&
>   	    policy->cpuinfo.transition_latency >
>   	    policy->governor->max_transition_latency) {
> -		if (!gov)
> -			return -EINVAL;
> -		else {
> +		struct cpufreq_governor *gov = cpufreq_fallback_governor();
> +
> +		if (gov) {
>   			pr_warn("%s governor failed, too long transition latency of HW, fallback to %s governor\n",
>   				policy->governor->name, gov->name);
>   			policy->governor = gov;
> +		} else {
> +			return -EINVAL;
>   		}
>   	}
>
> Index: linux-pm/drivers/cpufreq/cpufreq_conservative.c
> ===================================================================
> --- linux-pm.orig/drivers/cpufreq/cpufreq_conservative.c
> +++ linux-pm/drivers/cpufreq/cpufreq_conservative.c
> @@ -26,10 +26,7 @@ static DEFINE_PER_CPU(struct cs_cpu_dbs_
>   static int cs_cpufreq_governor_dbs(struct cpufreq_policy *policy,
>   				   unsigned int event);
>
> -#ifndef CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
> -static
> -#endif
> -struct cpufreq_governor cpufreq_gov_conservative = {
> +static struct cpufreq_governor cpufreq_gov_conservative = {
>   	.name			= "conservative",
>   	.governor		= cs_cpufreq_governor_dbs,
>   	.max_transition_latency	= TRANSITION_LATENCY_LIMIT,
> @@ -397,6 +394,11 @@ MODULE_DESCRIPTION("'cpufreq_conservativ
>   MODULE_LICENSE("GPL");
>
>   #ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
> +struct cpufreq_governor *cpufreq_default_governor(void)
> +{
> +	return &cpufreq_gov_conservative;
> +}
> +
>   fs_initcall(cpufreq_gov_dbs_init);
>   #else
>   module_init(cpufreq_gov_dbs_init);
> Index: linux-pm/include/linux/cpufreq.h
> ===================================================================
> --- linux-pm.orig/include/linux/cpufreq.h
> +++ linux-pm/include/linux/cpufreq.h
> @@ -471,29 +471,8 @@ int __cpufreq_driver_target(struct cpufr
>   int cpufreq_register_governor(struct cpufreq_governor *governor);
>   void cpufreq_unregister_governor(struct cpufreq_governor *governor);
>
> -/* CPUFREQ DEFAULT GOVERNOR */
> -/*
> - * Performance governor is fallback governor if any other gov failed to auto
> - * load due latency restrictions
> - */
> -#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
> -extern struct cpufreq_governor cpufreq_gov_performance;
> -#endif
> -#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
> -#define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_performance)
> -#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE)
> -extern struct cpufreq_governor cpufreq_gov_powersave;
> -#define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_powersave)
> -#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE)
> -extern struct cpufreq_governor cpufreq_gov_userspace;
> -#define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_userspace)
> -#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND)
> -extern struct cpufreq_governor cpufreq_gov_ondemand;
> -#define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_ondemand)
> -#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE)
> -extern struct cpufreq_governor cpufreq_gov_conservative;
> -#define CPUFREQ_DEFAULT_GOVERNOR	(&cpufreq_gov_conservative)
> -#endif
> +struct cpufreq_governor *cpufreq_default_governor(void);
> +struct cpufreq_governor *cpufreq_fallback_governor(void);
>
>   /*********************************************************************
>    *                     FREQUENCY TABLE HELPERS                       *
> Index: linux-pm/drivers/cpufreq/cpufreq_ondemand.c
> ===================================================================
> --- linux-pm.orig/drivers/cpufreq/cpufreq_ondemand.c
> +++ linux-pm/drivers/cpufreq/cpufreq_ondemand.c
> @@ -553,6 +553,19 @@ static struct common_dbs_data od_dbs_cda
>   	.mutex = __MUTEX_INITIALIZER(od_dbs_cdata.mutex),
>   };
>
> +static int od_cpufreq_governor_dbs(struct cpufreq_policy *policy,
> +		unsigned int event)
> +{
> +	return cpufreq_governor_dbs(policy, &od_dbs_cdata, event);
> +}
> +
> +static struct cpufreq_governor cpufreq_gov_ondemand = {
> +	.name			= "ondemand",
> +	.governor		= od_cpufreq_governor_dbs,
> +	.max_transition_latency	= TRANSITION_LATENCY_LIMIT,
> +	.owner			= THIS_MODULE,
> +};
> +
>   static void od_set_powersave_bias(unsigned int powersave_bias)
>   {
>   	struct cpufreq_policy *policy;
> @@ -604,22 +617,6 @@ void od_unregister_powersave_bias_handle
>   }
>   EXPORT_SYMBOL_GPL(od_unregister_powersave_bias_handler);
>
> -static int od_cpufreq_governor_dbs(struct cpufreq_policy *policy,
> -		unsigned int event)
> -{
> -	return cpufreq_governor_dbs(policy, &od_dbs_cdata, event);
> -}
> -
> -#ifndef CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND
> -static
> -#endif
> -struct cpufreq_governor cpufreq_gov_ondemand = {
> -	.name			= "ondemand",
> -	.governor		= od_cpufreq_governor_dbs,
> -	.max_transition_latency	= TRANSITION_LATENCY_LIMIT,
> -	.owner			= THIS_MODULE,
> -};
> -
>   static int __init cpufreq_gov_dbs_init(void)
>   {
>   	return cpufreq_register_governor(&cpufreq_gov_ondemand);
> @@ -637,6 +634,11 @@ MODULE_DESCRIPTION("'cpufreq_ondemand' -
>   MODULE_LICENSE("GPL");
>
>   #ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND
> +struct cpufreq_governor *cpufreq_default_governor(void)
> +{
> +	return &cpufreq_gov_ondemand;
> +}
> +
>   fs_initcall(cpufreq_gov_dbs_init);
>   #else
>   module_init(cpufreq_gov_dbs_init);
> Index: linux-pm/drivers/cpufreq/cpufreq_performance.c
> ===================================================================
> --- linux-pm.orig/drivers/cpufreq/cpufreq_performance.c
> +++ linux-pm/drivers/cpufreq/cpufreq_performance.c
> @@ -33,10 +33,7 @@ static int cpufreq_governor_performance(
>   	return 0;
>   }
>
> -#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE_MODULE
> -static
> -#endif
> -struct cpufreq_governor cpufreq_gov_performance = {
> +static struct cpufreq_governor cpufreq_gov_performance = {
>   	.name		= "performance",
>   	.governor	= cpufreq_governor_performance,
>   	.owner		= THIS_MODULE,
> @@ -52,6 +49,19 @@ static void __exit cpufreq_gov_performan
>   	cpufreq_unregister_governor(&cpufreq_gov_performance);
>   }
>
> +#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
> +struct cpufreq_governor *cpufreq_default_governor(void)
> +{
> +	return &cpufreq_gov_performance;
> +}
> +#endif
> +#ifndef CONFIG_CPU_FREQ_GOV_PERFORMANCE_MODULE
> +struct cpufreq_governor *cpufreq_fallback_governor(void)
> +{
> +	return &cpufreq_gov_performance;
> +}
> +#endif
> +
>   MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>");
>   MODULE_DESCRIPTION("CPUfreq policy governor 'performance'");
>   MODULE_LICENSE("GPL");
> Index: linux-pm/drivers/cpufreq/cpufreq_powersave.c
> ===================================================================
> --- linux-pm.orig/drivers/cpufreq/cpufreq_powersave.c
> +++ linux-pm/drivers/cpufreq/cpufreq_powersave.c
> @@ -33,10 +33,7 @@ static int cpufreq_governor_powersave(st
>   	return 0;
>   }
>
> -#ifndef CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE
> -static
> -#endif
> -struct cpufreq_governor cpufreq_gov_powersave = {
> +static struct cpufreq_governor cpufreq_gov_powersave = {
>   	.name		= "powersave",
>   	.governor	= cpufreq_governor_powersave,
>   	.owner		= THIS_MODULE,
> @@ -57,6 +54,11 @@ MODULE_DESCRIPTION("CPUfreq policy gover
>   MODULE_LICENSE("GPL");
>
>   #ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE
> +struct cpufreq_governor *cpufreq_default_governor(void)
> +{
> +	return &cpufreq_gov_powersave;
> +}
> +
>   fs_initcall(cpufreq_gov_powersave_init);
>   #else
>   module_init(cpufreq_gov_powersave_init);
> Index: linux-pm/drivers/cpufreq/cpufreq_userspace.c
> ===================================================================
> --- linux-pm.orig/drivers/cpufreq/cpufreq_userspace.c
> +++ linux-pm/drivers/cpufreq/cpufreq_userspace.c
> @@ -89,10 +89,7 @@ static int cpufreq_governor_userspace(st
>   	return rc;
>   }
>
> -#ifndef CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE
> -static
> -#endif
> -struct cpufreq_governor cpufreq_gov_userspace = {
> +static struct cpufreq_governor cpufreq_gov_userspace = {
>   	.name		= "userspace",
>   	.governor	= cpufreq_governor_userspace,
>   	.store_setspeed	= cpufreq_set,
> @@ -116,6 +113,11 @@ MODULE_DESCRIPTION("CPUfreq policy gover
>   MODULE_LICENSE("GPL");
>
>   #ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE
> +struct cpufreq_governor *cpufreq_default_governor(void)
> +{
> +	return &cpufreq_gov_userspace;
> +}
> +
>   fs_initcall(cpufreq_gov_userspace_init);
>   #else
>   module_init(cpufreq_gov_userspace_init);
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

Ah, that's so much more cleaner!

Acked-by: Saravana Kannan <skannan@codeaurora.org>


-- 
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project

  reply	other threads:[~2016-02-04  0:55 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-03 23:12 [PATCH 0/11] cpufreq: governor: ondemand/conservative data structures rework Rafael J. Wysocki
2016-02-03 23:14 ` [PATCH 1/11] cpufreq: Clean up default and fallback governor setup Rafael J. Wysocki
2016-02-04  0:55   ` Saravana Kannan [this message]
2016-02-04  5:03   ` Viresh Kumar
2016-02-03 23:16 ` [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection Rafael J. Wysocki
2016-02-04  0:59   ` Saravana Kannan
2016-02-04  5:09   ` Viresh Kumar
2016-02-04 16:46     ` Rafael J. Wysocki
2016-02-05  2:59       ` Viresh Kumar
2016-02-05  3:06         ` Rafael J. Wysocki
2016-02-05  3:15           ` Rafael J. Wysocki
2016-02-05  3:17             ` Rafael J. Wysocki
2016-02-05  3:24               ` Viresh Kumar
2016-02-05  3:33                 ` Rafael J. Wysocki
2016-02-05  3:22           ` Viresh Kumar
2016-02-03 23:22 ` [PATCH 3/11] cpufreq: governor: Use common global_dbs_data pointer Rafael J. Wysocki
2016-02-04  1:11   ` Saravana Kannan
2016-02-04  1:25     ` Rafael J. Wysocki
2016-02-04  1:40       ` Saravana Kannan
2016-02-04  5:38       ` Viresh Kumar
2016-02-04  1:47     ` Saravana Kannan
2016-02-04  5:36   ` Viresh Kumar
     [not found]     ` <CAHZ_5WxJSDtFyFdCc-D2=HSaPON=3rzUxpxPYsCyZvrV1Nv3qw@mail.gmail.com>
2016-02-04  8:25       ` Viresh Kumar
2016-02-04 11:31         ` Gautham R Shenoy
2016-02-04 11:35           ` Viresh Kumar
2016-02-04 16:52     ` Rafael J. Wysocki
2016-02-05  3:02       ` Viresh Kumar
2016-02-05  3:10         ` Rafael J. Wysocki
2016-02-03 23:29 ` [PATCH 4/11] cpufreq: governor: Avoid passing dbs_data pointers around unnecessarily Rafael J. Wysocki
2016-02-04  1:37   ` Saravana Kannan
2016-02-03 23:31 ` [PATCH 5/11] cpufreq: governor: Put governor structure into common_dbs_data Rafael J. Wysocki
2016-02-04  1:57   ` Saravana Kannan
2016-02-03 23:32 ` [PATCH 6/11] cpufreq: governor: Rename some data types and variables Rafael J. Wysocki
2016-02-03 23:33 ` [PATCH 7/11] cpufreq: governor: Rework cpufreq_governor_dbs() Rafael J. Wysocki
2016-02-04  2:03   ` Saravana Kannan
2016-02-03 23:35 ` [PATCH 8/11] cpufreq: governor: Drop the gov pointer from struct dbs_data Rafael J. Wysocki
2016-02-03 23:35 ` [PATCH 9/11] cpufreq: governor: Rename cpu_common_dbs_info to policy_dbs_info Rafael J. Wysocki
2016-02-03 23:37 ` [PATCH 10/11] cpufreq: governor: Rearrange governor data structures Rafael J. Wysocki
2016-02-03 23:38 ` [PATCH 11/11] cpufreq: governor: Drop cpu argument from dbs_check_cpu() Rafael J. Wysocki
2016-02-04  5:40 ` [PATCH 0/11] cpufreq: governor: ondemand/conservative data structures rework Viresh Kumar
2016-02-04 17:22   ` Rafael J. Wysocki
2016-02-05  2:07 ` [PATCH v2 0/10] " Rafael J. Wysocki
2016-02-05  2:11   ` [PATCH v2 1/10] cpufreq: Clean up default and fallback governor setup Rafael J. Wysocki
2016-02-10  5:15     ` Gautham R Shenoy
2016-02-10  5:48       ` Gautham R Shenoy
2016-02-10  5:48         ` Gautham R Shenoy
2016-02-05  2:14   ` [PATCH v2 2/10] cpufreq: governor: Use common mutex for dbs_data protection Rafael J. Wysocki
2016-02-05  6:53     ` Viresh Kumar
2016-02-05 22:59       ` Rafael J. Wysocki
2016-02-07  9:31         ` Viresh Kumar
2016-02-07 14:33           ` Rafael J. Wysocki
2016-02-05  2:15   ` [PATCH v2 3/10] cpufreq: governor: Avoid passing dbs_data pointers around unnecessarily Rafael J. Wysocki
2016-02-05  7:09     ` Viresh Kumar
2016-02-05  2:16   ` [PATCH v2 4/10] cpufreq: governor: Put governor structure into common_dbs_data Rafael J. Wysocki
2016-02-05  7:13     ` Viresh Kumar
2016-02-05  2:17   ` [PATCH v2 5/10] cpufreq: governor: Rename some data types and variables Rafael J. Wysocki
2016-02-05  7:17     ` Viresh Kumar
2016-02-05  2:18   ` [PATCH v2 6/10] cpufreq: governor: Rework cpufreq_governor_dbs() Rafael J. Wysocki
2016-02-05  8:14     ` Viresh Kumar
2016-02-05  2:19   ` [PATCH v2 7/10] cpufreq: governor: Drop the gov pointer from struct dbs_data Rafael J. Wysocki
2016-02-05  8:28     ` Viresh Kumar
2016-02-05  2:20   ` [PATCH v2 8/10] cpufreq: governor: Rename cpu_common_dbs_info to policy_dbs_info Rafael J. Wysocki
2016-02-05  8:34     ` Viresh Kumar
2016-02-05 22:50       ` Rafael J. Wysocki
2016-02-06 12:48     ` [PATCH v3 " Rafael J. Wysocki
2016-02-07  9:31       ` Viresh Kumar
2016-02-05  2:21   ` [PATCH v2 9/10] cpufreq: governor: Rearrange governor data structures Rafael J. Wysocki
2016-02-05  9:13     ` Viresh Kumar
2016-02-05 22:47       ` Rafael J. Wysocki
2016-02-07  9:29         ` Viresh Kumar
2016-02-07 14:34           ` Rafael J. Wysocki
2016-02-05  2:21   ` [PATCH v2 10/10] cpufreq: governor: Drop cpu argument from dbs_check_cpu() Rafael J. Wysocki
2016-02-05  9:15     ` Viresh Kumar
2016-02-06 12:50     ` [PATCH v3 " Rafael J. Wysocki
2016-02-07  9:32       ` Viresh Kumar
2016-02-06 12:44   ` [PATCH v2 0/10] cpufreq: governor: ondemand/conservative data structures rework Rafael J. Wysocki
2016-02-07 15:22   ` [PATCH 0/3] cpufreq: governor: Data structure rearrangement Rafael J. Wysocki
2016-02-07 15:23     ` [PATCH 1/3] cpufreq: governor: Simplify cpufreq_governor_limits() Rafael J. Wysocki
2016-02-07 15:40       ` Viresh Kumar
2016-02-08  0:59         ` Rafael J. Wysocki
2016-02-07 15:24     ` [PATCH 2/3] cpufreq: governor: Rearrange governor data structures Rafael J. Wysocki
2016-02-07 15:45       ` Viresh Kumar
2016-02-07 15:54         ` Viresh Kumar
2016-02-07 15:55       ` Viresh Kumar
2016-02-07 15:25     ` [PATCH 3/3] cpufreq: governor: Symmetrize cpu_dbs_info initialization and cleanup Rafael J. Wysocki
2016-02-07 15:52       ` Viresh Kumar

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=56B2A187.3080500@codeaurora.org \
    --to=skannan@codeaurora.org \
    --cc=juri.lelli@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    --cc=srinivas.pandruvada@linux.intel.com \
    --cc=steve.muckle@linaro.org \
    --cc=viresh.kumar@linaro.org \
    /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.