• T
    cpumask: introduce cpumap_print_list/bitmask_to_buf to support large bitmask and list · 1fae5629
    Tian Tao 提交于
    The existing cpumap_print_to_pagebuf() is used by cpu topology and other
    drivers to export hexadecimal bitmask and decimal list to userspace by
    sysfs ABI.
    
    Right now, those drivers are using a normal attribute for this kind of
    ABIs. A normal attribute typically has show entry as below:
    
    static ssize_t example_dev_show(struct device *dev,
                    struct device_attribute *attr, char *buf)
    {
    	...
    	return cpumap_print_to_pagebuf(true, buf, &pmu_mmdc->cpu);
    }
    show entry of attribute has no offset and count parameters and this
    means the file is limited to one page only.
    
    cpumap_print_to_pagebuf() API works terribly well for this kind of
    normal attribute with buf parameter and without offset, count:
    
    static inline ssize_t
    cpumap_print_to_pagebuf(bool list, char *buf, const struct cpumask *mask)
    {
    	return bitmap_print_to_pagebuf(list, buf, cpumask_bits(mask),
    				       nr_cpu_ids);
    }
    
    The problem is once we have many cpus, we have a chance to make bitmask
    or list more than one page. Especially for list, it could be as complex
    as 0,3,5,7,9,...... We have no simple way to know it exact size.
    
    It turns out bin_attribute is a way to break this limit. bin_attribute
    has show entry as below:
    static ssize_t
    example_bin_attribute_show(struct file *filp, struct kobject *kobj,
                 struct bin_attribute *attr, char *buf,
                 loff_t offset, size_t count)
    {
    	...
    }
    
    With the new offset and count parameters, this makes sysfs ABI be able
    to support file size more than one page. For example, offset could be
    >= 4096.
    
    This patch introduces cpumap_print_bitmask/list_to_buf() and their bitmap
    infrastructure bitmap_print_bitmask/list_to_buf() so that those drivers
    can move to bin_attribute to support large bitmask and list. At the same
    time, we have to pass those corresponding parameters such as offset, count
    from bin_attribute to this new API.
    
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Randy Dunlap <rdunlap@infradead.org>
    Cc: Stefano Brivio <sbrivio@redhat.com>
    Cc: Alexander Gordeev <agordeev@linux.ibm.com>
    Cc: "Ma, Jianpeng" <jianpeng.ma@intel.com>
    Cc: Yury Norov <yury.norov@gmail.com>
    Cc: Valentin Schneider <valentin.schneider@arm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
    Reviewed-by: NJonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: NTian Tao <tiantao6@hisilicon.com>
    Signed-off-by: NBarry Song <song.bao.hua@hisilicon.com>
    Link: https://lore.kernel.org/r/20210806110251.560-2-song.bao.hua@hisilicon.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    1fae5629
bitmap.c 43.4 KB