Skip to content
  • Christophe Leroy's avatar
    gpio: sysfs: change 'value' attribute to prealloc · 7fda9100
    Christophe Leroy authored
    
    
    The GPIO 'value' attribute is time critical. A small bench with
    'perf record' on the app below shows that 80% of the time spent in
    sysfs_kf_seq_show() is spent in memset() for zeroising the buffer.
    
    |--67.48%--sysfs_kf_seq_show
    |          |
    |          |--54.40%--memset
    |          |
    |          |--11.49%--dev_attr_show
    |          |          |
    |          |          |--10.06%--value_show
    |          |          |          |
    |          |          |          |--4.75%--sprintf
    |          |          |          |          |
    
    This patch changes the attribute type to prealloc, eliminating the
    need to zeroise the buffer at each read. 'perf record' gives the
    following result.
    
    |--42.41%--sysfs_kf_read
    |          |
    |          |--39.73%--dev_attr_show
    |          |          |
    |          |          |--38.23%--value_show
    |          |          |          |
    |          |          |          |--29.22%--sprintf
    |          |          |          |          |
    
    Test done with the following small app:
    
    int main(int argc, char **argv)
    {
    	int fd = open(argv[1], O_RDONLY);
    
    	for (;;) {
    		int buf[512];
    
    		read(fd, buf, 512);
    		lseek(fd, 0, SEEK_SET);
    	}
    	exit(0);
    }
    
    Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    7fda9100