Skip to content

Commit c36a325

Browse files
committed
drm: Convert all helpers to drm_connector_list_iter
Mostly nothing special (except making sure that really all error paths and friends call iter_put). v2: Don't forget the raw connector_list walking in drm_helper_move_panel_connectors_to_head. That one unfortunately can't be converted to the iterator helpers, but since it's just some list splicing best to just wrap the entire thing up in one critical section. v3: Bail out after iter_put (Harry). Cc: Harry Wentland <[email protected]> Reviewed-by: Harry Wentland <[email protected]> Reviewed-by: Sean Paul <[email protected]> Signed-off-by: Daniel Vetter <[email protected]> Link: http://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 613051d commit c36a325

File tree

6 files changed

+92
-33
lines changed

6 files changed

+92
-33
lines changed

drivers/gpu/drm/drm_atomic_helper.c

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,10 @@ static int handle_conflicting_encoders(struct drm_atomic_state *state,
9494
{
9595
struct drm_connector_state *conn_state;
9696
struct drm_connector *connector;
97+
struct drm_connector_list_iter conn_iter;
9798
struct drm_encoder *encoder;
9899
unsigned encoder_mask = 0;
99-
int i, ret;
100+
int i, ret = 0;
100101

101102
/*
102103
* First loop, find all newly assigned encoders from the connectors
@@ -144,7 +145,8 @@ static int handle_conflicting_encoders(struct drm_atomic_state *state,
144145
* and the crtc is disabled if no encoder is left. This preserves
145146
* compatibility with the legacy set_config behavior.
146147
*/
147-
drm_for_each_connector(connector, state->dev) {
148+
drm_connector_list_iter_get(state->dev, &conn_iter);
149+
drm_for_each_connector_iter(connector, &conn_iter) {
148150
struct drm_crtc_state *crtc_state;
149151

150152
if (drm_atomic_get_existing_connector_state(state, connector))
@@ -160,12 +162,15 @@ static int handle_conflicting_encoders(struct drm_atomic_state *state,
160162
connector->state->crtc->base.id,
161163
connector->state->crtc->name,
162164
connector->base.id, connector->name);
163-
return -EINVAL;
165+
ret = -EINVAL;
166+
goto out;
164167
}
165168

166169
conn_state = drm_atomic_get_connector_state(state, connector);
167-
if (IS_ERR(conn_state))
168-
return PTR_ERR(conn_state);
170+
if (IS_ERR(conn_state)) {
171+
ret = PTR_ERR(conn_state);
172+
goto out;
173+
}
169174

170175
DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], disabling [CONNECTOR:%d:%s]\n",
171176
encoder->base.id, encoder->name,
@@ -176,19 +181,21 @@ static int handle_conflicting_encoders(struct drm_atomic_state *state,
176181

177182
ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
178183
if (ret)
179-
return ret;
184+
goto out;
180185

181186
if (!crtc_state->connector_mask) {
182187
ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
183188
NULL);
184189
if (ret < 0)
185-
return ret;
190+
goto out;
186191

187192
crtc_state->active = false;
188193
}
189194
}
195+
out:
196+
drm_connector_list_iter_put(&conn_iter);
190197

191-
return 0;
198+
return ret;
192199
}
193200

