diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 78c88673371d7910448970eeb9f3f8c205b869ec..bdf99a30937e53bfb6989ca2ad2c31d42d80d502 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c @@ -1183,7 +1183,12 @@ EXPORT_SYMBOL(ipmi_get_smi_info); static void free_user(struct kref *ref) { struct ipmi_user *user = container_of(ref, struct ipmi_user, refcount); - cleanup_srcu_struct(&user->release_barrier); + + /* + * Cleanup without waiting. This could be called in atomic context. + * Refcount is zero: all read-sections should have been ended. + */ + cleanup_srcu_struct_quiesced(&user->release_barrier); kfree(user); }