diff options
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/cpu/intel_cacheinfo.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index e073a93ceb42..26d615dcb149 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
@@ -591,20 +591,34 @@ static ssize_t show_size(struct _cpuid4_info *this_leaf, char *buf) | |||
591 | return sprintf (buf, "%luK\n", this_leaf->size / 1024); | 591 | return sprintf (buf, "%luK\n", this_leaf->size / 1024); |
592 | } | 592 | } |
593 | 593 | ||
594 | static ssize_t show_shared_cpu_map(struct _cpuid4_info *this_leaf, char *buf) | 594 | static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf, |
595 | int type, char *buf) | ||
595 | { | 596 | { |
597 | ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf; | ||
596 | int n = 0; | 598 | int n = 0; |
597 | int len = cpumask_scnprintf_len(nr_cpu_ids); | ||
598 | char *mask_str = kmalloc(len, GFP_KERNEL); | ||
599 | 599 | ||
600 | if (mask_str) { | 600 | if (len > 1) { |
601 | cpumask_scnprintf(mask_str, len, this_leaf->shared_cpu_map); | 601 | cpumask_t *mask = &this_leaf->shared_cpu_map; |
602 | n = sprintf(buf, "%s\n", mask_str); | 602 | |
603 | kfree(mask_str); | 603 | n = type? |
604 | cpulist_scnprintf(buf, len-2, *mask): | ||
605 | cpumask_scnprintf(buf, len-2, *mask); | ||
606 | buf[n++] = '\n'; | ||
607 | buf[n] = '\0'; | ||
604 | } | 608 | } |
605 | return n; | 609 | return n; |
606 | } | 610 | } |
607 | 611 | ||
612 | static inline ssize_t show_shared_cpu_map(struct _cpuid4_info *leaf, char *buf) | ||
613 | { | ||
614 | return show_shared_cpu_map_func(leaf, 0, buf); | ||
615 | } | ||
616 | |||
617 | static inline ssize_t show_shared_cpu_list(struct _cpuid4_info *leaf, char *buf) | ||
618 | { | ||
619 | return show_shared_cpu_map_func(leaf, 1, buf); | ||
620 | } | ||
621 | |||
608 | static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf) { | 622 | static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf) { |
609 | switch(this_leaf->eax.split.type) { | 623 | switch(this_leaf->eax.split.type) { |
610 | case CACHE_TYPE_DATA: | 624 | case CACHE_TYPE_DATA: |
@@ -640,6 +654,7 @@ define_one_ro(ways_of_associativity); | |||
640 | define_one_ro(number_of_sets); | 654 | define_one_ro(number_of_sets); |
641 | define_one_ro(size); | 655 | define_one_ro(size); |
642 | define_one_ro(shared_cpu_map); | 656 | define_one_ro(shared_cpu_map); |
657 | define_one_ro(shared_cpu_list); | ||
643 | 658 | ||
644 | static struct attribute * default_attrs[] = { | 659 | static struct attribute * default_attrs[] = { |
645 | &type.attr, | 660 | &type.attr, |
@@ -650,6 +665,7 @@ static struct attribute * default_attrs[] = { | |||
650 | &number_of_sets.attr, | 665 | &number_of_sets.attr, |
651 | &size.attr, | 666 | &size.attr, |
652 | &shared_cpu_map.attr, | 667 | &shared_cpu_map.attr, |
668 | &shared_cpu_list.attr, | ||
653 | NULL | 669 | NULL |
654 | }; | 670 | }; |
655 | 671 | ||