summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/cacheinfo.h
diff options
context:
space:
mode:
authorNathan Lynch <ntl@pobox.com>2008-12-23 19:55:54 +0100
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2009-01-08 06:25:10 +0100
commit93197a36a9c16a85fb24cf5a8639f7bf9af838a3 (patch)
treec8f70ac532dd9fa2d1de142994383c108603499a /arch/powerpc/kernel/cacheinfo.h
parentpowerpc/iseries: Kexec is known not to work on iseries (diff)
downloadlinux-93197a36a9c16a85fb24cf5a8639f7bf9af838a3.tar.xz
linux-93197a36a9c16a85fb24cf5a8639f7bf9af838a3.zip
powerpc: Rewrite sysfs processor cache info code
The current code for providing processor cache information in sysfs has the following deficiencies: - several complex functions that are hard to understand - implicit recursion (cache_desc_release -> kobject_put -> cache_desc_release) - explicit recursion (create_cache_index_info) - use of two per-cpu arrays when one would suffice - duplication of work on systems where CPUs share cache Also, when I looked at implementing support for a shared_cpu_map attribute, it was pretty much impossible to handle hotplug without checking every single online CPU's cache_desc list and fixing things up... not that this is a hot path, but it would have introduced O(n^2)-ish behavior during boot. Addressing this involved rethinking the core data structures used, which didn't lend itself to an incremental approach. This implementation maintains a "forest" (potentially more than one tree) of cache objects which reflects the system's cache topology. Cache objects are instantiated as needed as CPUs come online. A per-cpu array is used mainly for sysfs-related bookkeeping; the objects in the array just point to the appropriate points in the forest. This maintains compatibility with the existing code and includes some enhancements: - Implement the shared_cpu_map attribute, which is essential for enabling userspace to discover the system's overall cache topology. - Use cache-block-size properties if cache-line-size is not available. I chose to place this implementation in a new file since it would have roughly doubled the size of sysfs.c, which is already kind of messy. Signed-off-by: Nathan Lynch <ntl@pobox.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/cacheinfo.h')
-rw-r--r--arch/powerpc/kernel/cacheinfo.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/cacheinfo.h b/arch/powerpc/kernel/cacheinfo.h
new file mode 100644
index 000000000000..a7b74d36acd7
--- /dev/null
+++ b/arch/powerpc/kernel/cacheinfo.h
@@ -0,0 +1,8 @@
+#ifndef _PPC_CACHEINFO_H
+#define _PPC_CACHEINFO_H
+
+/* These are just hooks for sysfs.c to use. */
+extern void cacheinfo_cpu_online(unsigned int cpu_id);
+extern void cacheinfo_cpu_offline(unsigned int cpu_id);
+
+#endif /* _PPC_CACHEINFO_H */