@@ -177,6 +177,28 @@ static u32 user_event_key(char *name)
177
177
return jhash (name , strlen (name ), 0 );
178
178
}
179
179
180
+ static struct user_event * user_event_get (struct user_event * user )
181
+ {
182
+ refcount_inc (& user -> refcnt );
183
+
184
+ return user ;
185
+ }
186
+
187
+ static void user_event_put (struct user_event * user , bool locked )
188
+ {
189
+ #ifdef CONFIG_LOCKDEP
190
+ if (locked )
191
+ lockdep_assert_held (& event_mutex );
192
+ else
193
+ lockdep_assert_not_held (& event_mutex );
194
+ #endif
195
+
196
+ if (unlikely (!user ))
197
+ return ;
198
+
199
+ refcount_dec (& user -> refcnt );
200
+ }
201
+
180
202
static void user_event_group_destroy (struct user_event_group * group )
181
203
{
182
204
kfree (group -> system_name );
@@ -228,12 +250,13 @@ static struct user_event_group *user_event_group_create(void)
228
250
return NULL ;
229
251
};
230
252
231
- static void user_event_enabler_destroy (struct user_event_enabler * enabler )
253
+ static void user_event_enabler_destroy (struct user_event_enabler * enabler ,
254
+ bool locked )
232
255
{
233
256
list_del_rcu (& enabler -> mm_enablers_link );
234
257
235
258
/* No longer tracking the event via the enabler */
236
- refcount_dec ( & enabler -> event -> refcnt );
259
+ user_event_put ( enabler -> event , locked );
237
260
238
261
kfree (enabler );
239
262
}
@@ -295,7 +318,7 @@ static void user_event_enabler_fault_fixup(struct work_struct *work)
295
318
296
319
/* User asked for enabler to be removed during fault */
297
320
if (test_bit (ENABLE_VAL_FREEING_BIT , ENABLE_BITOPS (enabler ))) {
298
- user_event_enabler_destroy (enabler );
321
+ user_event_enabler_destroy (enabler , true );
299
322
goto out ;
300
323
}
301
324
@@ -470,14 +493,12 @@ static bool user_event_enabler_dup(struct user_event_enabler *orig,
470
493
if (!enabler )
471
494
return false;
472
495
473
- enabler -> event = orig -> event ;
496
+ enabler -> event = user_event_get ( orig -> event ) ;
474
497
enabler -> addr = orig -> addr ;
475
498
476
499
/* Only dup part of value (ignore future flags, etc) */
477
500
enabler -> values = orig -> values & ENABLE_VAL_DUP_MASK ;
478
501
479
- refcount_inc (& enabler -> event -> refcnt );
480
-
481
502
/* Enablers not exposed yet, RCU not required */
482
503
list_add (& enabler -> mm_enablers_link , & mm -> enablers );
483
504
@@ -594,7 +615,7 @@ static void user_event_mm_destroy(struct user_event_mm *mm)
594
615
struct user_event_enabler * enabler , * next ;
595
616
596
617
list_for_each_entry_safe (enabler , next , & mm -> enablers , mm_enablers_link )
597
- user_event_enabler_destroy (enabler );
618
+ user_event_enabler_destroy (enabler , false );
598
619
599
620
mmdrop (mm -> mm );
600
621
kfree (mm );
@@ -749,7 +770,7 @@ static struct user_event_enabler
749
770
* exit or run exec(), which includes forks and clones.
750
771
*/
751
772
if (!* write_result ) {
752
- refcount_inc ( & enabler -> event -> refcnt );
773
+ user_event_get ( user );
753
774
list_add_rcu (& enabler -> mm_enablers_link , & user_mm -> enablers );
754
775
}
755
776
@@ -1337,10 +1358,8 @@ static struct user_event *find_user_event(struct user_event_group *group,
1337
1358
* outkey = key ;
1338
1359
1339
1360
hash_for_each_possible (group -> register_table , user , node , key )
1340
- if (!strcmp (EVENT_NAME (user ), name )) {
1341
- refcount_inc (& user -> refcnt );
1342
- return user ;
1343
- }
1361
+ if (!strcmp (EVENT_NAME (user ), name ))
1362
+ return user_event_get (user );
1344
1363
1345
1364
return NULL ;
1346
1365
}
@@ -1554,12 +1573,12 @@ static int user_event_reg(struct trace_event_call *call,
1554
1573
1555
1574
return ret ;
1556
1575
inc :
1557
- refcount_inc ( & user -> refcnt );
1576
+ user_event_get ( user );
1558
1577
update_enable_bit_for (user );
1559
1578
return 0 ;
1560
1579
dec :
1561
1580
update_enable_bit_for (user );
1562
- refcount_dec ( & user -> refcnt );
1581
+ user_event_put ( user , true );
1563
1582
return 0 ;
1564
1583
}
1565
1584
@@ -1593,7 +1612,7 @@ static int user_event_create(const char *raw_command)
1593
1612
ret = user_event_parse_cmd (group , name , & user , 0 );
1594
1613
1595
1614
if (!ret )
1596
- refcount_dec ( & user -> refcnt );
1615
+ user_event_put ( user , false );
1597
1616
1598
1617
mutex_unlock (& group -> reg_mutex );
1599
1618
@@ -1794,7 +1813,7 @@ static int user_event_parse(struct user_event_group *group, char *name,
1794
1813
1795
1814
return 0 ;
1796
1815
error :
1797
- refcount_dec ( & user -> refcnt );
1816
+ user_event_put ( user , false );
1798
1817
return ret ;
1799
1818
}
1800
1819
@@ -1883,7 +1902,7 @@ static int delete_user_event(struct user_event_group *group, char *name)
1883
1902
if (!user )
1884
1903
return - ENOENT ;
1885
1904
1886
- refcount_dec ( & user -> refcnt );
1905
+ user_event_put ( user , true );
1887
1906
1888
1907
if (!user_event_last_ref (user ))
1889
1908
return - EBUSY ;
@@ -2042,9 +2061,7 @@ static int user_events_ref_add(struct user_event_file_info *info,
2042
2061
for (i = 0 ; i < count ; ++ i )
2043
2062
new_refs -> events [i ] = refs -> events [i ];
2044
2063
2045
- new_refs -> events [i ] = user ;
2046
-
2047
- refcount_inc (& user -> refcnt );
2064
+ new_refs -> events [i ] = user_event_get (user );
2048
2065
2049
2066
rcu_assign_pointer (info -> refs , new_refs );
2050
2067
@@ -2158,7 +2175,7 @@ static long user_events_ioctl_reg(struct user_event_file_info *info,
2158
2175
ret = user_events_ref_add (info , user );
2159
2176
2160
2177
/* No longer need parse ref, ref_add either worked or not */
2161
- refcount_dec ( & user -> refcnt );
2178
+ user_event_put ( user , false );
2162
2179
2163
2180
/* Positive number is index and valid */
2164
2181
if (ret < 0 )
@@ -2307,7 +2324,7 @@ static long user_events_ioctl_unreg(unsigned long uarg)
2307
2324
set_bit (ENABLE_VAL_FREEING_BIT , ENABLE_BITOPS (enabler ));
2308
2325
2309
2326
if (!test_bit (ENABLE_VAL_FAULTING_BIT , ENABLE_BITOPS (enabler )))
2310
- user_event_enabler_destroy (enabler );
2327
+ user_event_enabler_destroy (enabler , true );
2311
2328
2312
2329
/* Removed at least one */
2313
2330
ret = 0 ;
@@ -2365,7 +2382,6 @@ static int user_events_release(struct inode *node, struct file *file)
2365
2382
struct user_event_file_info * info = file -> private_data ;
2366
2383
struct user_event_group * group ;
2367
2384
struct user_event_refs * refs ;
2368
- struct user_event * user ;
2369
2385
int i ;
2370
2386
2371
2387
if (!info )
@@ -2389,12 +2405,9 @@ static int user_events_release(struct inode *node, struct file *file)
2389
2405
* The underlying user_events are ref counted, and cannot be freed.
2390
2406
* After this decrement, the user_events may be freed elsewhere.
2391
2407
*/
2392
- for (i = 0 ; i < refs -> count ; ++ i ) {
2393
- user = refs -> events [i ];
2408
+ for (i = 0 ; i < refs -> count ; ++ i )
2409
+ user_event_put ( refs -> events [i ], false) ;
2394
2410
2395
- if (user )
2396
- refcount_dec (& user -> refcnt );
2397
- }
2398
2411
out :
2399
2412
file -> private_data = NULL ;
2400
2413
0 commit comments