mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
Main excitement is a virtio_scsi fix for alloc holding spinlock on the abort
path, which I refuse to CC stable since (1) I discovered it myself, and (2) it's been there forever with no reports. Cheers, Rusty. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJTmRNwAAoJENkgDmzRrbjxfkQP/25Xjr1T6d9wR3ZRbJ2LRDX1 hwwwuFeYJMe5KZBqsA2gNeRqbrbW8S9t4ClyjXj2AZsC1XPi5zQbzXfm77HqRpKO KCQ7YoIyLsrtHfKtdKrOK5qiwuns3AsKn988Yy6HkZ94/D6tp8urINdEZg5xtw6z zbgTmv5kSEoY/+D6SmSIN9CT0gJNmIRG5bkDDijhxIHUi9oTFvkG4Rvhtgsdfivm 3vOOnyzD+oXEj7Jzpz4j2D1m8C134uRE67psmAp5zADxDKr66df62YKGBrZJFs45 1Tjr0KancMDXDr8ZWNsmShFnzfailK87KycQbxLoNBvY0wAZZ2H7iS+2Xmid9ee+ feBF6FxBZgmkLnWxlybNy5hJmXKWmM3Hz4p4QZ59N4cEFL6vRGdXiZLCzNFxHyaj p5VggFyhB/fjYfYtmlT8GS4K8M5wfySgfMxDPLYrASzSnx7xFxS3LZPBSPEEgM2q +ivoRBCM5cXdRJUSsS/MdbixAGl0seHR3+KzOGE1ZbU1YQoKA1c9Ci9dTs1REEhS KSL9I2rb0AcnHwhOC3wUOEi1Y7fi0rf4KywWuT6kkA5OrDZIhb0ZrH6CPnBBWabK 7bEq782tF6tIJP9rpMAeNwztRt2GcFhdc54ZLesw9xFoJdf2TPTC0XF+jG1iji5L Nboz+428hzrGarIilHBH =YCNa -----END PGP SIGNATURE----- Merge tag 'virtio-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux Pull virtio updates from Rusty Russell: "Main excitement is a virtio_scsi fix for alloc holding spinlock on the abort path, which I refuse to CC stable since (1) I discovered it myself, and (2) it's been there forever with no reports" * tag 'virtio-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux: virtio_scsi: don't call virtqueue_add_sgs(... GFP_NOIO) holding spinlock. virtio-rng: fixes for device registration/unregistration virtio-rng: fix boot with virtio-rng device virtio-rng: support multiple virtio-rng devices virtio_ccw: introduce device_lost in virtio_ccw_device virtio: virtio_break_device() to mark all virtqueues broken.
This commit is contained in:
commit
5c02c392cd
5 changed files with 127 additions and 59 deletions
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kvm_para.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/cio.h>
|
||||
|
|
@ -62,6 +63,7 @@ struct virtio_ccw_device {
|
|||
struct vq_config_block *config_block;
|
||||
bool is_thinint;
|
||||
bool going_away;
|
||||
bool device_lost;
|
||||
void *airq_info;
|
||||
};
|
||||
|
||||
|
|
@ -1010,11 +1012,14 @@ static void virtio_ccw_remove(struct ccw_device *cdev)
|
|||
unsigned long flags;
|
||||
struct virtio_ccw_device *vcdev = virtio_grab_drvdata(cdev);
|
||||
|
||||
if (vcdev && cdev->online)
|
||||
if (vcdev && cdev->online) {
|
||||
if (vcdev->device_lost)
|
||||
virtio_break_device(&vcdev->vdev);
|
||||
unregister_virtio_device(&vcdev->vdev);
|
||||
spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
|
||||
dev_set_drvdata(&cdev->dev, NULL);
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
|
||||
spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
|
||||
dev_set_drvdata(&cdev->dev, NULL);
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
|
||||
}
|
||||
cdev->handler = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -1023,12 +1028,14 @@ static int virtio_ccw_offline(struct ccw_device *cdev)
|
|||
unsigned long flags;
|
||||
struct virtio_ccw_device *vcdev = virtio_grab_drvdata(cdev);
|
||||
|
||||
if (vcdev) {
|
||||
unregister_virtio_device(&vcdev->vdev);
|
||||
spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
|
||||
dev_set_drvdata(&cdev->dev, NULL);
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
|
||||
}
|
||||
if (!vcdev)
|
||||
return 0;
|
||||
if (vcdev->device_lost)
|
||||
virtio_break_device(&vcdev->vdev);
|
||||
unregister_virtio_device(&vcdev->vdev);
|
||||
spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
|
||||
dev_set_drvdata(&cdev->dev, NULL);
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1096,8 +1103,26 @@ out_free:
|
|||
|
||||
static int virtio_ccw_cio_notify(struct ccw_device *cdev, int event)
|
||||
{
|
||||
/* TODO: Check whether we need special handling here. */
|
||||
return 0;
|
||||
int rc;
|
||||
struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev);
|
||||
|
||||
/*
|
||||
* Make sure vcdev is set
|
||||
* i.e. set_offline/remove callback not already running
|
||||
*/
|
||||
if (!vcdev)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
switch (event) {
|
||||
case CIO_GONE:
|
||||
vcdev->device_lost = true;
|
||||
rc = NOTIFY_DONE;
|
||||
break;
|
||||
default:
|
||||
rc = NOTIFY_DONE;
|
||||
break;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static struct ccw_device_id virtio_ids[] = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue