Using the recently introduced "tida" allocator for small integer ids saves about 100 KB of memory on my laptop - every struct ida from which a single id has been allocated uses at least 16 KB of memory due to the pre-allocation/caching of struct idr_layers (each worth a little over 2K). Signed-off-by: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/drm_connector.c | 21 ++++++++++----------- drivers/gpu/drm/drm_crtc.c | 4 ++-- include/drm/drm_crtc.h | 3 ++- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 2db7fb510b6c..70e5f3b84f2a 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -61,7 +61,7 @@ struct drm_conn_prop_enum_list { int type; const char *name; - struct ida ida; + struct tida ida; }; /* @@ -93,7 +93,7 @@ void drm_connector_ida_init(void) int i; for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++) - ida_init(&drm_connector_enum_list[i].ida); + tida_init(&drm_connector_enum_list[i].ida); } void drm_connector_ida_destroy(void) @@ -101,7 +101,7 @@ void drm_connector_ida_destroy(void) int i; for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++) - ida_destroy(&drm_connector_enum_list[i].ida); + tida_destroy(&drm_connector_enum_list[i].ida); } /** @@ -186,7 +186,7 @@ int drm_connector_init(struct drm_device *dev, { struct drm_mode_config *config = &dev->mode_config; int ret; - struct ida *connector_ida = + struct tida *connector_ida = &drm_connector_enum_list[connector_type].ida; drm_modeset_lock_all(dev); @@ -201,7 +201,7 @@ int drm_connector_init(struct drm_device *dev, connector->dev = dev; connector->funcs = funcs; - ret = ida_simple_get(&config->connector_ida, 0, 0, GFP_KERNEL); + ret = tida_get(&config->connector_ida, GFP_KERNEL); if (ret < 0) goto out_put; connector->index = ret; @@ -209,7 +209,7 @@ int drm_connector_init(struct drm_device *dev, connector->connector_type = connector_type; connector->connector_type_id = - ida_simple_get(connector_ida, 1, 0, GFP_KERNEL); + tida_get_above(connector_ida, 1, GFP_KERNEL); if (connector->connector_type_id < 0) { ret = connector->connector_type_id; goto out_put_id; @@ -250,10 +250,10 @@ int drm_connector_init(struct drm_device *dev, connector->debugfs_entry = NULL; out_put_type_id: if (ret) - ida_simple_remove(connector_ida, connector->connector_type_id); + tida_put(connector_ida, connector->connector_type_id); out_put_id: if (ret) - ida_simple_remove(&config->connector_ida, connector->index); + tida_put(&config->connector_ida, connector->index); out_put: if (ret) drm_mode_object_unregister(dev, &connector->base); @@ -341,11 +341,10 @@ void drm_connector_cleanup(struct drm_connector *connector) list_for_each_entry_safe(mode, t, &connector->modes, head) drm_mode_remove(connector, mode); - ida_simple_remove(&drm_connector_enum_list[connector->connector_type].ida, + tida_put(&drm_connector_enum_list[connector->connector_type].ida, connector->connector_type_id); - ida_simple_remove(&dev->mode_config.connector_ida, - connector->index); + tida_put(&dev->mode_config.connector_ida, connector->index); kfree(connector->display_info.bus_formats); drm_mode_object_unregister(dev, &connector->base); diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 2d7bedf28647..c38cda9bdf09 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -1075,7 +1075,7 @@ void drm_mode_config_init(struct drm_device *dev) INIT_LIST_HEAD(&dev->mode_config.plane_list); idr_init(&dev->mode_config.crtc_idr); idr_init(&dev->mode_config.tile_idr); - ida_init(&dev->mode_config.connector_ida); + tida_init(&dev->mode_config.connector_ida); drm_modeset_lock_all(dev); drm_mode_create_standard_properties(dev); @@ -1156,7 +1156,7 @@ void drm_mode_config_cleanup(struct drm_device *dev) drm_framebuffer_free(&fb->base.refcount); } - ida_destroy(&dev->mode_config.connector_ida); + tida_destroy(&dev->mode_config.connector_ida); idr_destroy(&dev->mode_config.tile_idr); idr_destroy(&dev->mode_config.crtc_idr); drm_modeset_lock_fini(&dev->mode_config.connection_mutex); diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 0aa292526567..3f5255b801e2 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -29,6 +29,7 @@ #include <linux/spinlock.h> #include <linux/types.h> #include <linux/idr.h> +#include <linux/tida.h> #include <linux/fb.h> #include <linux/hdmi.h> #include <linux/media-bus-format.h> @@ -1045,7 +1046,7 @@ struct drm_mode_config { /** * @connector_ida: ID allocator for connector indices. */ - struct ida connector_ida; + struct tida connector_ida; /** * @connector_list: List of connector objects. */ -- 2.1.4 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel