Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934010AbcLHBaP (ORCPT ); Wed, 7 Dec 2016 20:30:15 -0500 Received: from mail-wj0-f175.google.com ([209.85.210.175]:36228 "EHLO mail-wj0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932372AbcLHBaM (ORCPT ); Wed, 7 Dec 2016 20:30:12 -0500 From: Rasmus Villemoes To: Tejun Heo , Andrew Morton Cc: linux-kernel@vger.kernel.org, Lai Jiangshan , Jens Axboe , Greg Kroah-Hartman , Rasmus Villemoes , dri-devel@lists.freedesktop.org Subject: [RFC 09/10] drm: use simpler id allocator Date: Thu, 8 Dec 2016 02:23:04 +0100 Message-Id: <1481160187-9652-10-git-send-email-linux@rasmusvillemoes.dk> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1481160187-9652-1-git-send-email-linux@rasmusvillemoes.dk> References: <1481160187-9652-1-git-send-email-linux@rasmusvillemoes.dk> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4902 Lines: 143 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 --- 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 #include #include +#include #include #include #include @@ -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