@@ -227,7 +227,6 @@ dpusmph_init(struct module *module, const dpusm_pf_t *funcs)
227
227
dpusmph -> module = module ;
228
228
dpusmph -> funcs = funcs ;
229
229
dpusmph -> self = dpusmph ;
230
- atomic_set (& dpusmph -> refs , 0 );
231
230
}
232
231
233
232
return dpusmph ;
@@ -301,8 +300,10 @@ dpusm_provider_unregister_handle(dpusm_t *dpusm, dpusm_ph_t **provider) {
301
300
}
302
301
303
302
int rc = 0 ;
304
- const int refs = atomic_read (& (* provider )-> refs );
305
- if (refs ) {
303
+
304
+ /* have to add 1 because module_exit subtracts 1 before entering provider exit */
305
+ const int refs = module_refcount ((* provider )-> module ) + 1 ;
306
+ if (refs > 0 ) {
306
307
printk ("%s: Unregistering provider \"%s\" with %d references remaining.\n" ,
307
308
__func__ , module_name ((* provider )-> module ), refs );
308
309
rc = - EBUSY ;
@@ -349,17 +350,18 @@ dpusm_provider_get(dpusm_t *dpusm, const char *name) {
349
350
read_lock (& dpusm -> lock );
350
351
dpusm_ph_t * * provider = find_provider (dpusm , name );
351
352
if (provider ) {
353
+ struct module * module = (* provider )-> module ;
354
+
352
355
/* make sure provider can't be unloaded before user */
353
- if (!try_module_get (( * provider ) -> module )) {
356
+ if (!try_module_get (module )) {
354
357
printk ("Error: Could not increment reference count of %s\n" , name );
355
358
return NULL ;
356
359
}
357
360
358
- atomic_inc (& (* provider )-> refs );
359
361
atomic_inc (& dpusm -> active );
360
362
361
363
printk ("%s: User has been given a handle to \"%s\" (%p) (now %d users).\n" ,
362
- __func__ , name , * provider , atomic_read ( & ( * provider ) -> refs ));
364
+ __func__ , name , * provider , module_refcount ( module ));
363
365
364
366
if ((* provider )-> funcs -> at_connect ) {
365
367
(* provider )-> funcs -> at_connect ();
@@ -384,14 +386,13 @@ dpusm_provider_put(dpusm_t *dpusm, void *handle) {
384
386
385
387
struct module * module = (* provider )-> module ;
386
388
387
- if (!atomic_read ( & ( * provider ) -> refs )) {
389
+ if (!module_refcount ( module )) {
388
390
printk ("%s Error: Cannot decrement provider \"%s\" user count already at 0.\n" ,
389
391
__func__ , module_name (module ));
390
392
return DPUSM_ERROR ;
391
393
}
392
394
393
395
module_put (module );
394
- atomic_dec (& (* provider )-> refs );
395
396
atomic_dec (& dpusm -> active );
396
397
397
398
if ((* provider )-> funcs ) { /* provider might have been invalidated */
@@ -401,7 +402,7 @@ dpusm_provider_put(dpusm_t *dpusm, void *handle) {
401
402
}
402
403
403
404
printk ("%s: User has returned a handle to \"%s\" (%p) (now %d users).\n" ,
404
- __func__ , module_name (module ), * provider , atomic_read ( & ( * provider ) -> refs ));
405
+ __func__ , module_name (module ), * provider , module_refcount ( module ));
405
406
return DPUSM_OK ;
406
407
}
407
408
@@ -422,7 +423,7 @@ void dpusm_provider_invalidate(dpusm_t *dpusm, const char *name) {
422
423
(* provider )-> funcs = NULL ;
423
424
memset (& (* provider )-> capabilities , 0 , sizeof ((* provider )-> capabilities ));
424
425
printk ("%s: Provider \"%s\" has been invalidated with %d users active.\n" ,
425
- __func__ , name , atomic_read ( & (* provider )-> refs ));
426
+ __func__ , name , module_refcount ( (* provider )-> module ));
426
427
/* not decrementing module reference count here - provider is still registered */
427
428
}
428
429
else {
0 commit comments