Commit 159ef31e authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

device.h: reorganize struct device

struct device is big, around 760 bytes on x86_64.  It's not a critical
structure, but it is embedded everywhere, so making it smaller is always
a good thing.

With a recent patch that moved a field from struct device to the private
structure, some benchmarks showed a very odd regression, despite this
structure having nothing to do with those benchmarks.  That caused me to
look into the layout of the structure.  Using 'pahole', it showed a
number of holes and ways that the structure could be reordered in order
to align some cachelines better, as well as reduce the size of the
overall structure.

Move 'struct kobj' to the start of the structure, to keep that access
in the first cacheline, and try to organize things a bit more compactly
where possible

By doing these few moves, the result removes at least 8 bytes from
'struct device' on a 64bit system.  Given we know there are systems with
at least 30k devices in memory at once, every little byte counts, and
this change could be a savings of 240k of kernel memory for them.  On
"normal" systems the overall memory savings would be much less.

Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Cc: Johan Hovold <johan@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 79a3aaa7
...@@ -976,18 +976,14 @@ struct dev_links_info { ...@@ -976,18 +976,14 @@ struct dev_links_info {
* a higher-level representation of the device. * a higher-level representation of the device.
*/ */
struct device { struct device {
struct kobject kobj;
struct device *parent; struct device *parent;
struct device_private *p; struct device_private *p;
struct kobject kobj;
const char *init_name; /* initial name of the device */ const char *init_name; /* initial name of the device */
const struct device_type *type; const struct device_type *type;
struct mutex mutex; /* mutex to synchronize calls to
* its driver.
*/
struct bus_type *bus; /* type of bus device is on */ struct bus_type *bus; /* type of bus device is on */
struct device_driver *driver; /* which driver has allocated this struct device_driver *driver; /* which driver has allocated this
device */ device */
...@@ -995,6 +991,10 @@ struct device { ...@@ -995,6 +991,10 @@ struct device {
core doesn't touch it */ core doesn't touch it */
void *driver_data; /* Driver data, set and get with void *driver_data; /* Driver data, set and get with
dev_set_drvdata/dev_get_drvdata */ dev_set_drvdata/dev_get_drvdata */
struct mutex mutex; /* mutex to synchronize calls to
* its driver.
*/
struct dev_links_info links; struct dev_links_info links;
struct dev_pm_info power; struct dev_pm_info power;
struct dev_pm_domain *pm_domain; struct dev_pm_domain *pm_domain;
...@@ -1009,9 +1009,6 @@ struct device { ...@@ -1009,9 +1009,6 @@ struct device {
struct list_head msi_list; struct list_head msi_list;
#endif #endif
#ifdef CONFIG_NUMA
int numa_node; /* NUMA node this device is close to */
#endif
const struct dma_map_ops *dma_ops; const struct dma_map_ops *dma_ops;
u64 *dma_mask; /* dma mask (if dma'able device) */ u64 *dma_mask; /* dma mask (if dma'able device) */
u64 coherent_dma_mask;/* Like dma_mask, but for u64 coherent_dma_mask;/* Like dma_mask, but for
...@@ -1040,6 +1037,9 @@ struct device { ...@@ -1040,6 +1037,9 @@ struct device {
struct device_node *of_node; /* associated device tree node */ struct device_node *of_node; /* associated device tree node */
struct fwnode_handle *fwnode; /* firmware device node */ struct fwnode_handle *fwnode; /* firmware device node */
#ifdef CONFIG_NUMA
int numa_node; /* NUMA node this device is close to */
#endif
dev_t devt; /* dev_t, creates the sysfs "dev" */ dev_t devt; /* dev_t, creates the sysfs "dev" */
u32 id; /* device instance */ u32 id; /* device instance */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment