virtio-rng.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Randomness driver for virtio
  4. * Copyright (C) 2007, 2008 Rusty Russell IBM Corporation
  5. */
  6. #include <asm/barrier.h>
  7. #include <linux/err.h>
  8. #include <linux/hw_random.h>
  9. #include <linux/scatterlist.h>
  10. #include <linux/spinlock.h>
  11. #include <linux/virtio.h>
  12. #include <linux/virtio_rng.h>
  13. #include <linux/dma-mapping.h>
  14. #include <linux/module.h>
  15. #include <linux/slab.h>
  16. static DEFINE_IDA(rng_index_ida);
  17. struct virtrng_info {
  18. struct hwrng hwrng;
  19. struct virtqueue *vq;
  20. char name[25];
  21. int index;
  22. bool hwrng_register_done;
  23. bool hwrng_removed;
  24. /* data transfer */
  25. struct completion have_data;
  26. unsigned int data_avail;
  27. unsigned int data_idx;
  28. /* minimal size returned by rng_buffer_size() */
  29. __dma_from_device_group_begin();
  30. #if SMP_CACHE_BYTES < 32
  31. u8 data[32];
  32. #else
  33. u8 data[SMP_CACHE_BYTES];
  34. #endif
  35. __dma_from_device_group_end();
  36. };
  37. static void random_recv_done(struct virtqueue *vq)
  38. {
  39. struct virtrng_info *vi = vq->vdev->priv;
  40. unsigned int len;
  41. /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */
  42. if (!virtqueue_get_buf(vi->vq, &len))
  43. return;
  44. smp_store_release(&vi->data_avail, len);
  45. complete(&vi->have_data);
  46. }
  47. static void request_entropy(struct virtrng_info *vi)
  48. {
  49. struct scatterlist sg;
  50. reinit_completion(&vi->have_data);
  51. vi->data_idx = 0;
  52. sg_init_one(&sg, vi->data, sizeof(vi->data));
  53. /* There should always be room for one buffer. */
  54. virtqueue_add_inbuf(vi->vq, &sg, 1, vi->data, GFP_KERNEL);
  55. virtqueue_kick(vi->vq);
  56. }
  57. static unsigned int copy_data(struct virtrng_info *vi, void *buf,
  58. unsigned int size)
  59. {
  60. size = min_t(unsigned int, size, vi->data_avail);
  61. memcpy(buf, vi->data + vi->data_idx, size);
  62. vi->data_idx += size;
  63. vi->data_avail -= size;
  64. if (vi->data_avail == 0)
  65. request_entropy(vi);
  66. return size;
  67. }
  68. static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait)
  69. {
  70. int ret;
  71. struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
  72. unsigned int chunk;
  73. size_t read;
  74. if (vi->hwrng_removed)
  75. return -ENODEV;
  76. read = 0;
  77. /* copy available data */
  78. if (smp_load_acquire(&vi->data_avail)) {
  79. chunk = copy_data(vi, buf, size);
  80. size -= chunk;
  81. read += chunk;
  82. }
  83. if (!wait)
  84. return read;
  85. /* We have already copied available entropy,
  86. * so either size is 0 or data_avail is 0
  87. */
  88. while (size != 0) {
  89. /* data_avail is 0 but a request is pending */
  90. ret = wait_for_completion_killable(&vi->have_data);
  91. if (ret < 0)
  92. return ret;
  93. /* if vi->data_avail is 0, we have been interrupted
  94. * by a cleanup, but buffer stays in the queue
  95. */
  96. if (vi->data_avail == 0)
  97. return read;
  98. chunk = copy_data(vi, buf + read, size);
  99. size -= chunk;
  100. read += chunk;
  101. }
  102. return read;
  103. }
  104. static void virtio_cleanup(struct hwrng *rng)
  105. {
  106. struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
  107. complete(&vi->have_data);
  108. }
  109. static int probe_common(struct virtio_device *vdev)
  110. {
  111. int err, index;
  112. struct virtrng_info *vi = NULL;
  113. vi = kzalloc_obj(struct virtrng_info);
  114. if (!vi)
  115. return -ENOMEM;
  116. vi->index = index = ida_alloc(&rng_index_ida, GFP_KERNEL);
  117. if (index < 0) {
  118. err = index;
  119. goto err_ida;
  120. }
  121. sprintf(vi->name, "virtio_rng.%d", index);
  122. init_completion(&vi->have_data);
  123. vi->hwrng = (struct hwrng) {
  124. .read = virtio_read,
  125. .cleanup = virtio_cleanup,
  126. .priv = (unsigned long)vi,
  127. .name = vi->name,
  128. };
  129. vdev->priv = vi;
  130. /* We expect a single virtqueue. */
  131. vi->vq = virtio_find_single_vq(vdev, random_recv_done, "input");
  132. if (IS_ERR(vi->vq)) {
  133. err = PTR_ERR(vi->vq);
  134. goto err_find;
  135. }
  136. virtio_device_ready(vdev);
  137. /* we always have a pending entropy request */
  138. request_entropy(vi);
  139. return 0;
  140. err_find:
  141. ida_free(&rng_index_ida, index);
  142. err_ida:
  143. kfree(vi);
  144. return err;
  145. }
  146. static void remove_common(struct virtio_device *vdev)
  147. {
  148. struct virtrng_info *vi = vdev->priv;
  149. vi->hwrng_removed = true;
  150. vi->data_avail = 0;
  151. vi->data_idx = 0;
  152. complete(&vi->have_data);
  153. if (vi->hwrng_register_done)
  154. hwrng_unregister(&vi->hwrng);
  155. virtio_reset_device(vdev);
  156. vdev->config->del_vqs(vdev);
  157. ida_free(&rng_index_ida, vi->index);
  158. kfree(vi);
  159. }
  160. static int virtrng_probe(struct virtio_device *vdev)
  161. {
  162. return probe_common(vdev);
  163. }
  164. static void virtrng_remove(struct virtio_device *vdev)
  165. {
  166. remove_common(vdev);
  167. }
  168. static void virtrng_scan(struct virtio_device *vdev)
  169. {
  170. struct virtrng_info *vi = vdev->priv;
  171. int err;
  172. err = hwrng_register(&vi->hwrng);
  173. if (!err)
  174. vi->hwrng_register_done = true;
  175. }
  176. static int virtrng_freeze(struct virtio_device *vdev)
  177. {
  178. remove_common(vdev);
  179. return 0;
  180. }
  181. static int virtrng_restore(struct virtio_device *vdev)
  182. {
  183. int err;
  184. err = probe_common(vdev);
  185. if (!err) {
  186. struct virtrng_info *vi = vdev->priv;
  187. /*
  188. * Set hwrng_removed to ensure that virtio_read()
  189. * does not block waiting for data before the
  190. * registration is complete.
  191. */
  192. vi->hwrng_removed = true;
  193. err = hwrng_register(&vi->hwrng);
  194. if (!err) {
  195. vi->hwrng_register_done = true;
  196. vi->hwrng_removed = false;
  197. }
  198. }
  199. return err;
  200. }
  201. static const struct virtio_device_id id_table[] = {
  202. { VIRTIO_ID_RNG, VIRTIO_DEV_ANY_ID },
  203. { 0 },
  204. };
  205. static struct virtio_driver virtio_rng_driver = {
  206. .driver.name = KBUILD_MODNAME,
  207. .id_table = id_table,
  208. .probe = virtrng_probe,
  209. .remove = virtrng_remove,
  210. .scan = virtrng_scan,
  211. .freeze = pm_sleep_ptr(virtrng_freeze),
  212. .restore = pm_sleep_ptr(virtrng_restore),
  213. };
  214. module_virtio_driver(virtio_rng_driver);
  215. MODULE_DEVICE_TABLE(virtio, id_table);
  216. MODULE_DESCRIPTION("Virtio random number driver");
  217. MODULE_LICENSE("GPL");