static void drop_current_rng(void);
 static int hwrng_init(struct hwrng *rng);
-static void hwrng_manage_rngd(struct hwrng *rng);
+static int hwrng_fillfn(void *unused);
 
 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
                               int wait);
        drop_current_rng();
        current_rng = rng;
 
+       /* if necessary, start hwrng thread */
+       if (!hwrng_fill) {
+               hwrng_fill = kthread_run(hwrng_fillfn, NULL, "hwrng");
+               if (IS_ERR(hwrng_fill)) {
+                       pr_err("hwrng_fill thread creation failed\n");
+                       hwrng_fill = NULL;
+               }
+       }
+
        return 0;
 }
 
                rng->quality = 1024;
        current_quality = rng->quality; /* obsolete */
 
-       hwrng_manage_rngd(rng);
-
        return 0;
 }
 
        /* the best available RNG may have changed */
        ret = enable_best_rng();
 
-       /* start/stop rngd if necessary */
-       if (current_rng)
-               hwrng_manage_rngd(current_rng);
-
 out:
        mutex_unlock(&rng_mutex);
        return ret ? ret : len;
 
                put_rng(rng);
 
-               if (!quality)
-                       break;
-
                if (rc <= 0)
                        continue;
 
        return 0;
 }
 
-static void hwrng_manage_rngd(struct hwrng *rng)
-{
-       if (WARN_ON(!mutex_is_locked(&rng_mutex)))
-               return;
-
-       if (rng->quality == 0 && hwrng_fill)
-               kthread_stop(hwrng_fill);
-       if (rng->quality > 0 && !hwrng_fill) {
-               hwrng_fill = kthread_run(hwrng_fillfn, NULL, "hwrng");
-               if (IS_ERR(hwrng_fill)) {
-                       pr_err("hwrng_fill thread creation failed\n");
-                       hwrng_fill = NULL;
-               }
-       }
-}
-
 int hwrng_register(struct hwrng *rng)
 {
        int err = -EINVAL;