Re: [PATCH] fixdep: faster CONFIG_ search

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 23, 2016 at 09:47:24PM +0300, Alexey Dobriyan wrote:
> Do you think kernel build is 100% dominated by gcc? You are wrong!
> One small utility called "fixdep" consistently manages to sneak into
> profile's first page (unless you have small monitor of course).
> 
> The choke point is this clever code:
> 
> 	for (; m < end; m++) {
> 		if (*m == INT_CONF) { p = (char *) m  ; goto conf; }
> 		if (*m == INT_ONFI) { p = (char *) m-1; goto conf; }
> 		if (*m == INT_NFIG) { p = (char *) m-2; goto conf; }
> 		if (*m == INT_FIG_) { p = (char *) m-3; goto conf; }
> 
> 4 branches per 4 characters is not fast.
> 
> Use strstr(3), so that SSE2 etc can be used.
> 
> With this patch, fixdep is so deep at the bottom, it is hard to find it.
> 
> Signed-off-by: Alexey Dobriyan <adobriyan@xxxxxxxxx>
> ---
> 
>  scripts/basic/fixdep.c |   67 ++++++++++++++++++++-----------------------------
>  1 file changed, 28 insertions(+), 39 deletions(-)
> 
> --- a/scripts/basic/fixdep.c
> +++ b/scripts/basic/fixdep.c
> @@ -82,8 +82,7 @@
>   * to date before even starting the recursive build, so it's too late
>   * at this point anyway.
>   *
> - * The algorithm to grep for "CONFIG_..." is bit unusual, but should
> - * be fast ;-) We don't even try to really parse the header files, but
> + * We don't even try to really parse the header files, but
>   * merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will
>   * be picked up as well. It's not a problem with respect to
>   * correctness, since that can only give too many dependencies, thus
> @@ -241,37 +240,22 @@ static void use_config(const char *m, int slen)
>  	print_config(m, slen);
>  }
>  
> -static void parse_config_file(const char *map, size_t len)
> +static void parse_config_file(const char *p)
>  {
> -	const int *end = (const int *) (map + len);
> -	/* start at +1, so that p can never be < map */
> -	const int *m   = (const int *) map + 1;
> -	const char *p, *q;
> -
> -	for (; m < end; m++) {
> -		if (*m == INT_CONF) { p = (char *) m  ; goto conf; }
> -		if (*m == INT_ONFI) { p = (char *) m-1; goto conf; }
> -		if (*m == INT_NFIG) { p = (char *) m-2; goto conf; }
> -		if (*m == INT_FIG_) { p = (char *) m-3; goto conf; }
> -		continue;
> -	conf:
> -		if (p > map + len - 7)
> -			continue;
> -		if (memcmp(p, "CONFIG_", 7))
> -			continue;
> +	const char *q, *r;
> +
> +	while ((p = strstr(p, "CONFIG_"))) {
>  		p += 7;
> -		for (q = p; q < map + len; q++) {
> -			if (!(isalnum(*q) || *q == '_'))
> -				goto found;
> -		}
> -		continue;
> -
> -	found:
> -		if (!memcmp(q - 7, "_MODULE", 7))
> -			q -= 7;
> -		if (q - p < 0)
> -			continue;
> -		use_config(p, q - p);
> +		q = p;
> +		while (*q && (isalnum(*q) || *q == '_'))
> +			q++;
> +		if (memcmp(q - 7, "_MODULE", 7) == 0)
> +			r = q - 7;
> +		else
> +			r = q;
> +		if (r > p)
> +			use_config(p, r - p);
> +		p = q;
>  	}
>  }
Faster and simpler - good.

>  
> @@ -291,7 +275,7 @@ static void do_config_file(const char *filename)
>  {
>  	struct stat st;
>  	int fd;
> -	void *map;
> +	char *map;
>  
>  	fd = open(filename, O_RDONLY);
>  	if (fd < 0) {
> @@ -308,18 +292,23 @@ static void do_config_file(const char *filename)
>  		close(fd);
>  		return;
>  	}
> -	map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
> -	if ((long) map == -1) {
> -		perror("fixdep: mmap");
> +	map = malloc(st.st_size + 1);
> +	if (!map) {
> +		perror("fixdep: malloc");
>  		close(fd);
>  		return;
>  	}
> +	if (read(fd, map, st.st_size) != st.st_size) {
> +		perror("fixdep: read");
> +		close(fd);
> +		return;
> +	}
> +	map[st.st_size] = '\0';
> +	close(fd);
>  
> -	parse_config_file(map, st.st_size);
> -
> -	munmap(map, st.st_size);
> +	parse_config_file(map);
>  
> -	close(fd);
> +	free(map);
>  }
This change is not described in the changelog..
What is the rationale?

	Sam
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux