Last Call - 2sd World Conference on IST; Submission: December 29

2013-12-13 Thread WorldCIST

2sd World Conference on Information Systems and Technologies - WorldCIST'14
April 15-18, 2014, Madeira Island, Portugal
http://www.aisti.eu/worldcist14/


Submission deadline: December 29

* Proceedings published by Springer.

** Papers submitted for indexation by ISI, SCOPUS, DBLP, etc.

*** Extended versions of best papers published in ISI/SCI/SSCI/JCR journals.

Regards,

Maria Lemos
WorldCIST'14
http://www.aisti.eu/worldcist14/






___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH v4 RFC 3/3] virtio_ccw: set 'device_lost' on CIO_GONE notification

2013-12-13 Thread Heinz Graalfs
When a CIO_GONE notification is received the device_lost flag is
set in the virtio_device. This flag should be tested by a backend
in order to be able to prevent triggering final I/O to a device that
is not reachable any more.

The notification is ignored in case remove or set_offline is already
running. The virtio_device pointer might point to freed memory in that
case.

Signed-off-by: Heinz Graalfs 
Acked-by: Cornelia Huck 
---
 drivers/s390/kvm/virtio_ccw.c | 23 +--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/drivers/s390/kvm/virtio_ccw.c b/drivers/s390/kvm/virtio_ccw.c
index b939a7f..a468b9c 100644
--- a/drivers/s390/kvm/virtio_ccw.c
+++ b/drivers/s390/kvm/virtio_ccw.c
@@ -27,6 +27,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -1085,8 +1086,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:
+   atomic_inc(&vcdev->vdev.device_lost);
+   rc = NOTIFY_DONE;
+   break;
+   default:
+   rc = NOTIFY_DONE;
+   break;
+   }
+   return rc;
 }
 
 static struct ccw_device_id virtio_ids[] = {
-- 
1.8.3.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH v4 RFC 0/3] virtio: add 'device_lost' to virtio_device

2013-12-13 Thread Heinz Graalfs
Hi, here is my v4 patch-set update to the v3 RFC submitted on Nov 27th. 

When an active virtio block device is hot-unplugged from a KVM guest,
affected guest user applications are not aware of any errors that occur
due to the lost device. This patch-set adds code to avoid further request
queueing when a lost block device is detected, resulting in appropriate
error info. Additionally a potential hang situation can be avoided by not
waiting for requests (e.g. in-flight requests) in blk_cleanup_queue() that
will never complete.

On System z there exists no handshake mechanism between host and guest
when a device is hot-unplugged. The device is removed and no further I/O
is possible.

When an online channel device disappears on System z the kernel's CIO layer
informs the driver (virtio_ccw) about the lost device.

Here are some more error details:

For a particular block device virtio's request function virtblk_request()
is called by the block layer to queue requests to be handled by the host.
In case of a lost device requests can still be queued, but an appropriate
subsequent host kick usually fails. This leads to situations where no error
feedback is shown.

In order to prevent request queueing for lost devices appropriate settings
in the block layer should be made. Exploiting System z's CIO notify handler
callback, and passing on device loss information via the surprize_removal
flag to the remove callback of the backend driver, can solve this task.

v3->v4 changes:
 - patch 1: solves some vcdev pointer handling issues in the virtio_ccw driver
   (e.g. locked vcdev pointer reset/query; serialize remove()/set_offline()
   callback processing).
 - patch 2: introduces 'device_lost' atomic in virtio_device and use in
   backend driver virtio_blk accordingly (original 3 patches merged).
 - patch 3: the notify() callback is now serialized with remove()/set_offline()
   callbacks. The notification is ignored if the vcdev pointer has been cleared
   already (by remove() or set_offline()).

v2->v3 changes:
 - remove virtio_driver's notify callback (and appropriate code) introduced
   in my v1 RFC
 - introduce 'surprize_removal' in struct virtio_device
 - change virtio_blk's remove callback to perform special actions when the
   surprize_removal flag is set
   - avoid final I/O by preventing further request queueing
   - avoid hangs in blk_cleanup_queue() due to waits on 'in-flight' requests
 - set surprize_removal in virtio_ccw's notify callback when a device is lost

v1->v2 changes:
 - add include of linux/notifier.h (I also added it to the 3rd patch)
 - get queue lock in order to be able to use safe queue_flag_set() functions
   in virtblk_notify() handler


Heinz Graalfs (3):
  virtio_ccw: fix vcdev pointer handling issues
  virtio: introduce 'device_lost' flag in virtio_device
  virtio_ccw: set 'device_lost' on CIO_GONE notification

 drivers/block/virtio_blk.c| 14 ++-
 drivers/s390/kvm/virtio_ccw.c | 58 ---
 include/linux/virtio.h|  2 ++
 3 files changed, 64 insertions(+), 10 deletions(-)

-- 
1.8.3.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH v4 RFC 1/3] virtio_ccw: fix vcdev pointer handling issues

2013-12-13 Thread Heinz Graalfs
The interrupt handler virtio_ccw_int_handler() using the vcdev pointer
is protected by the ccw_device lock. Resetting the pointer within the
ccw_device structure should be done when holding this lock.

Also resetting the vcdev pointer (under the ccw_device lock) prior to
freeing the vcdev pointer memory removes a critical path.

