[PATCH 0/3] x86: add cpus_scnprintf function v3 - Kernel

This is a discussion on [PATCH 0/3] x86: add cpus_scnprintf function v3 - Kernel ; * Add cpu_sysdev_class functions to display the cpu_online_map cpu_present_map cpu_possible_map cpu_system_map * Cleanup usages of cpumask_scprintf in the following files and add another interface to use cpulist_scnprintf where appropriate. arch/x86/kernel/cpu/intel_cacheinfo.c drivers/base/cpu.c drivers/base/node.c drivers/base/topology.c drivers/pci/pci-sysfs.c drivers/pci/probe.c include/linux/sysdev.h kernel/cpuset.c kernel/sched_stats.h kernel/trace/trace.c - ...

+ Reply to Thread
Page 1 of 3 1 2 3 LastLast
Results 1 to 20 of 41

Thread: [PATCH 0/3] x86: add cpus_scnprintf function v3

  1. [PATCH 0/3] x86: add cpus_scnprintf function v3


    * Add cpu_sysdev_class functions to display the

    cpu_online_map
    cpu_present_map
    cpu_possible_map
    cpu_system_map

    * Cleanup usages of cpumask_scprintf in the following files and add
    another interface to use cpulist_scnprintf where appropriate.

    arch/x86/kernel/cpu/intel_cacheinfo.c
    drivers/base/cpu.c
    drivers/base/node.c
    drivers/base/topology.c
    drivers/pci/pci-sysfs.c
    drivers/pci/probe.c
    include/linux/sysdev.h
    kernel/cpuset.c
    kernel/sched_stats.h
    kernel/trace/trace.c

    - The new interface is generally the same base name but uses 'list'
    instead of 'map'. For example, there is now:

    # cat /sys/devices/system/node/node0/cpumap
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000000,\
    00000000,00000000,00000000,00000000,00000000,00000 000,00000000,00000003

    - And the new interface:

    # cat /sys/devices/system/node/node0/cpulist
    0-1

    Based on:
    git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    + x86/latest .../x86/linux-2.6-x86.git
    + sched-devel/latest .../mingo/linux-2.6-sched-devel.git

    Signed-off-by: Mike Travis
    ---
    v3:
    Removed cpus_scnprintf() and all references.

    v2:
    Renamed cpuset_scnprintf() to cpus_scnprintf to avoid confusion with
    "cpusets", and changed the other names to match.

    Added a sentinel character for the cpulist type output so scripts can
    be written to handle both cases.

    Added warning in the Documentation/sysctl/kernel.txt that changing this
    option may break scripts and programs that rely on the current format.
    Also provided example on how to process the output.

    Added information to Documentation/scheduler/sched-stats.txt about
    change in version number because of new cpus_scnprintf function.

    --
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. [PATCH 2/3] cpumask: use new cpus_scnprintf function v3

    * Cleaned up references to cpumask_scnprintf() and added new
    cpulist_scnprintf() interfaces where appropriate.

    * Fix some small bugs (or code efficiency improvments) for various uses
    of cpumask_scnprintf.

    * Clean up some checkpatch errors.

    Based on:
    git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    + x86/latest .../x86/linux-2.6-x86.git
    + sched-devel/latest .../mingo/linux-2.6-sched-devel.git

    Signed-off-by: Mike Travis
    ---
    v3:
    Removed cpus_scnprintf() and all references.
    Removed changes to sched_stat.h (now cleanup only).

    Three unfixable checkpatch warnings/errors:

    WARNING: usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc
    #49: FILE: drivers/base/node.c:29:
    + BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1));

    ERROR: Macros with complex values should be enclosed in parenthesis
    #115: FILE: drivers/base/topology.c:59:
    +static inline ssize_t show_##name(struct sys_device *dev, char *buf) \

    ERROR: Macros with complex values should be enclosed in parenthesis
    #125: FILE: drivers/base/topology.c:66:
    +static inline ssize_t show_##name##_list(struct sys_device *dev, char *buf) \

    v2:
    Renamed cpuset_scnprintf() to cpus_scnprintf to avoid confusion with
    "cpusets", and changed the other names to match.
    ---
    drivers/base/node.c | 24 +++++++++++++++++++-----
    drivers/base/topology.c | 41 ++++++++++++++++++++++++++++++++++-------
    drivers/pci/pci-sysfs.c | 20 ++++++++++++++++++--
    drivers/pci/probe.c | 27 +++++++++++++++++++++++----
    kernel/cpuset.c | 8 ++++++++
    kernel/sched_stats.h | 8 ++++++--
    6 files changed, 108 insertions(+), 20 deletions(-)

    --- linux-2.6.x86.sched.orig/drivers/base/node.c
    +++ linux-2.6.x86.sched/drivers/base/node.c
    @@ -19,22 +19,34 @@ static struct sysdev_class node_class =
    };


    -static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
    +static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)
    {
    struct node *node_dev = to_node(dev);
    node_to_cpumask_ptr(mask, node_dev->sysdev.id);
    int len;

    - /* 2004/06/03: buf currently PAGE_SIZE, need > 1 char per 4 bits. */
    - BUILD_BUG_ON(MAX_NUMNODES/4 > PAGE_SIZE/2);
    + /* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */
    + BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1));

    - len = cpumask_scnprintf(buf, PAGE_SIZE-2, *mask);
    + len = type?
    + cpulist_scnprintf(buf, PAGE_SIZE-2, *mask):
    + cpumask_scnprintf(buf, PAGE_SIZE-2, *mask);
    buf[len++] = '\n';
    buf[len] = '\0';
    return len;
    }

    -static SYSDEV_ATTR(cpumap, S_IRUGO, node_read_cpumap, NULL);
    +static inline ssize_t node_read_cpumask(struct sys_device *dev, char *buf)
    +{
    + return node_read_cpumap(dev, 0, buf);
    +}
    +static inline ssize_t node_read_cpulist(struct sys_device *dev, char *buf)
    +{
    + return node_read_cpumap(dev, 1, buf);
    +}
    +
    +static SYSDEV_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL);
    +static SYSDEV_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL);

    #define K(x) ((x) << (PAGE_SHIFT - 10))
    static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
    @@ -150,6 +162,7 @@ int register_node(struct node *node, int

    if (!error){
    sysdev_create_file(&node->sysdev, &attr_cpumap);
    + sysdev_create_file(&node->sysdev, &attr_cpulist);
    sysdev_create_file(&node->sysdev, &attr_meminfo);
    sysdev_create_file(&node->sysdev, &attr_numastat);
    sysdev_create_file(&node->sysdev, &attr_distance);
    @@ -167,6 +180,7 @@ int register_node(struct node *node, int
    void unregister_node(struct node *node)
    {
    sysdev_remove_file(&node->sysdev, &attr_cpumap);
    + sysdev_remove_file(&node->sysdev, &attr_cpulist);
    sysdev_remove_file(&node->sysdev, &attr_meminfo);
    sysdev_remove_file(&node->sysdev, &attr_numastat);
    sysdev_remove_file(&node->sysdev, &attr_distance);
    --- linux-2.6.x86.sched.orig/drivers/base/topology.c
    +++ linux-2.6.x86.sched/drivers/base/topology.c
    @@ -40,15 +40,38 @@ static ssize_t show_##name(struct sys_de
    return sprintf(buf, "%d\n", topology_##name(cpu)); \
    }

    -#define define_siblings_show_func(name) \
    -static ssize_t show_##name(struct sys_device *dev, char *buf) \
    +static ssize_t show_cpumap(int type, cpumask_t *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;
    +}
    +
    +#define define_siblings_show_map(name) \
    +static inline ssize_t show_##name(struct sys_device *dev, char *buf) \
    { \
    - ssize_t len = -1; \
    unsigned int cpu = dev->id; \
    - len = cpumask_scnprintf(buf, NR_CPUS+1, topology_##name(cpu)); \
    - return (len + sprintf(buf + len, "\n")); \
    + return show_cpumap(0, &(topology_##name(cpu)), buf); \
    }

    +#define define_siblings_show_list(name) \
    +static inline ssize_t show_##name##_list(struct sys_device *dev, char *buf) \
    +{ \
    + unsigned int cpu = dev->id; \
    + return show_cpumap(1, &(topology_##name(cpu)), buf); \
    +}
    +
    +#define define_siblings_show_func(name) \
    + define_siblings_show_map(name); define_siblings_show_list(name)
    +
    #ifdef topology_physical_package_id
    define_id_show_func(physical_package_id);
    define_one_ro(physical_package_id);
    @@ -68,7 +91,9 @@ define_one_ro(core_id);
    #ifdef topology_thread_siblings
    define_siblings_show_func(thread_siblings);
    define_one_ro(thread_siblings);
    -#define ref_thread_siblings_attr &attr_thread_siblings.attr,
    +define_one_ro(thread_siblings_list);
    +#define ref_thread_siblings_attr \
    + &attr_thread_siblings.attr, &attr_thread_siblings_list.attr,
    #else
    #define ref_thread_siblings_attr
    #endif
    @@ -76,7 +101,9 @@ define_one_ro(thread_siblings);
    #ifdef topology_core_siblings
    define_siblings_show_func(core_siblings);
    define_one_ro(core_siblings);
    -#define ref_core_siblings_attr &attr_core_siblings.attr,
    +define_one_ro(core_siblings_list);
    +#define ref_core_siblings_attr \
    + &attr_core_siblings.attr, &attr_core_siblings_list.attr,
    #else
    #define ref_core_siblings_attr
    #endif
    --- linux-2.6.x86.sched.orig/drivers/pci/pci-sysfs.c
    +++ linux-2.6.x86.sched/drivers/pci/pci-sysfs.c
    @@ -73,8 +73,23 @@ static ssize_t local_cpus_show(struct de

    mask = pcibus_to_cpumask(to_pci_dev(dev)->bus);
    len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask);
    - strcat(buf,"\n");
    - return 1+len;
    + buf[len++] = '\n';
    + buf[len] = '\0';
    + return len;
    +}
    +
    +
    +static ssize_t local_cpulist_show(struct device *dev,
    + struct device_attribute *attr, char *buf)
    +{
    + cpumask_t mask;
    + int len;
    +
    + mask = pcibus_to_cpumask(to_pci_dev(dev)->bus);
    + len = cpulist_scnprintf(buf, PAGE_SIZE-2, mask);
    + buf[len++] = '\n';
    + buf[len] = '\0';
    + return len;
    }

    /* show resources */
    @@ -201,6 +216,7 @@ struct device_attribute pci_dev_attrs[]
    __ATTR_RO(class),
    __ATTR_RO(irq),
    __ATTR_RO(local_cpus),
    + __ATTR_RO(local_cpulist),
    __ATTR_RO(modalias),
    #ifdef CONFIG_NUMA
    __ATTR_RO(numa_node),
    --- linux-2.6.x86.sched.orig/drivers/pci/probe.c
    +++ linux-2.6.x86.sched/drivers/pci/probe.c
    @@ -82,6 +82,7 @@ void pci_remove_legacy_files(struct pci_
    * PCI Bus Class Devices
    */
    static ssize_t pci_bus_show_cpuaffinity(struct device *dev,
    + int type,
    struct device_attribute *attr,
    char *buf)
    {
    @@ -89,12 +90,30 @@ static ssize_t pci_bus_show_cpuaffinity(
    cpumask_t cpumask;

    cpumask = pcibus_to_cpumask(to_pci_bus(dev));
    - ret = cpumask_scnprintf(buf, PAGE_SIZE, cpumask);
    - if (ret < PAGE_SIZE)
    - buf[ret++] = '\n';
    + ret = type?
    + cpulist_scnprintf(buf, PAGE_SIZE-2, cpumask):
    + cpumask_scnprintf(buf, PAGE_SIZE-2, cpumask);
    + buf[ret++] = '\n';
    + buf[ret] = '\0';
    return ret;
    }
    -DEVICE_ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpuaffinity, NULL);
    +
    +static ssize_t inline pci_bus_show_cpumaskaffinity(struct device *dev,
    + struct device_attribute *attr,
    + char *buf)
    +{
    + return pci_bus_show_cpuaffinity(dev, 0, attr, buf);
    +}
    +
    +static ssize_t inline pci_bus_show_cpulistaffinity(struct device *dev,
    + struct device_attribute *attr,
    + char *buf)
    +{
    + return pci_bus_show_cpuaffinity(dev, 1, attr, buf);
    +}
    +
    +DEVICE_ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpumaskaffinity, NULL);
    +DEVICE_ATTR(cpulistaffinity, S_IRUGO, pci_bus_show_cpulistaffinity, NULL);

    /*
    * PCI Bus Class
    --- linux-2.6.x86.sched.orig/kernel/cpuset.c
    +++ linux-2.6.x86.sched/kernel/cpuset.c
    @@ -2369,8 +2369,16 @@ void cpuset_task_status_allowed(struct s
    m->count += cpumask_scnprintf(m->buf + m->count, m->size - m->count,
    task->cpus_allowed);
    seq_printf(m, "\n");
    + seq_printf(m, "Cpus_allowed_list:\t");
    + m->count += cpulist_scnprintf(m->buf + m->count, m->size - m->count,
    + task->cpus_allowed);
    + seq_printf(m, "\n");
    seq_printf(m, "Mems_allowed:\t");
    m->count += nodemask_scnprintf(m->buf + m->count, m->size - m->count,
    task->mems_allowed);
    seq_printf(m, "\n");
    + seq_printf(m, "Mems_allowed_list:\t");
    + m->count += nodelist_scnprintf(m->buf + m->count, m->size - m->count,
    + task->mems_allowed);
    + seq_printf(m, "\n");
    }
    --- linux-2.6.x86.sched.orig/kernel/sched_stats.h
    +++ linux-2.6.x86.sched/kernel/sched_stats.h
    @@ -9,6 +9,11 @@
    static int show_schedstat(struct seq_file *seq, void *v)
    {
    int cpu;
    + int mask_len = NR_CPUS/32 * 9;
    + char *mask_str = kmalloc(mask_len, GFP_KERNEL);
    +
    + if (mask_str == NULL)
    + return -ENOMEM;

    seq_printf(seq, "version %d\n", SCHEDSTAT_VERSION);
    seq_printf(seq, "timestamp %lu\n", jiffies);
    @@ -36,9 +41,8 @@ static int show_schedstat(struct seq_fil
    preempt_disable();
    for_each_domain(cpu, sd) {
    enum cpu_idle_type itype;
    - char mask_str[NR_CPUS];

    - cpumask_scnprintf(mask_str, NR_CPUS, sd->span);
    + cpumask_scnprintf(mask_str, mask_len, sd->span);
    seq_printf(seq, "domain%d %s", dcount++, mask_str);
    for (itype = CPU_IDLE; itype < CPU_MAX_IDLE_TYPES;
    itype++) {

    --
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  3. [PATCH 1/3] x86: modify show_shared_cpu_map in intel_cacheinfo v3

    * Removed kmalloc (or local array) in show_shared_cpu_map().

    * Added show_shared_cpu_list() function.

    Based on:
    git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    + x86/latest .../x86/linux-2.6-x86.git
    + sched-devel/latest .../mingo/linux-2.6-sched-devel.git

    Signed-off-by: Mike Travis
    ---
    v3:
    Removed cpus_scnprintf() and all references.
    v2:
    Renamed cpuset_scnprintf() to cpus_scnprintf to avoid confusion with
    "cpusets", and changed the other names to match.
    ---
    arch/x86/kernel/cpu/intel_cacheinfo.c | 30 +++++++++++++++++++++++-------
    1 file changed, 23 insertions(+), 7 deletions(-)

    --- linux-2.6.x86.sched.orig/arch/x86/kernel/cpu/intel_cacheinfo.c
    +++ linux-2.6.x86.sched/arch/x86/kernel/cpu/intel_cacheinfo.c
    @@ -591,20 +591,34 @@ static ssize_t show_size(struct _cpuid4_
    return sprintf (buf, "%luK\n", this_leaf->size / 1024);
    }

    -static ssize_t show_shared_cpu_map(struct _cpuid4_info *this_leaf, char *buf)
    +static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf,
    + int type, char *buf)
    {
    + ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf;
    int n = 0;
    - int len = cpumask_scnprintf_len(nr_cpu_ids);
    - char *mask_str = kmalloc(len, GFP_KERNEL);

    - if (mask_str) {
    - cpumask_scnprintf(mask_str, len, this_leaf->shared_cpu_map);
    - n = sprintf(buf, "%s\n", mask_str);
    - kfree(mask_str);
    + if (len > 1) {
    + cpumask_t *mask = &this_leaf->shared_cpu_map;
    +
    + n = type?
    + cpulist_scnprintf(buf, len-2, *mask):
    + cpumask_scnprintf(buf, len-2, *mask);
    + buf[n++] = '\n';
    + buf[n] = '\0';
    }
    return n;
    }

    +static inline ssize_t show_shared_cpu_map(struct _cpuid4_info *leaf, char *buf)
    +{
    + return show_shared_cpu_map_func(leaf, 0, buf);
    +}
    +
    +static inline ssize_t show_shared_cpu_list(struct _cpuid4_info *leaf, char *buf)
    +{
    + return show_shared_cpu_map_func(leaf, 1, buf);
    +}
    +
    static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf) {
    switch(this_leaf->eax.split.type) {
    case CACHE_TYPE_DATA:
    @@ -640,6 +654,7 @@ define_one_ro(ways_of_associativity);
    define_one_ro(number_of_sets);
    define_one_ro(size);
    define_one_ro(shared_cpu_map);
    +define_one_ro(shared_cpu_list);

    static struct attribute * default_attrs[] = {
    &type.attr,
    @@ -650,6 +665,7 @@ static struct attribute * default_attrs[
    &number_of_sets.attr,
    &size.attr,
    &shared_cpu_map.attr,
    + &shared_cpu_list.attr,
    NULL
    };


    --
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  4. [PATCH 3/3] cpumask: add show cpu map functions v2

    * Add cpu_sysdev_class functions to display the following maps
    with cpulist_scnprintf().

    cpu_online_map
    cpu_present_map
    cpu_possible_map
    cpu_system_map

    * Small change to include/linux/sysdev.h to allow the attribute
    name and label to be different (to avoid collision with the
    "attr_online" entry for bringing cpus on- and off-line.)

    Based on:
    git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    + x86/latest .../x86/linux-2.6-x86.git
    + sched-devel/latest .../mingo/linux-2.6-sched-devel.git

    # x86
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: H. Peter Anvin

    Signed-off-by: Mike Travis
    ---
    v2:
    Removed cpus_scnprintf() and all references.
    ---
    drivers/base/cpu.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++
    include/linux/sysdev.h | 17 ++++++++++------
    2 files changed, 61 insertions(+), 6 deletions(-)

    --- linux-2.6.x86.sched.orig/drivers/base/cpu.c
    +++ linux-2.6.x86.sched/drivers/base/cpu.c
    @@ -103,6 +103,53 @@ static SYSDEV_ATTR(crash_notes, 0400, sh
    #endif

    /*
    + * Print cpu online, possible, present, and system maps
    + */
    +static ssize_t print_cpus_map(char *buf, cpumask_t *map)
    +{
    + int n = cpulist_scnprintf(buf, PAGE_SIZE-2, *map);
    +
    + buf[n++] = '\n';
    + buf[n] = '\0';
    + return n;
    +}
    +
    +#define print_cpus_func(type) \
    +static ssize_t print_cpus_##type(struct sysdev_class *class, char *buf) \
    +{ \
    + return print_cpus_map(buf, &cpu_##type##_map); \
    +} \
    +struct sysdev_class_attribute attr_##type##_map = \
    + _SYSDEV_CLASS_ATTR(type, 0444, print_cpus_##type, NULL)
    +
    +print_cpus_func(online);
    +print_cpus_func(possible);
    +print_cpus_func(present);
    +print_cpus_func(system);
    +
    +struct sysdev_class_attribute *cpu_state_attr[] = {
    + &attr_online_map,
    + &attr_possible_map,
    + &attr_present_map,
    + &attr_system_map,
    +};
    +
    +static int cpu_states_init(void)
    +{
    + int i;
    + int err = 0;
    +
    + for (i = 0; i < ARRAY_SIZE(cpu_state_attr); i++) {
    + int ret;
    + ret = sysdev_class_create_file(&cpu_sysdev_class,
    + cpu_state_attr[i]);
    + if (!err)
    + err = ret;
    + }
    + return err;
    +}
    +
    +/*
    * register_cpu - Setup a sysfs device for a CPU.
    * @cpu - cpu->hotpluggable field set to 1 will generate a control file in
    * sysfs for this CPU.
    @@ -147,6 +194,9 @@ int __init cpu_dev_init(void)
    int err;

    err = sysdev_class_register(&cpu_sysdev_class);
    + if (!err)
    + err = cpu_states_init();
    +
    #if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT)
    if (!err)
    err = sched_create_sysfs_power_savings_entries(&cpu_sysdev_class);
    --- linux-2.6.x86.sched.orig/include/linux/sysdev.h
    +++ linux-2.6.x86.sched/include/linux/sysdev.h
    @@ -45,12 +45,16 @@ struct sysdev_class_attribute {
    ssize_t (*store)(struct sysdev_class *, const char *, size_t);
    };

    -#define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \
    -struct sysdev_class_attribute attr_##_name = { \
    +#define _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \
    +{ \
    .attr = {.name = __stringify(_name), .mode = _mode }, \
    .show = _show, \
    .store = _store, \
    -};
    +}
    +
    +#define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \
    + struct sysdev_class_attribute attr_##_name = \
    + _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store)


    extern int sysdev_class_register(struct sysdev_class *);
    @@ -100,15 +104,16 @@ struct sysdev_attribute {
    };


    -#define _SYSDEV_ATTR(_name,_mode,_show,_store) \
    +#define _SYSDEV_ATTR(_name, _mode, _show, _store) \
    { \
    .attr = { .name = __stringify(_name), .mode = _mode }, \
    .show = _show, \
    .store = _store, \
    }

    -#define SYSDEV_ATTR(_name,_mode,_show,_store) \
    -struct sysdev_attribute attr_##_name = _SYSDEV_ATTR(_name,_mode,_show,_store);
    +#define SYSDEV_ATTR(_name, _mode, _show, _store) \
    + struct sysdev_attribute attr_##_name = \
    + _SYSDEV_ATTR(_name, _mode, _show, _store);

    extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *);
    extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *);

    --
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  5. Re: [PATCH 1/3] x86: modify show_shared_cpu_map in intel_cacheinfo v3

    On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    > --- linux-2.6.x86.sched.orig/arch/x86/kernel/cpu/intel_cacheinfo.c
    > +++ linux-2.6.x86.sched/arch/x86/kernel/cpu/intel_cacheinfo.c
    > @@ -591,20 +591,34 @@ static ssize_t show_size(struct _cpuid4_
    > return sprintf (buf, "%luK\n", this_leaf->size / 1024);
    > }
    >
    > -static ssize_t show_shared_cpu_map(struct _cpuid4_info *this_leaf, char *buf)
    > +static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf,
    > + int type, char *buf)

    I don't know if this is more efficient or better or cleaner, but how
    about to pass the function pointer (ie. cpulist_scnprintf or
    cpumap_scnprintf)? You safe at least one condition.

    > + n = type?
    > + cpulist_scnprintf(buf, len-2, *mask):
    > + cpumask_scnprintf(buf, len-2, *mask);


    Thanks.
    Bert
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  6. Re: [PATCH 0/3] x86: add cpus_scnprintf function v3

    On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    >
    > * Cleanup usages of cpumask_scprintf in the following files and add
    > another interface to use cpulist_scnprintf where appropriate.

    Great. Sometimes the simplest solution needs the longest way. ;-)

    Thanks.
    Bert
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  7. Re: [PATCH 3/3] cpumask: add show cpu map functions v2

    On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    > * Add cpu_sysdev_class functions to display the following maps
    > with cpulist_scnprintf().
    >

    Could we add a cpumap_scnprintf() attribute too, just for consistency?

    Bert
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  8. Re: [PATCH 2/3] cpumask: use new cpus_scnprintf function v3

    On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    > --- linux-2.6.x86.sched.orig/drivers/base/node.c
    > +++ linux-2.6.x86.sched/drivers/base/node.c
    > @@ -19,22 +19,34 @@ static struct sysdev_class node_class =
    > };
    >
    >
    > -static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
    > +static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)
    > {
    > struct node *node_dev = to_node(dev);
    > node_to_cpumask_ptr(mask, node_dev->sysdev.id);
    > int len;
    >
    > - /* 2004/06/03: buf currently PAGE_SIZE, need > 1 char per 4 bits. */
    > - BUILD_BUG_ON(MAX_NUMNODES/4 > PAGE_SIZE/2);
    > + /* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */
    > + BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1));

    Is this right, that you switch from MAX_NUMNODES to NR_CPUS?

    Regards
    Bert
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  9. Re: [PATCH 1/3] x86: modify show_shared_cpu_map in intel_cacheinfo v3

    Bert Wesarg wrote:
    > On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    >> --- linux-2.6.x86.sched.orig/arch/x86/kernel/cpu/intel_cacheinfo.c
    >> +++ linux-2.6.x86.sched/arch/x86/kernel/cpu/intel_cacheinfo.c
    >> @@ -591,20 +591,34 @@ static ssize_t show_size(struct _cpuid4_
    >> return sprintf (buf, "%luK\n", this_leaf->size / 1024);
    >> }
    >>
    >> -static ssize_t show_shared_cpu_map(struct _cpuid4_info *this_leaf, char *buf)
    >> +static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf,
    >> + int type, char *buf)

    > I don't know if this is more efficient or better or cleaner, but how
    > about to pass the function pointer (ie. cpulist_scnprintf or
    > cpumap_scnprintf)? You safe at least one condition.
    >
    >> + n = type?
    >> + cpulist_scnprintf(buf, len-2, *mask):
    >> + cpumask_scnprintf(buf, len-2, *mask);

    >
    > Thanks.
    > Bert


    I have to subvert the cpumask interface a bit, but the resultant
    code size is about 7 instructions smaller.

    static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf,
    int (*cpumap_func)(char *, int, const cpumask_t *, int),
    char *buf)
    {
    ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf;
    int n = 0;

    if (len > 1) {
    cpumask_t *mask = &this_leaf->shared_cpu_map;
    n = cpumap_func(buf, len-2, mask, NR_CPUS);
    buf[n++] = '\n';
    buf[n] = '\0';
    }
    return n;
    }

    static inline ssize_t show_shared_cpu_map(struct _cpuid4_info *leaf, char *buf)
    {
    return show_shared_cpu_map_func(leaf, &__cpumask_scnprintf, buf);
    }

    static inline ssize_t show_shared_cpu_list(struct _cpuid4_info *leaf, char *buf)
    {
    return show_shared_cpu_map_func(leaf, &__cpulist_scnprintf, buf);
    }

    Btw, you were asking about how to determine NR_CPUS. Here's one way:

    root@newton:~# cat /sys/devices/system/cpu/online
    0-2,4-7
    root@newton:~# cat /sys/devices/system/cpu/possible
    0-511
    root@newton:~# cat /sys/devices/system/cpu/present
    0-7
    root@newton:~# cat /sys/devices/system/cpu/system
    0-4095

    Thanks,
    Mike
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  10. Re: [PATCH 2/3] cpumask: use new cpus_scnprintf function v3

    Bert Wesarg wrote:
    > On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    >> --- linux-2.6.x86.sched.orig/drivers/base/node.c
    >> +++ linux-2.6.x86.sched/drivers/base/node.c
    >> @@ -19,22 +19,34 @@ static struct sysdev_class node_class =
    >> };
    >>
    >>
    >> -static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
    >> +static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)
    >> {
    >> struct node *node_dev = to_node(dev);
    >> node_to_cpumask_ptr(mask, node_dev->sysdev.id);
    >> int len;
    >>
    >> - /* 2004/06/03: buf currently PAGE_SIZE, need > 1 char per 4 bits. */
    >> - BUILD_BUG_ON(MAX_NUMNODES/4 > PAGE_SIZE/2);
    >> + /* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */
    >> + BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1));

    > Is this right, that you switch from MAX_NUMNODES to NR_CPUS?
    >
    > Regards
    > Bert


    It's printing the number of cpus on a node, so the number of nodes is not
    important, it's how many cpus can fit on the head of a node... ;-)

    Thanks,
    Mike
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  11. Re: [PATCH 0/3] x86: add cpus_scnprintf function v3

    Bert Wesarg wrote:
    > On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    >> * Cleanup usages of cpumask_scprintf in the following files and add
    >> another interface to use cpulist_scnprintf where appropriate.

    > Great. Sometimes the simplest solution needs the longest way. ;-)
    >
    > Thanks.
    > Bert


    I agree though sometimes "acceptance" is the hardest part... ;-)

    Thanks,
    Mike
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  12. Re: [PATCH 3/3] cpumask: add show cpu map functions v2

    Bert Wesarg wrote:
    > On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    >> * Add cpu_sysdev_class functions to display the following maps
    >> with cpulist_scnprintf().
    >>

    > Could we add a cpumap_scnprintf() attribute too, just for consistency?
    >
    > Bert


    Sure, I could add it. But by not having it, the user is forced to
    actually read libbitmask(3) to see a different way of parsing the
    output, perhaps weaning them off of cpumask_scnprintf()... ;-)

    Do you mind if I add them as:

    /sys/devices/system/cpu/online_map
    /sys/devices/system/cpu/possible_map
    /sys/devices/system/cpu/present_map
    /sys/devices/system/cpu/system_map

    Thanks,
    Mike
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  13. Re: [PATCH 0/3] x86: add cpus_scnprintf function v3


    * Mike Travis wrote:

    > * Add cpu_sysdev_class functions to display the
    >
    > * Cleanup usages of cpumask_scprintf in the following files and add
    > another interface to use cpulist_scnprintf where appropriate.


    thanks Mike, applied.

    Ingo
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  14. Re: [PATCH 2/3] cpumask: use new cpus_scnprintf function v3

    On Tue, Apr 8, 2008 at 10:46 PM, Mike Travis wrote:
    >
    > Bert Wesarg wrote:
    > > On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    > >> --- linux-2.6.x86.sched.orig/drivers/base/node.c
    > >> +++ linux-2.6.x86.sched/drivers/base/node.c
    > >> @@ -19,22 +19,34 @@ static struct sysdev_class node_class =
    > >> };
    > >>
    > >>
    > >> -static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
    > >> +static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)
    > >> {
    > >> struct node *node_dev = to_node(dev);
    > >> node_to_cpumask_ptr(mask, node_dev->sysdev.id);
    > >> int len;
    > >>
    > >> - /* 2004/06/03: buf currently PAGE_SIZE, need > 1 char per 4 bits. */
    > >> - BUILD_BUG_ON(MAX_NUMNODES/4 > PAGE_SIZE/2);
    > >> + /* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */
    > >> + BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1));

    > > Is this right, that you switch from MAX_NUMNODES to NR_CPUS?
    > >
    > > Regards
    > > Bert

    >
    > It's printing the number of cpus on a node, so the number of nodes is not
    > important, it's how many cpus can fit on the head of a node... ;-)

    Ahh, the old code was Just Plain Wrong.

    Thanks.
    Bert
    >
    > Thanks,
    > Mike
    >

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  15. Re: [PATCH 3/3] cpumask: add show cpu map functions v2

    On Tue, Apr 8, 2008 at 10:52 PM, Mike Travis wrote:
    >
    > Bert Wesarg wrote:
    > > On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    > >> * Add cpu_sysdev_class functions to display the following maps
    > >> with cpulist_scnprintf().
    > >>

    > > Could we add a cpumap_scnprintf() attribute too, just for consistency?
    > >
    > > Bert

    >
    > Sure, I could add it. But by not having it, the user is forced to
    > actually read libbitmask(3) to see a different way of parsing the
    > output, perhaps weaning them off of cpumask_scnprintf()... ;-)
    >
    > Do you mind if I add them as:
    >
    > /sys/devices/system/cpu/online_map
    > /sys/devices/system/cpu/possible_map
    > /sys/devices/system/cpu/present_map
    > /sys/devices/system/cpu/system_map

    Please go ahead.

    Bert

    PS: this is the only source I found for the libbitmask(3):

    ftp://ftp.cvut.cz/kernel/people/chri.../ray-mmigrate/

    but I suspect there is a more official place for this.

    >
    > Thanks,
    > Mike
    >

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  16. Re: [PATCH 0/3] x86: add cpus_scnprintf function v3

    On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    > * Cleanup usages of cpumask_scprintf in the following files and add
    > another interface to use cpulist_scnprintf where appropriate.


    On Mon, Apr 7, 2008 at 8:22 PM, Mike Travis wrote:
    > Part of the change is readability, but also looking towards the future
    > of 16k/64k/??? # of cpus, the straight mask approach will overflow the
    > PAGE_SIZE buffer provided (though some pathological cases will overflow
    > the range method as well.) So we'll need some advancement in the format
    > of the printout.


    Btw, I think you can now push for a deprecation of the 'old' mask
    attributes, with the justification you have given above. The other
    possibility is to change sysfs to provide bigger attribute buffers
    (CCed Greg for this).

    Bert
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  17. Re: [PATCH 0/3] x86: add cpus_scnprintf function v3

    On Wed, Apr 09, 2008 at 07:51:23PM +0200, Bert Wesarg wrote:
    > On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    > > * Cleanup usages of cpumask_scprintf in the following files and add
    > > another interface to use cpulist_scnprintf where appropriate.

    >
    > On Mon, Apr 7, 2008 at 8:22 PM, Mike Travis wrote:
    > > Part of the change is readability, but also looking towards the future
    > > of 16k/64k/??? # of cpus, the straight mask approach will overflow the
    > > PAGE_SIZE buffer provided (though some pathological cases will overflow
    > > the range method as well.) So we'll need some advancement in the format
    > > of the printout.

    >
    > Btw, I think you can now push for a deprecation of the 'old' mask
    > attributes, with the justification you have given above. The other
    > possibility is to change sysfs to provide bigger attribute buffers
    > (CCed Greg for this).


    Huh?

    sysfs is "one value per file", if you are getting close to PAGE_SIZE in
    any sysfs file, then you are doing something very wrong.

    What sysfs file currently is trying to output data this big?

    thanks,

    greg k-h
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  18. Re: [PATCH 0/3] x86: add cpus_scnprintf function v3

    On Wed, Apr 9, 2008 at 10:39 PM, Greg KH wrote:
    >
    > On Wed, Apr 09, 2008 at 07:51:23PM +0200, Bert Wesarg wrote:
    > > On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    > > > * Cleanup usages of cpumask_scprintf in the following files and add
    > > > another interface to use cpulist_scnprintf where appropriate.

    > >
    > > On Mon, Apr 7, 2008 at 8:22 PM, Mike Travis wrote:
    > > > Part of the change is readability, but also looking towards the future
    > > > of 16k/64k/??? # of cpus, the straight mask approach will overflow the
    > > > PAGE_SIZE buffer provided (though some pathological cases will overflow
    > > > the range method as well.) So we'll need some advancement in the format
    > > > of the printout.

    > >
    > > Btw, I think you can now push for a deprecation of the 'old' mask
    > > attributes, with the justification you have given above. The other
    > > possibility is to change sysfs to provide bigger attribute buffers
    > > (CCed Greg for this).

    >
    > Huh?
    >
    > sysfs is "one value per file", if you are getting close to PAGE_SIZE in
    > any sysfs file, then you are doing something very wrong.
    >
    > What sysfs file currently is trying to output data this big?

    Currently none. But if NR_CPUS >= 16K and PAGE_SIZE == 4K, than any
    file with an cpumask_scnprintf().

    Thanks,
    Bert
    >
    > thanks,
    >
    > greg k-h
    >

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  19. Re: [PATCH 0/3] x86: add cpus_scnprintf function v3

    On Wed, Apr 9, 2008 at 10:59 PM, Mike Travis wrote:
    > Btw, where does one value per file come from? I see outputs like:
    >
    > # cat /proc/self/stat
    > 4313 (cat) R 4218 4313 4218 34816 4313 4194304 207 0 0 0 0 0 0 0 20 0 1 0 6802916 5672960 131 18446744073709551615 4194304 4212948 140735962676160 18446744073709551615 140499600349840 0 0 0 0 0 0 0 17 3 0 0 0 0 0

    This isn't sysfs.

    Bert
    >
    > Thanks,
    > Mike
    >

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  20. Re: [PATCH 0/3] x86: add cpus_scnprintf function v3

    Greg KH wrote:
    > On Wed, Apr 09, 2008 at 07:51:23PM +0200, Bert Wesarg wrote:
    >> On Tue, Apr 8, 2008 at 8:43 PM, Mike Travis wrote:
    >>> * Cleanup usages of cpumask_scprintf in the following files and add
    >>> another interface to use cpulist_scnprintf where appropriate.

    >> On Mon, Apr 7, 2008 at 8:22 PM, Mike Travis wrote:
    >>> Part of the change is readability, but also looking towards the future
    >>> of 16k/64k/??? # of cpus, the straight mask approach will overflow the
    >>> PAGE_SIZE buffer provided (though some pathological cases will overflow
    >>> the range method as well.) So we'll need some advancement in the format
    >>> of the printout.

    >> Btw, I think you can now push for a deprecation of the 'old' mask
    >> attributes, with the justification you have given above. The other
    >> possibility is to change sysfs to provide bigger attribute buffers
    >> (CCed Greg for this).

    >
    > Huh?
    >
    > sysfs is "one value per file", if you are getting close to PAGE_SIZE in
    > any sysfs file, then you are doing something very wrong.
    >
    > What sysfs file currently is trying to output data this big?
    >
    > thanks,
    >
    > greg k-h


    Hi Greg,

    There's none at the moment. The increase is coming from printing the
    cpuset for various attributes, like cpus on a node, etc. Since it uses
    cpumask_scnprintf(), this prints a bit map representing a cpumask_t.

    With the increase to 4096 cpus, this string is now 1152 bytes long. The
    next iteration will have 16384 cpus which will need 4608 bytes to fully
    display, overflowing a standard page. I've added alternate interfaces
    that use cpulist_scnprintf() which has the advantage of collapsing the
    bits into ranges. This though can result in a much larger output size
    if, for example only every other bit is set.

    Btw, where does one value per file come from? I see outputs like:

    # cat /proc/self/stat
    4313 (cat) R 4218 4313 4218 34816 4313 4194304 207 0 0 0 0 0 0 0 20 0 1 0 6802916 5672960 131 18446744073709551615 4194304 4212948 140735962676160 18446744073709551615 140499600349840 0 0 0 0 0 0 0 17 3 0 0 0 0 0

    Thanks,
    Mike
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread
Page 1 of 3 1 2 3 LastLast