194201
static void
@@ -2442,6 +2449,7 @@ int drm_atomic_helper_disable_all(struct drm_device *dev,
24422449
{
24432450
struct drm_atomic_state *state;
24442451
struct drm_connector *conn;
2452+
struct drm_connector_list_iter conn_iter;
24452453
int err;
24462454

24472455
state = drm_atomic_state_alloc(dev);
@@ -2450,7 +2458,8 @@ int drm_atomic_helper_disable_all(struct drm_device *dev,
24502458

24512459
state->acquire_ctx = ctx;
24522460

2453-
drm_for_each_connector(conn, dev) {
2461+
drm_connector_list_iter_get(dev, &conn_iter);
2462+
drm_for_each_connector_iter(conn, &conn_iter) {
24542463
struct drm_crtc *crtc = conn->state->crtc;
24552464
struct drm_crtc_state *crtc_state;
24562465

@@ -2468,6 +2477,7 @@ int drm_atomic_helper_disable_all(struct drm_device *dev,
24682477

24692478
err = drm_atomic_commit(state);
24702479
free:
2480+
drm_connector_list_iter_put(&conn_iter);
24712481
drm_atomic_state_put(state);
24722482
return err;
24732483
}
@@ -2840,6 +2850,7 @@ int drm_atomic_helper_connector_dpms(struct drm_connector *connector,
28402850
struct drm_crtc_state *crtc_state;
28412851
struct drm_crtc *crtc;
28422852
struct drm_connector *tmp_connector;
2853+
struct drm_connector_list_iter conn_iter;
28432854
int ret;
28442855
bool active = false;
28452856
int old_mode = connector->dpms;
@@ -2867,7 +2878,8 @@ int drm_atomic_helper_connector_dpms(struct drm_connector *connector,
28672878

28682879
WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
28692880

2870-
drm_for_each_connector(tmp_connector, connector->dev) {
2881+
drm_connector_list_iter_get(connector->dev, &conn_iter);
2882+
drm_for_each_connector_iter(tmp_connector, &conn_iter) {
28712883
if (tmp_connector->state->crtc != crtc)
28722884
continue;
28732885

@@ -2876,6 +2888,7 @@ int drm_atomic_helper_connector_dpms(struct drm_connector *connector,
28762888
break;
28772889
}
28782890
}
2891+
drm_connector_list_iter_put(&conn_iter);
28792892
crtc_state->active = active;
28802893

28812894
ret = drm_atomic_commit(state);
@@ -3253,6 +3266,7 @@ drm_atomic_helper_duplicate_state(struct drm_device *dev,
32533266
{
32543267
struct drm_atomic_state *state;
32553268
struct drm_connector *conn;
3269+
struct drm_connector_list_iter conn_iter;
32563270
struct drm_plane *plane;
32573271
struct drm_crtc *crtc;
32583272
int err = 0;
@@ -3283,15 +3297,18 @@ drm_atomic_helper_duplicate_state(struct drm_device *dev,
32833297
}
32843298
}
32853299

3286-
drm_for_each_connector(conn, dev) {
3300+
drm_connector_list_iter_get(dev, &conn_iter);
3301+
drm_for_each_connector_iter(conn, &conn_iter) {
32873302
struct drm_connector_state *conn_state;
32883303

32893304
conn_state = drm_atomic_get_connector_state(state, conn);
32903305
if (IS_ERR(conn_state)) {
32913306
err = PTR_ERR(conn_state);
3307+
drm_connector_list_iter_put(&conn_iter);
32923308
goto free;
32933309
}
32943310
}
3311+
drm_connector_list_iter_put(&conn_iter);
32953312

32963313
/* clear the acquire context so that it isn't accidentally reused */
32973314
state->acquire_ctx = NULL;

drivers/gpu/drm/drm_crtc_helper.c

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
bool drm_helper_encoder_in_use(struct drm_encoder *encoder)
9090
{
9191
struct drm_connector *connector;
92+
struct drm_connector_list_iter conn_iter;
9293
struct drm_device *dev = encoder->dev;
9394

9495
/*
@@ -100,9 +101,15 @@ bool drm_helper_encoder_in_use(struct drm_encoder *encoder)
100101
WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
101102
}
102103

103-
drm_for_each_connector(connector, dev)
104-
if (connector->encoder == encoder)
104+
105+
drm_connector_list_iter_get(dev, &conn_iter);
106+
drm_for_each_connector_iter(connector, &conn_iter) {
107+
if (connector->encoder == encoder) {
108+
drm_connector_list_iter_put(&conn_iter);
105109
return true;
110+
}
111+
}
112+
drm_connector_list_iter_put(&conn_iter);
106113
return false;
107114
}
108115
EXPORT_SYMBOL(drm_helper_encoder_in_use);
@@ -437,10 +444,13 @@ drm_crtc_helper_disable(struct drm_crtc *crtc)
437444

438445
/* Decouple all encoders and their attached connectors from this crtc */
439446
drm_for_each_encoder(encoder, dev) {
447+
struct drm_connector_list_iter conn_iter;
448+
440449
if (encoder->crtc != crtc)
441450
continue;
442451

443-
drm_for_each_connector(connector, dev) {
452+
drm_connector_list_iter_get(dev, &conn_iter);
453+
drm_for_each_connector_iter(connector, &conn_iter) {
444454
if (connector->encoder != encoder)
445455
continue;
446456

@@ -457,6 +467,7 @@ drm_crtc_helper_disable(struct drm_crtc *crtc)
457467
/* we keep a reference while the encoder is bound */
458468
drm_connector_unreference(connector);
459469
}
470+
drm_connector_list_iter_put(&conn_iter);
460471
}
461472

462473
__drm_helper_disable_unused_functions(dev);
@@ -508,6 +519,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
508519
bool mode_changed = false; /* if true do a full mode set */
509520
bool fb_changed = false; /* if true and !mode_changed just do a flip */
510521
struct drm_connector *connector;
522+
struct drm_connector_list_iter conn_iter;
511523
int count = 0, ro, fail = 0;
512524
const struct drm_crtc_helper_funcs *crtc_funcs;
513525
struct drm_mode_set save_set;
@@ -572,9 +584,10 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
572584
}
573585

574586
count = 0;
575-
drm_for_each_connector(connector, dev) {
587+
drm_connector_list_iter_get(dev, &conn_iter);
588+
drm_for_each_connector_iter(connector, &conn_iter)
576589
save_connector_encoders[count++] = connector->encoder;
577-
}
590+
drm_connector_list_iter_put(&conn_iter);
578591

579592
save_set.crtc = set->crtc;
580593
save_set.mode = &set->crtc->mode;
@@ -616,7 +629,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
616629

617630
/* a) traverse passed in connector list and get encoders for them */
618631
count = 0;
619-
drm_for_each_connector(connector, dev) {
632+
drm_connector_list_iter_get(dev, &conn_iter);
633+
drm_for_each_connector_iter(connector, &conn_iter) {
620634
const struct drm_connector_helper_funcs *connector_funcs =
621635
connector->helper_private;
622636
new_encoder = connector->encoder;
@@ -649,14 +663,16 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
649663
connector->encoder = new_encoder;
650664
}
651665
}
666+
drm_connector_list_iter_put(&conn_iter);
652667

653668
if (fail) {
654669
ret = -EINVAL;
655670
goto fail;
656671
}
657672

658673
count = 0;
659-
drm_for_each_connector(connector, dev) {
674+
drm_connector_list_iter_get(dev, &conn_iter);
675+
drm_for_each_connector_iter(connector, &conn_iter) {
660676
if (!connector->encoder)
661677
continue;
662678

@@ -674,6 +690,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
674690
if (new_crtc &&
675691
!drm_encoder_crtc_ok(connector->encoder, new_crtc)) {
676692
ret = -EINVAL;
693+
drm_connector_list_iter_put(&conn_iter);
677694
goto fail;
678695
}
679696
if (new_crtc != connector->encoder->crtc) {
@@ -690,6 +707,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
690707
connector->base.id, connector->name);
691708
}
692709
}
710+
drm_connector_list_iter_put(&conn_iter);
693711

694712
/* mode_set_base is not a required function */
695713
if (fb_changed && !crtc_funcs->mode_set_base)
@@ -744,9 +762,10 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
744762
}
745763

746764
count = 0;
747-
drm_for_each_connector(connector, dev) {
765+
drm_connector_list_iter_get(dev, &conn_iter);
766+
drm_for_each_connector_iter(connector, &conn_iter)
748767
connector->encoder = save_connector_encoders[count++];
749-
}
768+
drm_connector_list_iter_put(&conn_iter);
750769

751770
/* after fail drop reference on all unbound connectors in set, let
752771
* bound connectors keep their reference
@@ -773,12 +792,16 @@ static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder)
773792
{
774793
int dpms = DRM_MODE_DPMS_OFF;
775794
struct drm_connector *connector;
795+
struct drm_connector_list_iter conn_iter;
776796
struct drm_device *dev = encoder->dev;
777797

778-
drm_for_each_connector(connector, dev)
798+
drm_connector_list_iter_get(dev, &conn_iter);
799+
drm_for_each_connector_iter(connector, &conn_iter)
779800
if (connector->encoder == encoder)
780801
if (connector->dpms < dpms)
781802
dpms = connector->dpms;
803+
drm_connector_list_iter_put(&conn_iter);
804+
782805
return dpms;
783806
}
784807

@@ -810,12 +833,16 @@ static int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc)
810833
{
811834
int dpms = DRM_MODE_DPMS_OFF;
812835
struct drm_connector *connector;
836+
struct drm_connector_list_iter conn_iter;
813837
struct drm_device *dev = crtc->dev;
814838

815-
drm_for_each_connector(connector, dev)
839+
drm_connector_list_iter_get(dev, &conn_iter);
840+
drm_for_each_connector_iter(connector, &conn_iter)
816841
if (connector->encoder && connector->encoder->crtc == crtc)
817842
if (connector->dpms < dpms)
818843
dpms = connector->dpms;
844+
drm_connector_list_iter_put(&conn_iter);
845+
819846
return dpms;
820847
}
821848

drivers/gpu/drm/drm_fb_helper.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,20 +120,22 @@ int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
120120
{
121121
struct drm_device *dev = fb_helper->dev;
122122
struct drm_connector *connector;
123-
int i, ret;
123+
struct drm_connector_list_iter conn_iter;
124+
int i, ret = 0;
124125

125126
if (!drm_fbdev_emulation)
126127
return 0;
127128

128129
mutex_lock(&dev->mode_config.mutex);
129-
drm_for_each_connector(connector, dev) {
130+
drm_connector_list_iter_get(dev, &conn_iter);
131+
drm_for_each_connector_iter(connector, &conn_iter) {
130132
ret = drm_fb_helper_add_one_connector(fb_helper, connector);
131133

132134
if (ret)
133135
goto fail;
134136
}
135-
mutex_unlock(&dev->mode_config.mutex);
136-
return 0;
137+
goto out;
138+
137139
fail:
138140
drm_fb_helper_for_each_connector(fb_helper, i) {
139141
struct drm_fb_helper_connector *fb_helper_connector =
@@ -145,6 +147,8 @@ int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
145147
fb_helper->connector_info[i] = NULL;
146148
}
147149
fb_helper->connector_count = 0;
150+
out:
151+
drm_connector_list_iter_put(&conn_iter);
148152
mutex_unlock(&dev->mode_config.mutex);
149153

150154
return ret;

drivers/gpu/drm/drm_modeset_helper.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ void drm_helper_move_panel_connectors_to_head(struct drm_device *dev)
4848

4949
INIT_LIST_HEAD(&panel_list);
5050

51+
spin_lock_irq(&dev->mode_config.connector_list_lock);
5152
list_for_each_entry_safe(connector, tmp,
5253
&dev->mode_config.connector_list, head) {
5354
if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
@@ -57,6 +58,7 @@ void drm_helper_move_panel_connectors_to_head(struct drm_device *dev)
5758
}
5859

5960
list_splice(&panel_list, &dev->mode_config.connector_list);
61+
spin_unlock_irq(&dev->mode_config.connector_list_lock);
6062
}
6163
EXPORT_SYMBOL(drm_helper_move_panel_connectors_to_head);
6264

drivers/gpu/drm/drm_plane_helper.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ static int get_connectors_for_crtc(struct drm_crtc *crtc,
7575
{
7676
struct drm_device *dev = crtc->dev;
7777
struct drm_connector *connector;
78+
struct drm_connector_list_iter conn_iter;
7879
int count = 0;
7980

8081
/*
@@ -84,14 +85,16 @@ static int get_connectors_for_crtc(struct drm_crtc *crtc,
8485
*/
8586
WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
8687

87-
drm_for_each_connector(connector, dev) {
88+
drm_connector_list_iter_get(dev, &conn_iter);
89+
drm_for_each_connector_iter(connector, &conn_iter) {
8890
if (connector->encoder && connector->encoder->crtc == crtc) {
8991
if (connector_list != NULL && count < num_connectors)
9092
*(connector_list++) = connector;
9193

9294
count++;
9395
}
9496
}
97+
drm_connector_list_iter_put(&conn_iter);
9598

9699
return count;
97100
}

0 commit comments

Comments
 (0)