@@ -67,73 +67,51 @@ void devl_unlock(struct devlink *devlink)
6767}
6868EXPORT_SYMBOL_GPL (devl_unlock );
6969
70+ /**
71+ * devlink_try_get() - try to obtain a reference on a devlink instance
72+ * @devlink: instance to reference
73+ *
74+ * Obtain a reference on a devlink instance. A reference on a devlink instance
75+ * only implies that it's safe to take the instance lock. It does not imply
76+ * that the instance is registered, use devl_is_registered() after taking
77+ * the instance lock to check registration status.
78+ */
7079struct devlink * __must_check devlink_try_get (struct devlink * devlink )
7180{
7281 if (refcount_inc_not_zero (& devlink -> refcount ))
7382 return devlink ;
7483 return NULL ;
7584}
7685
77- static void __devlink_put_rcu (struct rcu_head * head )
78- {
79- struct devlink * devlink = container_of (head , struct devlink , rcu );
80-
81- complete (& devlink -> comp );
82- }
83-
8486void devlink_put (struct devlink * devlink )
8587{
8688 if (refcount_dec_and_test (& devlink -> refcount ))
87- /* Make sure unregister operation that may await the completion
88- * is unblocked only after all users are after the end of
89- * RCU grace period.
90- */
91- call_rcu (& devlink -> rcu , __devlink_put_rcu );
89+ kfree_rcu (devlink , rcu );
9290}
9391
94- struct devlink *
95- devlinks_xa_find_get (struct net * net , unsigned long * indexp ,
96- void * (* xa_find_fn )(struct xarray * , unsigned long * ,
97- unsigned long , xa_mark_t ))
92+ struct devlink * devlinks_xa_find_get (struct net * net , unsigned long * indexp )
9893{
99- struct devlink * devlink ;
94+ struct devlink * devlink = NULL ;
10095
10196 rcu_read_lock ();
10297retry :
103- devlink = xa_find_fn (& devlinks , indexp , ULONG_MAX , DEVLINK_REGISTERED );
98+ devlink = xa_find (& devlinks , indexp , ULONG_MAX , DEVLINK_REGISTERED );
10499 if (!devlink )
105100 goto unlock ;
106101
107- /* In case devlink_unregister() was already called and "unregistering"
108- * mark was set, do not allow to get a devlink reference here.
109- * This prevents live-lock of devlink_unregister() wait for completion.
110- */
111- if (xa_get_mark (& devlinks , * indexp , DEVLINK_UNREGISTERING ))
112- goto retry ;
113-
114- /* For a possible retry, the xa_find_after() should be always used */
115- xa_find_fn = xa_find_after ;
116102 if (!devlink_try_get (devlink ))
117- goto retry ;
103+ goto next ;
118104 if (!net_eq (devlink_net (devlink ), net )) {
119105 devlink_put (devlink );
120- goto retry ;
106+ goto next ;
121107 }
122108unlock :
123109 rcu_read_unlock ();
124110 return devlink ;
125- }
126111
127- struct devlink *
128- devlinks_xa_find_get_first (struct net * net , unsigned long * indexp )
129- {
130- return devlinks_xa_find_get (net , indexp , xa_find );
131- }
132-
133- struct devlink *
134- devlinks_xa_find_get_next (struct net * net , unsigned long * indexp )
135- {
136- return devlinks_xa_find_get (net , indexp , xa_find_after );
112+ next :
113+ (* indexp )++ ;
114+ goto retry ;
137115}
138116
139117/**
@@ -147,46 +125,55 @@ devlinks_xa_find_get_next(struct net *net, unsigned long *indexp)
147125 */
148126void devlink_set_features (struct devlink * devlink , u64 features )
149127{
150- ASSERT_DEVLINK_NOT_REGISTERED (devlink );
151-
152128 WARN_ON (features & DEVLINK_F_RELOAD &&
153129 !devlink_reload_supported (devlink -> ops ));
154130 devlink -> features = features ;
155131}
156132EXPORT_SYMBOL_GPL (devlink_set_features );
157133
158134/**
159- * devlink_register - Register devlink instance
160- *
161- * @devlink: devlink
135+ * devl_register - Register devlink instance
136+ * @devlink: devlink
162137 */
163- void devlink_register (struct devlink * devlink )
138+ int devl_register (struct devlink * devlink )
164139{
165140 ASSERT_DEVLINK_NOT_REGISTERED (devlink );
166- /* Make sure that we are in .probe() routine */
141+ devl_assert_locked ( devlink );
167142
168143 xa_set_mark (& devlinks , devlink -> index , DEVLINK_REGISTERED );
169144 devlink_notify_register (devlink );
145+
146+ return 0 ;
147+ }
148+ EXPORT_SYMBOL_GPL (devl_register );
149+
150+ void devlink_register (struct devlink * devlink )
151+ {
152+ devl_lock (devlink );
153+ devl_register (devlink );
154+ devl_unlock (devlink );
170155}
171156EXPORT_SYMBOL_GPL (devlink_register );
172157
173158/**
174- * devlink_unregister - Unregister devlink instance
175- *
176- * @devlink: devlink
159+ * devl_unregister - Unregister devlink instance
160+ * @devlink: devlink
177161 */
178- void devlink_unregister (struct devlink * devlink )
162+ void devl_unregister (struct devlink * devlink )
179163{
180164 ASSERT_DEVLINK_REGISTERED (devlink );
181- /* Make sure that we are in .remove() routine */
182-
183- xa_set_mark (& devlinks , devlink -> index , DEVLINK_UNREGISTERING );
184- devlink_put (devlink );
185- wait_for_completion (& devlink -> comp );
165+ devl_assert_locked (devlink );
186166
187167 devlink_notify_unregister (devlink );
188168 xa_clear_mark (& devlinks , devlink -> index , DEVLINK_REGISTERED );
189- xa_clear_mark (& devlinks , devlink -> index , DEVLINK_UNREGISTERING );
169+ }
170+ EXPORT_SYMBOL_GPL (devl_unregister );
171+
172+ void devlink_unregister (struct devlink * devlink )
173+ {
174+ devl_lock (devlink );
175+ devl_unregister (devlink );
176+ devl_unlock (devlink );
190177}
191178EXPORT_SYMBOL_GPL (devlink_unregister );
192179
@@ -250,7 +237,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
250237 mutex_init (& devlink -> reporters_lock );
251238 mutex_init (& devlink -> linecards_lock );
252239 refcount_set (& devlink -> refcount , 1 );
253- init_completion (& devlink -> comp );
254240
255241 return devlink ;
256242
@@ -296,7 +282,7 @@ void devlink_free(struct devlink *devlink)
296282
297283 xa_erase (& devlinks , devlink -> index );
298284
299- kfree (devlink );
285+ devlink_put (devlink );
300286}
301287EXPORT_SYMBOL_GPL (devlink_free );
302288
@@ -312,15 +298,18 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net)
312298 */
313299 devlinks_xa_for_each_registered_get (net , index , devlink ) {
314300 WARN_ON (!(devlink -> features & DEVLINK_F_RELOAD ));
315- mutex_lock (& devlink -> lock );
316- err = devlink_reload (devlink , & init_net ,
317- DEVLINK_RELOAD_ACTION_DRIVER_REINIT ,
318- DEVLINK_RELOAD_LIMIT_UNSPEC ,
319- & actions_performed , NULL );
320- mutex_unlock (& devlink -> lock );
301+ devl_lock (devlink );
302+ err = 0 ;
303+ if (devl_is_registered (devlink ))
304+ err = devlink_reload (devlink , & init_net ,
305+ DEVLINK_RELOAD_ACTION_DRIVER_REINIT ,
306+ DEVLINK_RELOAD_LIMIT_UNSPEC ,
307+ & actions_performed , NULL );
308+ devl_unlock (devlink );
309+ devlink_put (devlink );
310+
321311 if (err && err != - EOPNOTSUPP )
322312 pr_warn ("Failed to reload devlink instance into init_net\n" );
323- devlink_put (devlink );
324313 }
325314}
326315
0 commit comments