diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-11 00:31:04 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-11 00:31:04 -0400 |
| commit | 801a71a858631109a64bf30b1c480b0a18386605 (patch) | |
| tree | 2a57e96279c9c06bc4bc30ba192037263c071d5c | |
| parent | 155134fef2b6c7426c3f25ffe84fb3043167c860 (diff) | |
| parent | eeec626366ffe558fc3d5685bd2b49a962acf57d (diff) | |
Merge tag 'virtio-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux
Pull virtio updates from Rusty Russell.
* tag 'virtio-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux:
Revert "hwrng: virtio - ensure reads happen after successful probe"
virtio: rng: delay hwrng_register() till driver is ready
virtio: rng: re-arrange struct elements for better packing
virtio: rng: remove unused struct element
virtio: Replace DEFINE_PCI_DEVICE_TABLE macro use
virtio: console: remove unnecessary null test before debugfs_remove_recursive
| -rw-r--r-- | drivers/char/hw_random/core.c | 6 | ||||
| -rw-r--r-- | drivers/char/hw_random/virtio-rng.c | 39 | ||||
| -rw-r--r-- | drivers/char/virtio_console.c | 6 | ||||
| -rw-r--r-- | drivers/virtio/virtio_pci.c | 2 |
4 files changed, 20 insertions, 33 deletions
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index 6e02ec103cc7..aa30a25c8d49 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c | |||
| @@ -81,12 +81,6 @@ static void add_early_randomness(struct hwrng *rng) | |||
| 81 | unsigned char bytes[16]; | 81 | unsigned char bytes[16]; |
| 82 | int bytes_read; | 82 | int bytes_read; |
| 83 | 83 | ||
| 84 | /* | ||
| 85 | * Currently only virtio-rng cannot return data during device | ||
| 86 | * probe, and that's handled in virtio-rng.c itself. If there | ||
| 87 | * are more such devices, this call to rng_get_data can be | ||
| 88 | * made conditional here instead of doing it per-device. | ||
| 89 | */ | ||
| 90 | bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1); | 84 | bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1); |
| 91 | if (bytes_read > 0) | 85 | if (bytes_read > 0) |
| 92 | add_device_randomness(bytes, bytes_read); | 86 | add_device_randomness(bytes, bytes_read); |
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c index e9b15bc18b4d..0027137daa56 100644 --- a/drivers/char/hw_random/virtio-rng.c +++ b/drivers/char/hw_random/virtio-rng.c | |||
| @@ -28,17 +28,16 @@ | |||
| 28 | static DEFINE_IDA(rng_index_ida); | 28 | static DEFINE_IDA(rng_index_ida); |
| 29 | 29 | ||
| 30 | struct virtrng_info { | 30 | struct virtrng_info { |
| 31 | struct virtio_device *vdev; | ||
| 32 | struct hwrng hwrng; | 31 | struct hwrng hwrng; |
| 33 | struct virtqueue *vq; | 32 | struct virtqueue *vq; |
| 34 | unsigned int data_avail; | ||
| 35 | struct completion have_data; | 33 | struct completion have_data; |
| 36 | bool busy; | ||
| 37 | char name[25]; | 34 | char name[25]; |
| 35 | unsigned int data_avail; | ||
| 38 | int index; | 36 | int index; |
| 37 | bool busy; | ||
| 38 | bool hwrng_register_done; | ||
| 39 | }; | 39 | }; |
| 40 | 40 | ||
| 41 | static bool probe_done; | ||
| 42 | 41 | ||
| 43 | static void random_recv_done(struct virtqueue *vq) | 42 | static void random_recv_done(struct virtqueue *vq) |
| 44 | { | 43 | { |
| @@ -69,13 +68,6 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) | |||
| 69 | int ret; | 68 | int ret; |
| 70 | struct virtrng_info *vi = (struct virtrng_info *)rng->priv; | 69 | struct virtrng_info *vi = (struct virtrng_info *)rng->priv; |
| 71 | 70 | ||
| 72 | /* | ||
| 73 | * Don't ask host for data till we're setup. This call can | ||
| 74 | * happen during hwrng_register(), after commit d9e7972619. | ||
| 75 | */ | ||
| 76 | if (unlikely(!probe_done)) | ||
| 77 | return 0; | ||
| 78 | |||
| 79 | if (!vi->busy) { | 71 | if (!vi->busy) { |
| 80 | vi->busy = true; | 72 | vi->busy = true; |
| 81 | init_completion(&vi->have_data); | 73 | init_completion(&vi->have_data); |
| @@ -137,25 +129,17 @@ static int probe_common(struct virtio_device *vdev) | |||
| 137 | return err; | 129 | return err; |
| 138 | } | 130 | } |
| 139 | 131 | ||
| 140 | err = hwrng_register(&vi->hwrng); | ||
| 141 | if (err) { | ||
| 142 | vdev->config->del_vqs(vdev); | ||
| 143 | vi->vq = NULL; | ||
| 144 | kfree(vi); | ||
| 145 | ida_simple_remove(&rng_index_ida, index); | ||
| 146 | return err; | ||
| 147 | } | ||
| 148 | |||
| 149 | probe_done = true; | ||
| 150 | return 0; | 132 | return 0; |
| 151 | } | 133 | } |
| 152 | 134 | ||
| 153 | static void remove_common(struct virtio_device *vdev) | 135 | static void remove_common(struct virtio_device *vdev) |
| 154 | { | 136 | { |
| 155 | struct virtrng_info *vi = vdev->priv; | 137 | struct virtrng_info *vi = vdev->priv; |
| 138 | |||
| 156 | vdev->config->reset(vdev); | 139 | vdev->config->reset(vdev); |
| 157 | vi->busy = false; | 140 | vi->busy = false; |
| 158 | hwrng_unregister(&vi->hwrng); | 141 | if (vi->hwrng_register_done) |
| 142 | hwrng_unregister(&vi->hwrng); | ||
| 159 | vdev->config->del_vqs(vdev); | 143 | vdev->config->del_vqs(vdev); |
| 160 | ida_simple_remove(&rng_index_ida, vi->index); | 144 | ida_simple_remove(&rng_index_ida, vi->index); |
| 161 | kfree(vi); | 145 | kfree(vi); |
| @@ -171,6 +155,16 @@ static void virtrng_remove(struct virtio_device *vdev) | |||
| 171 | remove_common(vdev); | 155 | remove_common(vdev); |
| 172 | } | 156 | } |
| 173 | 157 | ||
| 158 | static void virtrng_scan(struct virtio_device *vdev) | ||
| 159 | { | ||
| 160 | struct virtrng_info *vi = vdev->priv; | ||
| 161 | int err; | ||
| 162 | |||
| 163 | err = hwrng_register(&vi->hwrng); | ||
| 164 | if (!err) | ||
| 165 | vi->hwrng_register_done = true; | ||
| 166 | } | ||
| 167 | |||
| 174 | #ifdef CONFIG_PM_SLEEP | 168 | #ifdef CONFIG_PM_SLEEP |
| 175 | static int virtrng_freeze(struct virtio_device *vdev) | 169 | static int virtrng_freeze(struct virtio_device *vdev) |
| 176 | { | 170 | { |
| @@ -195,6 +189,7 @@ static struct virtio_driver virtio_rng_driver = { | |||
| 195 | .id_table = id_table, | 189 | .id_table = id_table, |
| 196 | .probe = virtrng_probe, | 190 | .probe = virtrng_probe, |
| 197 | .remove = virtrng_remove, | 191 | .remove = virtrng_remove, |
| 192 | .scan = virtrng_scan, | ||
| 198 | #ifdef CONFIG_PM_SLEEP | 193 | #ifdef CONFIG_PM_SLEEP |
| 199 | .freeze = virtrng_freeze, | 194 | .freeze = virtrng_freeze, |
| 200 | .restore = virtrng_restore, | 195 | .restore = virtrng_restore, |
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 60aafb8a1f2e..b585b4789822 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
| @@ -2262,8 +2262,7 @@ static int __init init(void) | |||
| 2262 | unregister: | 2262 | unregister: |
| 2263 | unregister_virtio_driver(&virtio_console); | 2263 | unregister_virtio_driver(&virtio_console); |
| 2264 | free: | 2264 | free: |
| 2265 | if (pdrvdata.debugfs_dir) | 2265 | debugfs_remove_recursive(pdrvdata.debugfs_dir); |
| 2266 | debugfs_remove_recursive(pdrvdata.debugfs_dir); | ||
| 2267 | class_destroy(pdrvdata.class); | 2266 | class_destroy(pdrvdata.class); |
| 2268 | return err; | 2267 | return err; |
| 2269 | } | 2268 | } |
| @@ -2276,8 +2275,7 @@ static void __exit fini(void) | |||
| 2276 | unregister_virtio_driver(&virtio_rproc_serial); | 2275 | unregister_virtio_driver(&virtio_rproc_serial); |
| 2277 | 2276 | ||
| 2278 | class_destroy(pdrvdata.class); | 2277 | class_destroy(pdrvdata.class); |
| 2279 | if (pdrvdata.debugfs_dir) | 2278 | debugfs_remove_recursive(pdrvdata.debugfs_dir); |
| 2280 | debugfs_remove_recursive(pdrvdata.debugfs_dir); | ||
| 2281 | } | 2279 | } |
| 2282 | module_init(init); | 2280 | module_init(init); |
| 2283 | module_exit(fini); | 2281 | module_exit(fini); |
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 101db3faf5d4..3d1463c6b120 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c | |||
| @@ -91,7 +91,7 @@ struct virtio_pci_vq_info | |||
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| 93 | /* Qumranet donated their vendor ID for devices 0x1000 thru 0x10FF. */ | 93 | /* Qumranet donated their vendor ID for devices 0x1000 thru 0x10FF. */ |
| 94 | static DEFINE_PCI_DEVICE_TABLE(virtio_pci_id_table) = { | 94 | static const struct pci_device_id virtio_pci_id_table[] = { |
| 95 | { PCI_DEVICE(0x1af4, PCI_ANY_ID) }, | 95 | { PCI_DEVICE(0x1af4, PCI_ANY_ID) }, |
| 96 | { 0 } | 96 | { 0 } |
| 97 | }; | 97 | }; |
