mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 07:23:14 +00:00
cpumask: factor out show_cpumap into separate helper function
Many sysfs *_show function use cpu{list,mask}_scnprintf to copy cpumap to the buffer aligned to PAGE_SIZE, append '\n' and '\0' to return null terminated buffer with newline. This patch creates a new helper function cpumap_print_to_pagebuf in cpumask.h using newly added bitmap_print_to_pagebuf and consolidates most of those sysfs functions using the new helper function. Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> Suggested-by: Stephen Boyd <sboyd@codeaurora.org> Tested-by: Stephen Boyd <sboyd@codeaurora.org> Acked-by: "Rafael J. Wysocki" <rjw@rjwysocki.net> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: x86@kernel.org Cc: linux-acpi@vger.kernel.org Cc: linux-pci@vger.kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
0372ffb35d
commit
5aaba36318
@ -130,10 +130,7 @@ static ssize_t _iommu_cpumask_show(struct device *dev,
|
|||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
int n = cpulist_scnprintf(buf, PAGE_SIZE - 2, &iommu_cpumask);
|
return cpumap_print_to_pagebuf(true, buf, &iommu_cpumask);
|
||||||
buf[n++] = '\n';
|
|
||||||
buf[n] = '\0';
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR(cpumask, S_IRUGO, _iommu_cpumask_show, NULL);
|
static DEVICE_ATTR(cpumask, S_IRUGO, _iommu_cpumask_show, NULL);
|
||||||
|
|
||||||
|
@ -219,7 +219,6 @@ static ssize_t amd_uncore_attr_show_cpumask(struct device *dev,
|
|||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
int n;
|
|
||||||
cpumask_t *active_mask;
|
cpumask_t *active_mask;
|
||||||
struct pmu *pmu = dev_get_drvdata(dev);
|
struct pmu *pmu = dev_get_drvdata(dev);
|
||||||
|
|
||||||
@ -230,10 +229,7 @@ static ssize_t amd_uncore_attr_show_cpumask(struct device *dev,
|
|||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
n = cpulist_scnprintf(buf, PAGE_SIZE - 2, active_mask);
|
return cpumap_print_to_pagebuf(true, buf, active_mask);
|
||||||
buf[n++] = '\n';
|
|
||||||
buf[n] = '\0';
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR(cpumask, S_IRUGO, amd_uncore_attr_show_cpumask, NULL);
|
static DEVICE_ATTR(cpumask, S_IRUGO, amd_uncore_attr_show_cpumask, NULL);
|
||||||
|
|
||||||
|
@ -365,11 +365,7 @@ static void rapl_pmu_event_read(struct perf_event *event)
|
|||||||
static ssize_t rapl_get_attr_cpumask(struct device *dev,
|
static ssize_t rapl_get_attr_cpumask(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
int n = cpulist_scnprintf(buf, PAGE_SIZE - 2, &rapl_cpu_mask);
|
return cpumap_print_to_pagebuf(true, buf, &rapl_cpu_mask);
|
||||||
|
|
||||||
buf[n++] = '\n';
|
|
||||||
buf[n] = '\0';
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR(cpumask, S_IRUGO, rapl_get_attr_cpumask, NULL);
|
static DEVICE_ATTR(cpumask, S_IRUGO, rapl_get_attr_cpumask, NULL);
|
||||||
|
@ -647,11 +647,7 @@ static int uncore_pmu_event_init(struct perf_event *event)
|
|||||||
static ssize_t uncore_get_attr_cpumask(struct device *dev,
|
static ssize_t uncore_get_attr_cpumask(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
int n = cpulist_scnprintf(buf, PAGE_SIZE - 2, &uncore_cpu_mask);
|
return cpumap_print_to_pagebuf(true, buf, &uncore_cpu_mask);
|
||||||
|
|
||||||
buf[n++] = '\n';
|
|
||||||
buf[n] = '\0';
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR(cpumask, S_IRUGO, uncore_get_attr_cpumask, NULL);
|
static DEVICE_ATTR(cpumask, S_IRUGO, uncore_get_attr_cpumask, NULL);
|
||||||
|
@ -350,12 +350,10 @@ static ssize_t acpi_pad_idlecpus_store(struct device *dev,
|
|||||||
static ssize_t acpi_pad_idlecpus_show(struct device *dev,
|
static ssize_t acpi_pad_idlecpus_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
int n = 0;
|
return cpumap_print_to_pagebuf(false, buf,
|
||||||
n = cpumask_scnprintf(buf, PAGE_SIZE-2, to_cpumask(pad_busy_cpus_bits));
|
to_cpumask(pad_busy_cpus_bits));
|
||||||
buf[n++] = '\n';
|
|
||||||
buf[n] = '\0';
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR(idlecpus, S_IRUGO|S_IWUSR,
|
static DEVICE_ATTR(idlecpus, S_IRUGO|S_IWUSR,
|
||||||
acpi_pad_idlecpus_show,
|
acpi_pad_idlecpus_show,
|
||||||
acpi_pad_idlecpus_store);
|
acpi_pad_idlecpus_store);
|
||||||
|
@ -207,11 +207,8 @@ static ssize_t show_cpus_attr(struct device *dev,
|
|||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct cpu_attr *ca = container_of(attr, struct cpu_attr, attr);
|
struct cpu_attr *ca = container_of(attr, struct cpu_attr, attr);
|
||||||
int n = cpulist_scnprintf(buf, PAGE_SIZE-2, *(ca->map));
|
|
||||||
|
|
||||||
buf[n++] = '\n';
|
return cpumap_print_to_pagebuf(true, buf, *ca->map);
|
||||||
buf[n] = '\0';
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define _CPU_ATTR(name, map) \
|
#define _CPU_ATTR(name, map) \
|
||||||
|
@ -25,32 +25,26 @@ static struct bus_type node_subsys = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static ssize_t node_read_cpumap(struct device *dev, int type, char *buf)
|
static ssize_t node_read_cpumap(struct device *dev, bool list, char *buf)
|
||||||
{
|
{
|
||||||
struct node *node_dev = to_node(dev);
|
struct node *node_dev = to_node(dev);
|
||||||
const struct cpumask *mask = cpumask_of_node(node_dev->dev.id);
|
const struct cpumask *mask = cpumask_of_node(node_dev->dev.id);
|
||||||
int len;
|
|
||||||
|
|
||||||
/* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */
|
/* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */
|
||||||
BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1));
|
BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1));
|
||||||
|
|
||||||
len = type?
|
return cpumap_print_to_pagebuf(list, buf, mask);
|
||||||
cpulist_scnprintf(buf, PAGE_SIZE-2, mask) :
|
|
||||||
cpumask_scnprintf(buf, PAGE_SIZE-2, mask);
|
|
||||||
buf[len++] = '\n';
|
|
||||||
buf[len] = '\0';
|
|
||||||
return len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline ssize_t node_read_cpumask(struct device *dev,
|
static inline ssize_t node_read_cpumask(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return node_read_cpumap(dev, 0, buf);
|
return node_read_cpumap(dev, false, buf);
|
||||||
}
|
}
|
||||||
static inline ssize_t node_read_cpulist(struct device *dev,
|
static inline ssize_t node_read_cpulist(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return node_read_cpumap(dev, 1, buf);
|
return node_read_cpumap(dev, true, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL);
|
static DEVICE_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL);
|
||||||
|
@ -42,29 +42,11 @@ static ssize_t show_##name(struct device *dev, \
|
|||||||
return sprintf(buf, "%d\n", topology_##name(dev->id)); \
|
return sprintf(buf, "%d\n", topology_##name(dev->id)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(topology_thread_cpumask) || defined(topology_core_cpumask) || \
|
|
||||||
defined(topology_book_cpumask)
|
|
||||||
static ssize_t show_cpumap(int type, const struct cpumask *mask, char *buf)
|
|
||||||
{
|
|
||||||
ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf;
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
if (len > 1) {
|
|
||||||
n = type?
|
|
||||||
cpulist_scnprintf(buf, len-2, mask) :
|
|
||||||
cpumask_scnprintf(buf, len-2, mask);
|
|
||||||
buf[n++] = '\n';
|
|
||||||
buf[n] = '\0';
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define define_siblings_show_map(name) \
|
#define define_siblings_show_map(name) \
|
||||||
static ssize_t show_##name(struct device *dev, \
|
static ssize_t show_##name(struct device *dev, \
|
||||||
struct device_attribute *attr, char *buf) \
|
struct device_attribute *attr, char *buf) \
|
||||||
{ \
|
{ \
|
||||||
return show_cpumap(0, topology_##name(dev->id), buf); \
|
return cpumap_print_to_pagebuf(false, buf, topology_##name(dev->id));\
|
||||||
}
|
}
|
||||||
|
|
||||||
#define define_siblings_show_list(name) \
|
#define define_siblings_show_list(name) \
|
||||||
@ -72,7 +54,7 @@ static ssize_t show_##name##_list(struct device *dev, \
|
|||||||
struct device_attribute *attr, \
|
struct device_attribute *attr, \
|
||||||
char *buf) \
|
char *buf) \
|
||||||
{ \
|
{ \
|
||||||
return show_cpumap(1, topology_##name(dev->id), buf); \
|
return cpumap_print_to_pagebuf(true, buf, topology_##name(dev->id));\
|
||||||
}
|
}
|
||||||
|
|
||||||
#define define_siblings_show_func(name) \
|
#define define_siblings_show_func(name) \
|
||||||
|
@ -77,11 +77,10 @@ static ssize_t broken_parity_status_store(struct device *dev,
|
|||||||
}
|
}
|
||||||
static DEVICE_ATTR_RW(broken_parity_status);
|
static DEVICE_ATTR_RW(broken_parity_status);
|
||||||
|
|
||||||
static ssize_t pci_dev_show_local_cpu(struct device *dev, int type,
|
static ssize_t pci_dev_show_local_cpu(struct device *dev, bool list,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
const struct cpumask *mask;
|
const struct cpumask *mask;
|
||||||
int len;
|
|
||||||
|
|
||||||
#ifdef CONFIG_NUMA
|
#ifdef CONFIG_NUMA
|
||||||
mask = (dev_to_node(dev) == -1) ? cpu_online_mask :
|
mask = (dev_to_node(dev) == -1) ? cpu_online_mask :
|
||||||
@ -89,59 +88,41 @@ static ssize_t pci_dev_show_local_cpu(struct device *dev, int type,
|
|||||||
#else
|
#else
|
||||||
mask = cpumask_of_pcibus(to_pci_dev(dev)->bus);
|
mask = cpumask_of_pcibus(to_pci_dev(dev)->bus);
|
||||||
#endif
|
#endif
|
||||||
len = type ?
|
return cpumap_print_to_pagebuf(list, buf, mask);
|
||||||
cpumask_scnprintf(buf, PAGE_SIZE-2, mask) :
|
|
||||||
cpulist_scnprintf(buf, PAGE_SIZE-2, mask);
|
|
||||||
|
|
||||||
buf[len++] = '\n';
|
|
||||||
buf[len] = '\0';
|
|
||||||
return len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t local_cpus_show(struct device *dev,
|
static ssize_t local_cpus_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return pci_dev_show_local_cpu(dev, 1, attr, buf);
|
return pci_dev_show_local_cpu(dev, false, attr, buf);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(local_cpus);
|
static DEVICE_ATTR_RO(local_cpus);
|
||||||
|
|
||||||
static ssize_t local_cpulist_show(struct device *dev,
|
static ssize_t local_cpulist_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return pci_dev_show_local_cpu(dev, 0, attr, buf);
|
return pci_dev_show_local_cpu(dev, true, attr, buf);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(local_cpulist);
|
static DEVICE_ATTR_RO(local_cpulist);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PCI Bus Class Devices
|
* PCI Bus Class Devices
|
||||||
*/
|
*/
|
||||||
static ssize_t pci_bus_show_cpuaffinity(struct device *dev, int type,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
char *buf)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
const struct cpumask *cpumask;
|
|
||||||
|
|
||||||
cpumask = cpumask_of_pcibus(to_pci_bus(dev));
|
|
||||||
ret = type ?
|
|
||||||
cpulist_scnprintf(buf, PAGE_SIZE-2, cpumask) :
|
|
||||||
cpumask_scnprintf(buf, PAGE_SIZE-2, cpumask);
|
|
||||||
buf[ret++] = '\n';
|
|
||||||
buf[ret] = '\0';
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t cpuaffinity_show(struct device *dev,
|
static ssize_t cpuaffinity_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return pci_bus_show_cpuaffinity(dev, 0, attr, buf);
|
const struct cpumask *cpumask = cpumask_of_pcibus(to_pci_bus(dev));
|
||||||
|
|
||||||
|
return cpumap_print_to_pagebuf(false, buf, cpumask);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(cpuaffinity);
|
static DEVICE_ATTR_RO(cpuaffinity);
|
||||||
|
|
||||||
static ssize_t cpulistaffinity_show(struct device *dev,
|
static ssize_t cpulistaffinity_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return pci_bus_show_cpuaffinity(dev, 1, attr, buf);
|
const struct cpumask *cpumask = cpumask_of_pcibus(to_pci_bus(dev));
|
||||||
|
|
||||||
|
return cpumap_print_to_pagebuf(true, buf, cpumask);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(cpulistaffinity);
|
static DEVICE_ATTR_RO(cpulistaffinity);
|
||||||
|
|
||||||
|
@ -60,6 +60,7 @@
|
|||||||
* bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region
|
* bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region
|
||||||
* bitmap_release_region(bitmap, pos, order) Free specified bit region
|
* bitmap_release_region(bitmap, pos, order) Free specified bit region
|
||||||
* bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region
|
* bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region
|
||||||
|
* bitmap_print_to_pagebuf(list, buf, mask, nbits) Print bitmap src as list/hex
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -145,6 +146,8 @@ extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int o
|
|||||||
extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
|
extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
|
||||||
extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits);
|
extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits);
|
||||||
extern int bitmap_ord_to_pos(const unsigned long *bitmap, int n, int bits);
|
extern int bitmap_ord_to_pos(const unsigned long *bitmap, int n, int bits);
|
||||||
|
extern int bitmap_print_to_pagebuf(bool list, char *buf,
|
||||||
|
const unsigned long *maskp, int nmaskbits);
|
||||||
|
|
||||||
#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG))
|
#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG))
|
||||||
#define BITMAP_LAST_WORD_MASK(nbits) \
|
#define BITMAP_LAST_WORD_MASK(nbits) \
|
||||||
|
@ -803,6 +803,23 @@ static inline const struct cpumask *get_cpu_mask(unsigned int cpu)
|
|||||||
}
|
}
|
||||||
#endif /* NR_CPUS > BITS_PER_LONG */
|
#endif /* NR_CPUS > BITS_PER_LONG */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cpumap_print_to_pagebuf - copies the cpumask into the buffer either
|
||||||
|
* as comma-separated list of cpus or hex values of cpumask
|
||||||
|
* @list: indicates whether the cpumap must be list
|
||||||
|
* @mask: the cpumask to copy
|
||||||
|
* @buf: the buffer to copy into
|
||||||
|
*
|
||||||
|
* Returns the length of the (null-terminated) @buf string, zero if
|
||||||
|
* nothing is copied.
|
||||||
|
*/
|
||||||
|
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_cpumask_bits);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* From here down, all obsolete. Use cpumask_ variants!
|
* From here down, all obsolete. Use cpumask_ variants!
|
||||||
|
29
lib/bitmap.c
29
lib/bitmap.c
@ -12,6 +12,8 @@
|
|||||||
#include <linux/bitmap.h>
|
#include <linux/bitmap.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
|
|
||||||
|
#include <asm/page.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -583,6 +585,33 @@ int bitmap_scnlistprintf(char *buf, unsigned int buflen,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(bitmap_scnlistprintf);
|
EXPORT_SYMBOL(bitmap_scnlistprintf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bitmap_print_to_pagebuf - convert bitmap to list or hex format ASCII string
|
||||||
|
* @list: indicates whether the bitmap must be list
|
||||||
|
* @buf: page aligned buffer into which string is placed
|
||||||
|
* @maskp: pointer to bitmap to convert
|
||||||
|
* @nmaskbits: size of bitmap, in bits
|
||||||
|
*
|
||||||
|
* Output format is a comma-separated list of decimal numbers and
|
||||||
|
* ranges if list is specified or hex digits grouped into comma-separated
|
||||||
|
* sets of 8 digits/set. Returns the number of characters written to buf.
|
||||||
|
*/
|
||||||
|
int bitmap_print_to_pagebuf(bool list, char *buf, const unsigned long *maskp,
|
||||||
|
int nmaskbits)
|
||||||
|
{
|
||||||
|
ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf - 2;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
if (len > 1) {
|
||||||
|
n = list ? bitmap_scnlistprintf(buf, len, maskp, nmaskbits) :
|
||||||
|
bitmap_scnprintf(buf, len, maskp, nmaskbits);
|
||||||
|
buf[n++] = '\n';
|
||||||
|
buf[n] = '\0';
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(bitmap_print_to_pagebuf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __bitmap_parselist - convert list format ASCII string to bitmap
|
* __bitmap_parselist - convert list format ASCII string to bitmap
|
||||||
* @buf: read nul-terminated user string from this buffer
|
* @buf: read nul-terminated user string from this buffer
|
||||||
|
Loading…
Reference in New Issue
Block a user