We can be more clever than that and merge the 2 list walking loops.
It's all under the one mutex critical section anyway, so nothing funny
can happen.

Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
---
 drivers/gpu/drm/drm_mode_config.c | 28 +++++++++++-----------------
 1 file changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/drm_mode_config.c 
b/drivers/gpu/drm/drm_mode_config.c
index 64c2971478db..a6205a92dfee 100644
--- a/drivers/gpu/drm/drm_mode_config.c
+++ b/drivers/gpu/drm/drm_mode_config.c
@@ -84,7 +84,6 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
                          struct drm_file *file_priv)
 {
        struct drm_mode_card_res *card_res = data;
-       struct list_head *lh;
        struct drm_framebuffer *fb;
        struct drm_connector *connector;
        struct drm_crtc *crtc;
@@ -105,25 +104,20 @@ int drm_mode_getresources(struct drm_device *dev, void 
*data,


        mutex_lock(&file_priv->fbs_lock);
-       /*
-        * For the non-control nodes we need to limit the list of resources
-        * by IDs in the group list for this node
-        */
-       list_for_each(lh, &file_priv->fbs)
-               fb_count++;
-
        /* handle this in 4 parts */
        /* FBs */
-       if (card_res->count_fbs >= fb_count) {
-               copied = 0;
-               fb_id = (uint32_t __user *)(unsigned long)card_res->fb_id_ptr;
-               list_for_each_entry(fb, &file_priv->fbs, filp_head) {
-                       if (put_user(fb->base.id, fb_id + copied)) {
-                               mutex_unlock(&file_priv->fbs_lock);
-                               return -EFAULT;
-                       }
-                       copied++;
+       copied = 0;
+       fb_id = (uint32_t __user *)(unsigned long)card_res->fb_id_ptr;
+       list_for_each_entry(fb, &file_priv->fbs, filp_head) {
+               fb_count++;
+               if (fb_count > card_res->count_fbs)
+                       continue;
+
+               if (put_user(fb->base.id, fb_id + copied)) {
+                       mutex_unlock(&file_priv->fbs_lock);
+                       return -EFAULT;
                }
+               copied++;
        }
        card_res->count_fbs = fb_count;
        mutex_unlock(&file_priv->fbs_lock);
-- 
2.10.2

Reply via email to