lkml.org 
[lkml]   [2014]   [Dec]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH 2/5] hwrng: core - Fix current_rng init/cleanup race yet again
    Date
    Herbert Xu <herbert@gondor.apana.org.au> writes:
    > The kref solution is still buggy because we were only focusing
    > on the register/unregister race. The same race affects the
    > setting of current_rng through sysfs.
    >
    > This patch fixes it by using kref_get_unless_zero.
    >
    > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

    This patch scares me a little!

    I'll have to pull the tree to review it properly, but the theory was
    that the reference count was counting users of the rng. Now I don't
    know what it's counting:

    > static inline int hwrng_init(struct hwrng *rng)
    > {
    > + if (kref_get_unless_zero(&rng->ref))
    > + goto skip_init;
    > +
    > if (rng->init) {
    > int ret;

    OK, so this skip_init branch is triggered when the rng is being
    shut down as it's no longer current_rng?

    > +
    > + kref_init(&rng->ref);
    > + reinit_completion(&rng->cleanup_done);
    > +
    > +skip_init:
    > add_early_randomness(rng);

    Then we use it to add randomness?

    >
    > current_quality = rng->quality ? : default_quality;
    > @@ -467,6 +474,9 @@ int hwrng_register(struct hwrng *rng)
    > goto out_unlock;
    > }
    >
    > + init_completion(&rng->cleanup_done);
    > + complete(&rng->cleanup_done);
    > +

    This code smells very bad.

    Cheers,
    Rusty.


    \
     
     \ /
      Last update: 2014-12-26 01:41    [W:4.419 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site