Signed-off-by: Heinz Graalfs 
Acked-by: Cornelia Huck 
---
 drivers/s390/kvm/virtio_ccw.c | 35 ---
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/drivers/s390/kvm/virtio_ccw.c b/drivers/s390/kvm/virtio_ccw.c
index 35b9aaa..b939a7f 100644
--- a/drivers/s390/kvm/virtio_ccw.c
+++ b/drivers/s390/kvm/virtio_ccw.c
@@ -886,6 +886,8 @@ static void virtio_ccw_int_handler(struct ccw_device *cdev,
struct virtqueue *vq;
struct virtio_driver *drv;
 
+   if (!vcdev)
+   return;
/* Check if it's a notification from the host. */
if ((intparm == 0) &&
(scsw_stctl(&irb->scsw) ==
@@ -985,23 +987,37 @@ static int virtio_ccw_probe(struct ccw_device *cdev)
return 0;
 }
 
+static struct virtio_ccw_device *virtio_grab_drvdata(struct ccw_device *cdev)
+{
+   unsigned long flags;
+   struct virtio_ccw_device *vcdev;
+
+   spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
+   vcdev = dev_get_drvdata(&cdev->dev);
+   if (!vcdev) {
+   spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
+   return NULL;
+   }
+   dev_set_drvdata(&cdev->dev, NULL);
+   spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
+   return vcdev;
+}
+
 static void virtio_ccw_remove(struct ccw_device *cdev)
 {
-   struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev);
+   struct virtio_ccw_device *vcdev = virtio_grab_drvdata(cdev);
 
-   if (cdev->online) {
+   if (vcdev && cdev->online)
unregister_virtio_device(&vcdev->vdev);
-   dev_set_drvdata(&cdev->dev, NULL);
-   }
cdev->handler = NULL;
 }
 
 static int virtio_ccw_offline(struct ccw_device *cdev)
 {
-   struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev);
+   struct virtio_ccw_device *vcdev = virtio_grab_drvdata(cdev);
 
-   unregister_virtio_device(&vcdev->vdev);
-   dev_set_drvdata(&cdev->dev, NULL);
+   if (vcdev)
+   unregister_virtio_device(&vcdev->vdev);
return 0;
 }
 
@@ -1010,6 +1026,7 @@ static int virtio_ccw_online(struct ccw_device *cdev)
 {
int ret;
struct virtio_ccw_device *vcdev;
+   unsigned long flags;
 
vcdev = kzalloc(sizeof(*vcdev), GFP_KERNEL);
if (!vcdev) {
@@ -1039,7 +1056,9 @@ static int virtio_ccw_online(struct ccw_device *cdev)
INIT_LIST_HEAD(&vcdev->virtqueues);
spin_lock_init(&vcdev->lock);
 
+   spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
dev_set_drvdata(&cdev->dev, vcdev);
+   spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
vcdev->vdev.id.vendor = cdev->id.cu_type;
vcdev->vdev.id.device = cdev->id.cu_model;
ret = register_virtio_device(&vcdev->vdev);
@@ -1050,7 +1069,9 @@ static int virtio_ccw_online(struct ccw_device *cdev)
}
return 0;
 out_put:
+   spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
dev_set_drvdata(&cdev->dev, NULL);
+   spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
put_device(&vcdev->vdev.dev);
return ret;
 out_free:
-- 
1.8.3.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH v4 RFC 2/3] virtio: introduce 'device_lost' flag in virtio_device

2013-12-13 Thread Heinz Graalfs
This flag should be set by a virtio transport driver, when it was
notified about a lost device, before the remove callback of a
backend driver is triggered.

A backend driver can test this flag in order to perform specific
actions that might be appropriate wrt the device loss.

In case of a device loss further request queueing should be prevented
by setting appropriate queue flags prior to invoking del_gendisk().
Blocking of request queueing leads to appropriate I/O errors when data
are tried to be synched. Trying to synch data to a lost block device
doesn't make too much sense.

Calling blk_cleanup_queue() when the device_lost flag is set due to a
disappeared device. It avoid hangs due to incomplete requests
(e.g. in-flight requests). Such requests must be considered as lost.

Signed-off-by: Heinz Graalfs 
Acked-by: Cornelia Huck 
---
 drivers/block/virtio_blk.c | 14 +-
 include/linux/virtio.h |  2 ++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 2d43be4..e5b4947 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -876,14 +876,26 @@ static void virtblk_remove(struct virtio_device *vdev)
struct virtio_blk *vblk = vdev->priv;
int index = vblk->index;
int refc;
+   int device_lost;
+   unsigned long flags;
 
/* Prevent config work handler from accessing the device. */
mutex_lock(&vblk->config_lock);
vblk->config_enable = false;
mutex_unlock(&vblk->config_lock);
 
+   device_lost = atomic_read(&vdev->device_lost);
+   if (device_lost) {
+   spin_lock_irqsave(vblk->disk->queue->queue_lock, flags);
+   queue_flag_set(QUEUE_FLAG_DYING, vblk->disk->queue);
+   queue_flag_set(QUEUE_FLAG_NOMERGES, vblk->disk->queue);
+   queue_flag_set(QUEUE_FLAG_NOXMERGES, vblk->disk->queue);
+   spin_unlock_irqrestore(vblk->disk->queue->queue_lock, flags);
+   }
+
del_gendisk(vblk->disk);
-   blk_cleanup_queue(vblk->disk->queue);
+   if (!device_lost)
+   blk_cleanup_queue(vblk->disk->queue);
 
/* Stop all the virtqueues. */
vdev->config->reset(vdev);
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index f15f6e7..c18db21 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -87,6 +87,7 @@ bool virtqueue_is_broken(struct virtqueue *vq);
  * @vringh_config: configuration ops for host vrings.
  * @vqs: the list of virtqueues for this device.
  * @features: the features supported by both driver and device.
+ * @device_lost: to flag a device loss.
  * @priv: private pointer for the driver's use.
  */
 struct virtio_device {
@@ -98,6 +99,7 @@ struct virtio_device {
struct list_head vqs;
/* Note that this is a Linux set_bit-style bitmap. */
unsigned long features[1];
+   atomic_t device_lost;
void *priv;
 };
 
-- 
1.8.3.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization