On Wed, Nov 12, 2014 at 02:11:23PM +1030, Rusty Russell wrote: > Amos Kong <akong@xxxxxxxxxx> writes: > > From: Rusty Russell <rusty@xxxxxxxxxxxxxxx> > > > > current_rng holds one reference, and we bump it every time we want > > to do a read from it. > > > > This means we only hold the rng_mutex to grab or drop a reference, > > so accessing /sys/devices/virtual/misc/hw_random/rng_current doesn't > > block on read of /dev/hwrng. > > > > Using a kref is overkill (we're always under the rng_mutex), but > > a standard pattern. > > > > This also solves the problem that the hwrng_fillfn thread was > > accessing current_rng without a lock, which could change (eg. to NULL) > > underneath it. > > > > v4: decrease last reference for triggering the cleanup > > This doesn't make any sense: > > > +static void drop_current_rng(void) > > +{ > > + struct hwrng *rng = current_rng; > > + > > + BUG_ON(!mutex_is_locked(&rng_mutex)); > > + if (!current_rng) > > + return; > > + > > + /* release current_rng reference */ > > + kref_put(¤t_rng->ref, cleanup_rng); > > + current_rng = NULL; > > + > > + /* decrease last reference for triggering the cleanup */ > > + kref_put(&rng->ref, cleanup_rng); > > +} > > Why would it drop the refcount twice? This doesn't make sense. > > Hmm, because you added kref_init, which initializes the reference count > to 1, you created this bug. I saw some kernel code uses kref_* helper functions, the reference conter is initialized to 1. Some code didn't use the helper functions to increase/decrease the reference counter. So I will drop kref_init() and the second kref_put(). > Leave out the kref_init, and let it naturally be 0 (until, and if, it > becomes current_rng). Add a comment if you want. OK, thanks. > Thanks, > Rusty. > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Amos.
Attachment:
signature.asc
Description: Digital signature
_______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization