From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ilija Hadzic Subject: [PATCH 12/19] drm: allocate correct id_list size for a render node Date: Thu, 12 Apr 2012 14:19:37 -0400 Message-ID: <1334254784-3200-13-git-send-email-ihadzic@research.bell-labs.com> References: <1334254784-3200-1-git-send-email-ihadzic@research.bell-labs.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from ihemail2.lucent.com (ihemail2.lucent.com [135.245.0.35]) by gabe.freedesktop.org (Postfix) with ESMTP id 69561A0A3D for ; Thu, 12 Apr 2012 11:21:32 -0700 (PDT) Received: from usnavsmail1.ndc.alcatel-lucent.com (usnavsmail1.ndc.alcatel-lucent.com [135.3.39.9]) by ihemail2.lucent.com (8.13.8/IER-o) with ESMTP id q3CILVt1006988 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 12 Apr 2012 13:21:31 -0500 (CDT) Received: from umail.lucent.com (umail-ce2.ndc.lucent.com [135.3.40.63]) by usnavsmail1.ndc.alcatel-lucent.com (8.14.3/8.14.3/GMO) with ESMTP id q3CILVHx004089 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Thu, 12 Apr 2012 13:21:31 -0500 In-Reply-To: <1334254784-3200-1-git-send-email-ihadzic@research.bell-labs.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org When a new render node is created, the number of elements of id_list allocated in drm_mode_group_init function should not be the sum of all CRTCs, encoders, and connectors that the device has, but the one specified by the ioctl that created the node. v2: - add planes Signed-off-by: Ilija Hadzic --- drivers/gpu/drm/drm_crtc.c | 18 ++++++++---------- drivers/gpu/drm/drm_stub.c | 7 +++---- include/drm/drm_crtc.h | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 4fc7c5f..78f2b96 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -933,15 +933,8 @@ void drm_mode_config_init(struct drm_device *dev) } EXPORT_SYMBOL(drm_mode_config_init); -int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group) +int drm_mode_group_init(struct drm_mode_group *group, int total_objects) { - uint32_t total_objects = 0; - - total_objects += dev->mode_config.num_crtc; - total_objects += dev->mode_config.num_connector; - total_objects += dev->mode_config.num_encoder; - total_objects += dev->mode_config.num_plane; - group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL); if (!group->id_list) return -ENOMEM; @@ -961,9 +954,14 @@ int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_encoder *encoder; struct drm_connector *connector; struct drm_plane *plane; - int ret; + int ret, total_objects; - if ((ret = drm_mode_group_init(dev, group))) + total_objects = dev->mode_config.num_crtc; + total_objects += dev->mode_config.num_connector; + total_objects += dev->mode_config.num_encoder; + total_objects += dev->mode_config.num_plane; + ret = drm_mode_group_init(group, total_objects); + if (ret) return ret; list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 5ebc8bc..93746b7 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c @@ -577,14 +577,13 @@ int drm_render_node_create_ioctl(struct drm_device *dev, void *data, ret = drm_create_render_node(dev, &new_minor); if (ret) return ret; - - ret = drm_mode_group_init(dev, &new_minor->mode_group); + total_ids = args->num_crtc + args->num_encoder + + args->num_connector + args->num_plane; + ret = drm_mode_group_init(&new_minor->mode_group, total_ids); if (ret) goto out_del; ids_ptr = (uint32_t __user *)(unsigned long)args->id_list_ptr; - total_ids = args->num_crtc + args->num_encoder + - args->num_connector + args->num_plane; for (i = 0; i < total_ids; i++) { if (get_user(new_minor->mode_group.id_list[i], &ids_ptr[i])) { ret = -EFAULT; diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 2b9d062..939fed1 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -851,7 +851,7 @@ extern char *drm_get_dvi_i_select_name(int val); extern char *drm_get_tv_subconnector_name(int val); extern char *drm_get_tv_select_name(int val); extern void drm_fb_release(struct drm_file *file_priv); -extern int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group); +extern int drm_mode_group_init(struct drm_mode_group *group, int total_objects); extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group); extern struct edid *drm_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter); -- 1.7.8.5