Skip to contentSkip to conversation

blktap/pvops updates

PATCH New Daniel Stodden 1 participant 9 messages Jun 3, 2010

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 blktap/pvops updates

Hi.

A bunch of updates to the backend/blktap2 branch.

The main difference is that all queue runs are synchronous on behalf of tapdisk system entries now. As a consequence we can drop a couple locks, which is good, and the .unmap vma hook, which is better.

This removes pause/unpause from the kernel interface. I don't anticipate it's going to be missed, because that code must have been deadlocking on sysfs node removal for quite a while. Next toolstack update will redo pause/unpause in userspace.

On the misc side, there is some cleanup and removal of bdev passthrough mode. The idea was nice but it never got excercised a lot.

Cheers,
Daniel

#1 lore raw

PATCH 1/1 blktap: Synchronous queue dispatch

blktap: Synchronous queue dispatch.

Move all queue runs into tapdisk context. Queue dispatch moved into ring.poll. That's not nice, but keeps the toolstack fully compatible. Won't make much of a difference because the original poll code wasn't level-triggered either.

Obsoletes/removes:
* run deferrals and wait_queue.o.
* blktap.tap_sem.
* vma.unmap.

drivers/xen/blktap/Makefile +1 -1
diff -r 16fc7d4e03d6 -r 989a51acce0a drivers/xen/blktap/Makefile
@@ -1,3 +1,3 @@
 obj-$(CONFIG_XEN_BLKDEV_TAP) := blktap.o
 
-blktap-objs := control.o ring.o wait_queue.o device.o request.o sysfs.o
+blktap-objs := control.o ring.o device.o request.o sysfs.o
drivers/xen/blktap/blktap.h +1 -7
diff -r 16fc7d4e03d6 -r 989a51acce0a drivers/xen/blktap/blktap.h
@@ -35,7 +35,6 @@
 #define BLKTAP_PAUSED                7
 #define BLKTAP_SHUTDOWN_REQUESTED    8
 #define BLKTAP_PASSTHROUGH           9
-#define BLKTAP_DEFERRED              10
 
 /* blktap IOCTLs: */
 #define BLKTAP2_IOCTL_KICK_FE        1
@@ -168,8 +167,6 @@
 
 	struct blktap_params           params;
 
-	struct rw_semaphore            tap_sem;
-
 	struct blktap_ring             ring;
 	struct blktap_device           device;
 
@@ -178,7 +175,6 @@
 	struct scatterlist             sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
 
 	wait_queue_head_t              wq;
-	struct list_head               deferred_queue;
 
 	struct blktap_statistics       stats;
 };
@@ -222,6 +218,7 @@
 int blktap_device_destroy(struct blktap *);
 int blktap_device_pause(struct blktap *);
 int blktap_device_resume(struct blktap *);
+int blktap_device_run_queue(struct blktap *);
 void blktap_device_restart(struct blktap *);
 void blktap_device_finish_request(struct blktap *,
 				  struct blkif_response *,
@@ -232,9 +229,6 @@
 				     unsigned, unsigned);
 #endif
 
-void blktap_defer(struct blktap *);
-void blktap_run_deferred(void);
-
 int blktap_request_pool_init(void);
 void blktap_request_pool_free(void);
 int blktap_request_pool_grow(void);
drivers/xen/blktap/control.c +0 -1
diff -r 16fc7d4e03d6 -r 989a51acce0a drivers/xen/blktap/control.c
@@ -20,7 +20,6 @@
 
 	memset(tap, 0, sizeof(*tap));
 	set_bit(BLKTAP_CONTROL, &tap->dev_inuse);
-	init_rwsem(&tap->tap_sem);
 	init_waitqueue_head(&tap->wq);
 	atomic_set(&tap->refcnt, 0);
 	sg_init_table(tap->sg, BLKIF_MAX_SEGMENTS_PER_REQUEST);
drivers/xen/blktap/device.c +14 -50

155 lines not on this page · raw message

drivers/xen/blktap/ring.c +31 -37

149 lines not on this page · raw message

drivers/xen/blktap/sysfs.c +0 -3
diff -r 16fc7d4e03d6 -r 989a51acce0a drivers/xen/blktap/sysfs.c
@@ -265,8 +265,6 @@
 		       "device users: %d\n", tap->params.capacity,
 		       tap->params.sector_size, tap->device.users);
 
-	down_read(&tap->tap_sem);
-
 	tmp += sprintf(tmp, "pending requests: %d\n", tap->pending_cnt);
 	for (i = 0; i < MAX_PENDING_REQS; i++) {
 		struct blktap_request *req = tap->pending_requests[i];
@@ -282,7 +280,6 @@
 			       req->time.tv_usec);
 	}
 
-	up_read(&tap->tap_sem);
 	ret = (tmp - buf) + 1;
 
 out:
drivers/xen/blktap/wait_queue.c deleted +0 -40
diff -r 16fc7d4e03d6 -r 989a51acce0a drivers/xen/blktap/wait_queue.c
@@ -1,40 +0,0 @@
-#include <linux/list.h>
-#include <linux/spinlock.h>
-
-#include "blktap.h"
-
-static LIST_HEAD(deferred_work_queue);
-static DEFINE_SPINLOCK(deferred_work_lock);
-
-void
-blktap_run_deferred(void)
-{
-	LIST_HEAD(queue);
-	struct blktap *tap;
-	unsigned long flags;
-
-	spin_lock_irqsave(&deferred_work_lock, flags);
-	list_splice_init(&deferred_work_queue, &queue);
-	list_for_each_entry(tap, &queue, deferred_queue)
-		clear_bit(BLKTAP_DEFERRED, &tap->dev_inuse);
-	spin_unlock_irqrestore(&deferred_work_lock, flags);
-
-	while (!list_empty(&queue)) {
-		tap = list_entry(queue.next, struct blktap, deferred_queue);
-		list_del_init(&tap->deferred_queue);
-		blktap_device_restart(tap);
-	}
-}
-
-void
-blktap_defer(struct blktap *tap)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&deferred_work_lock, flags);
-	if (!test_bit(BLKTAP_DEFERRED, &tap->dev_inuse)) {
-		set_bit(BLKTAP_DEFERRED, &tap->dev_inuse);
-		list_add_tail(&tap->deferred_queue, &deferred_work_queue);
-	}
-	spin_unlock_irqrestore(&deferred_work_lock, flags);
-}

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#2 lore raw

PATCH 1/1 linux: Remove unmap hook from vm_operations struct

In reply to Daniel Stodden

linux: Remove unmap hook from vm_operations struct.

include/linux/mm.h +0 -4
diff -r 989a51acce0a -r 68eb38b6b16b include/linux/mm.h
@@ -206,10 +206,6 @@
 	 * original value of @ptep. */
 	pte_t (*zap_pte)(struct vm_area_struct *vma, 
 			 unsigned long addr, pte_t *ptep, int is_fullmm);
-
-	/* called before close() to indicate no more pages should be mapped */
-	void (*unmap)(struct vm_area_struct *area);
-
 #ifdef CONFIG_NUMA
 	/*
 	 * set_policy() op must add a reference to any non-NULL @new mempolicy
mm/mmap.c +1 -11
diff -r 989a51acce0a -r 68eb38b6b16b mm/mmap.c
@@ -1799,12 +1799,6 @@
 	tlb_finish_mmu(tlb, start, end);
 }
 
-static inline void unmap_vma(struct vm_area_struct *vma)
-{
-	if (unlikely(vma->vm_ops && vma->vm_ops->unmap))
-		vma->vm_ops->unmap(vma);
-}
-
 /*
  * Create a list of vma's touched by the unmap, removing them from the mm's
  * vma list as we go..
@@ -1820,7 +1814,6 @@
 	insertion_point = (prev ? &prev->vm_next : &mm->mmap);
 	do {
 		rb_erase(&vma->vm_rb, &mm->mm_rb);
-		unmap_vma(vma);
 		mm->map_count--;
 		tail_vma = vma;
 		vma = vma->vm_next;
@@ -2103,7 +2096,7 @@
 void exit_mmap(struct mm_struct *mm)
 {
 	struct mmu_gather *tlb;
-	struct vm_area_struct *vma, *vma_tmp;
+	struct vm_area_struct *vma;
 	unsigned long nr_accounted = 0;
 	unsigned long end;
 
@@ -2125,9 +2118,6 @@
 	if (!vma)	/* Can happen if dup_mmap() received an OOM */
 		return;
 
-	for (vma_tmp = mm->mmap; vma_tmp; vma_tmp = vma_tmp->vm_next)
-		unmap_vma(vma_tmp);
-
 	lru_add_drain();
 	flush_cache_mm(mm);
 	tlb = tlb_gather_mmu(mm, 1);

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#3 lore raw

PATCH 1/1 blktap: Remove broken sysfs pause/resume API

In reply to Daniel Stodden

blktap: Remove broken sysfs pause/resume API.

Safe to remove. This never worked on kernels > 2.6.18 anyway, because the original pause/resume attribute flipping would deadlock. Newer toolstacks should use tap-ctl calls instead.

drivers/xen/blktap/blktap.h +0 -14
diff -r 68eb38b6b16b -r 69301010e4cf drivers/xen/blktap/blktap.h
@@ -31,8 +31,6 @@
 #define BLKTAP_RING_FD               2
 #define BLKTAP_RING_VMA              3
 #define BLKTAP_DEVICE                4
-#define BLKTAP_PAUSE_REQUESTED       6
-#define BLKTAP_PAUSED                7
 #define BLKTAP_SHUTDOWN_REQUESTED    8
 #define BLKTAP_PASSTHROUGH           9
 
@@ -41,15 +39,9 @@
 #define BLKTAP2_IOCTL_ALLOC_TAP	     200
 #define BLKTAP2_IOCTL_FREE_TAP       201
 #define BLKTAP2_IOCTL_CREATE_DEVICE  202
-#define BLKTAP2_IOCTL_SET_PARAMS     203
-#define BLKTAP2_IOCTL_PAUSE          204
-#define BLKTAP2_IOCTL_REOPEN         205
-#define BLKTAP2_IOCTL_RESUME         206
 
 #define BLKTAP2_MAX_MESSAGE_LEN      256
 
-#define BLKTAP2_RING_MESSAGE_PAUSE   1
-#define BLKTAP2_RING_MESSAGE_RESUME  2
 #define BLKTAP2_RING_MESSAGE_CLOSE   3
 
 #define BLKTAP_REQUEST_FREE          0
@@ -120,8 +112,6 @@
 	unsigned long                  ring_vstart;
 	unsigned long                  user_vstart;
 
-	int                            response;
-
 	wait_queue_head_t              poll_wait;
 
 	dev_t                          devno;
@@ -203,8 +193,6 @@
 int blktap_ring_free(void);
 int blktap_ring_create(struct blktap *);
 int blktap_ring_destroy(struct blktap *);
-int blktap_ring_pause(struct blktap *);
-int blktap_ring_resume(struct blktap *);
 void blktap_ring_kick_user(struct blktap *);
 
 int blktap_sysfs_init(void);
@@ -216,8 +204,6 @@
 void blktap_device_free(void);
 int blktap_device_create(struct blktap *);
 int blktap_device_destroy(struct blktap *);
-int blktap_device_pause(struct blktap *);
-int blktap_device_resume(struct blktap *);
 int blktap_device_run_queue(struct blktap *);
 void blktap_device_restart(struct blktap *);
 void blktap_device_finish_request(struct blktap *,
drivers/xen/blktap/device.c +0 -46

52 lines not on this page · raw message

drivers/xen/blktap/request.c +1 -3
diff -r 68eb38b6b16b -r 69301010e4cf drivers/xen/blktap/request.c
@@ -238,12 +238,10 @@
 	list_add(&request->free_list, &pool.free_list);
 	atomic_dec(&handle->bucket->reqs_in_use);
 	free = atomic_dec_and_test(&pool.reqs_in_use);
+	tap->pending_cnt--;
 
 	spin_unlock_irqrestore(&pool.lock, flags);
 
-	if (--tap->pending_cnt == 0)
-		wake_up_interruptible(&tap->wq);
-
 	if (free)
 		wake_up(&pool.wait_queue);
 }
drivers/xen/blktap/ring.c +0 -127

145 lines not on this page · raw message

drivers/xen/blktap/sysfs.c +5 -100

136 lines not on this page · raw message

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#4 lore raw

PATCH 1/1 blktap: Make the device destruction path synchronous

In reply to Daniel Stodden

blktap: Make the device destruction path synchronous.

drivers/xen/blktap/control.c +12 -29
diff -r 69301010e4cf -r 6a74cabb7220 drivers/xen/blktap/control.c
@@ -163,46 +163,29 @@
 blktap_control_destroy_device(struct blktap *tap)
 {
 	int err;
-	unsigned long inuse;
 
 	if (!tap)
 		return 0;
 
 	set_bit(BLKTAP_SHUTDOWN_REQUESTED, &tap->dev_inuse);
 
-	for (;;) {
-		inuse = tap->dev_inuse;
-		err   = blktap_device_destroy(tap);
-		if (err)
-			goto wait;
+	err = blktap_device_destroy(tap);
+	if (err)
+		return err;
 
-		inuse = tap->dev_inuse;
-		err   = blktap_ring_destroy(tap);
-		if (err)
-			goto wait;
+	err = blktap_sysfs_destroy(tap);
+	if (err)
+		return err;
 
-		inuse = tap->dev_inuse;
-		err   = blktap_sysfs_destroy(tap);
-		if (err)
-			goto wait;
-
-		break;
-
-	wait:
-		BTDBG("inuse: 0x%lx, dev_inuse: 0x%lx\n",
-		      inuse, tap->dev_inuse);
-		if (wait_event_interruptible(tap->wq, tap->dev_inuse != inuse))
-			break;
-	}
+	err = blktap_ring_destroy(tap);
+	if (err)
+		return err;
 
 	clear_bit(BLKTAP_SHUTDOWN_REQUESTED, &tap->dev_inuse);
+	clear_bit(BLKTAP_CONTROL, &tap->dev_inuse);
+	wake_up(&tap->wq);
 
-	if (tap->dev_inuse == (1UL << BLKTAP_CONTROL)) {
-		err = 0;
-		clear_bit(BLKTAP_CONTROL, &tap->dev_inuse);
-	}
-
-	return err;
+	return 0;
 }
 
 static int __init
drivers/xen/blktap/device.c +11 -7
diff -r 69301010e4cf -r 6a74cabb7220 drivers/xen/blktap/device.c
@@ -65,7 +65,7 @@
 
 	dev->users--;
 	if (test_bit(BLKTAP_SHUTDOWN_REQUESTED, &tap->dev_inuse))
-		blktap_device_destroy(tap);
+		blktap_control_destroy_device(tap);
 
 	return 0;
 }
@@ -306,7 +306,6 @@
 	unsigned long kvaddr;
 
 	usr_idx = request->usr_idx;
-	down_write(&tap->ring.vma->vm_mm->mmap_sem);
 
 	for (i = 0; i < request->nr_pages; i++) {
 		kvaddr = request_to_kaddr(request, i);
@@ -324,13 +323,17 @@
 		}
 	}
 
-	blktap_device_fast_flush(tap, request);
-	up_write(&tap->ring.vma->vm_mm->mmap_sem);
+	if (blktap_active(tap)) {
+		down_write(&tap->ring.vma->vm_mm->mmap_sem);
+		blktap_device_fast_flush(tap, request);
+		up_write(&tap->ring.vma->vm_mm->mmap_sem);
+	}
 }
 
 /*
  * called if the tapdisk process dies unexpectedly.
  * fail and release any pending requests and disable queue.
+ * may be called from non-tapdisk context.
  */
 void
 blktap_device_fail_pending_requests(struct blktap *tap)
@@ -933,8 +936,11 @@
 
 	BTINFO("destroy device %d users %d\n", tap->minor, dev->users);
 
-	if (dev->users)
+	if (dev->users) {
+		blktap_device_fail_pending_requests(tap);
+		blktap_device_restart(tap);
 		return -EBUSY;
+	}
 
 	spin_lock_irq(&dev->lock);
 	/* No more blktap_device_do_request(). */
@@ -952,8 +958,6 @@
 	blk_cleanup_queue(gd->queue);
 	put_disk(gd);
 
-	wake_up(&tap->wq);
-
 	return 0;
 }
 
drivers/xen/blktap/ring.c +11 -18
diff -r 69301010e4cf -r 6a74cabb7220 drivers/xen/blktap/ring.c
@@ -161,24 +161,12 @@
 	struct blktap *tap = vma_to_blktap(vma);
 	struct blktap_ring *ring = &tap->ring;
 
-	blktap_device_fail_pending_requests(tap);  /* fail pending requests */
-	blktap_device_restart(tap);                /* fail deferred requests */
+	BTINFO("unmapping ring %d\n", tap->minor);
+	zap_page_range(vma, vma->vm_start, vma->vm_end - vma->vm_start, NULL);
+	clear_bit(BLKTAP_RING_VMA, &tap->dev_inuse);
+	ring->vma = NULL;
 
-	zap_page_range(vma, vma->vm_start, vma->vm_end - vma->vm_start, NULL);
-
-	kfree(ring->foreign_map.map);
-	ring->foreign_map.map = NULL;
-
-	/* Free the ring page. */
-	ClearPageReserved(virt_to_page(ring->ring.sring));
-	free_page((unsigned long)ring->ring.sring);
-
-	BTINFO("unmapping ring %d\n", tap->minor);
-	ring->ring.sring = NULL;
-	ring->vma = NULL;
-	clear_bit(BLKTAP_RING_VMA, &tap->dev_inuse);
-
-	wake_up(&tap->wq);
+	blktap_control_destroy_device(tap);
 }
 
 static struct vm_operations_struct blktap_ring_vm_operations = {
@@ -206,6 +194,9 @@
 	if (!test_bit(BLKTAP_CONTROL, &tap->dev_inuse))
 		return -ENODEV;
 
+	if (test_bit(BLKTAP_SHUTDOWN_REQUESTED, &tap->dev_inuse))
+		return -EBUSY;
+
 	/* Only one process can access ring at a time */
 	if (test_and_set_bit(BLKTAP_RING_FD, &tap->dev_inuse))
 		return -EBUSY;
@@ -224,7 +215,9 @@
 	BTINFO("freeing device %d\n", tap->minor);
 	clear_bit(BLKTAP_RING_FD, &tap->dev_inuse);
 	filp->private_data = NULL;
-	wake_up(&tap->wq);	
+
+	blktap_control_destroy_device(tap);
+
 	return 0;
 }
 
drivers/xen/blktap/sysfs.c +6 -3
diff -r 69301010e4cf -r 6a74cabb7220 drivers/xen/blktap/sysfs.c
@@ -96,7 +96,6 @@
 			   struct device_attribute *attr,
 			   const char *buf, size_t size)
 {
-	int err;
 	struct blktap *tap = (struct blktap *)dev_get_drvdata(dev);
 
 	if (!tap->ring.dev)
@@ -105,9 +104,13 @@
 	if (test_and_set_bit(BLKTAP_SHUTDOWN_REQUESTED, &tap->dev_inuse))
 		return -EBUSY;
 
-	err = blktap_control_destroy_device(tap);
+	BTDBG("sending tapdisk close message\n");
+	tap->ring.ring.sring->pad[0] = BLKTAP2_RING_MESSAGE_CLOSE;
+	blktap_ring_kick_user(tap);
+	wait_event_interruptible(tap->wq,
+				 !test_bit(BLKTAP_CONTROL, &tap->dev_inuse));
 
-	return (err ? : size);
+	return 0;
 }
 CLASS_DEVICE_ATTR(remove, S_IWUSR, NULL, blktap_sysfs_remove_device);
 

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#6 lore raw

PATCH 1/1 blktap: Remove obsolete kernel version dependencies

In reply to Daniel Stodden

blktap: Remove obsolete kernel version dependencies.

drivers/xen/blktap/device.c +0 -26
diff -r 6a74cabb7220 -r 699e1fad7561 drivers/xen/blktap/device.c
@@ -97,26 +97,6 @@
 		      command, (long)argument, inode->i_rdev);
 
 	switch (command) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
-	case HDIO_GETGEO: {
-		struct hd_geometry geo;
-		int ret;
-
-                if (!argument)
-                        return -EINVAL;
-
-		geo.start = get_start_sect(bd);
-		ret = blktap_device_getgeo(bd, &geo);
-		if (ret)
-			return ret;
-
-		if (copy_to_user((struct hd_geometry __user *)argument, &geo,
-				 sizeof(geo)))
-                        return -EFAULT;
-
-                return 0;
-	}
-#endif
 	case CDROMMULTISESSION:
 		BTDBG("FIXME: support multisession CDs later\n");
 		for (i = 0; i < sizeof(struct cdrom_multisession); i++)
@@ -149,9 +129,7 @@
 	.open      = blktap_device_open,
 	.release   = blktap_device_release,
 	.ioctl     = blktap_device_ioctl,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
 	.getgeo    = blktap_device_getgeo
-#endif
 };
 
 static int
@@ -1005,11 +983,7 @@
 	if (!rq)
 		goto error;
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
 	elevator_init(rq, "noop");
-#else
-	elevator_init(rq, &elevator_noop);
-#endif
 
 	gd->queue     = rq;
 	rq->queuedata = dev;

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#7 lore raw

PATCH 1/1 blktap: Update tap state when failing ring mmap

In reply to Daniel Stodden

blktap: Update tap state when failing ring mmap.

drivers/xen/blktap/ring.c +2 -0
diff -r 699e1fad7561 -r 152ee0de9646 drivers/xen/blktap/ring.c
@@ -324,6 +324,8 @@
 	free_page((unsigned long)sring);
 	kfree(map);
 
+	clear_bit(BLKTAP_RING_VMA, &tap->dev_inuse);
+
 	return -ENOMEM;
 }
 

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#8 lore raw

PATCH 1/1 blktap: Remove passthrough mode

In reply to Daniel Stodden

blktap: Remove passthrough mode.

drivers/xen/blktap/blktap.h +0 -2
diff -r 152ee0de9646 -r cc3749a5f7e9 drivers/xen/blktap/blktap.h
@@ -9,8 +9,6 @@
 #include <xen/blkif.h>
 #include <xen/grant_table.h>
 
-//#define ENABLE_PASSTHROUGH
-
 extern int blktap_debug_level;
 
 #define BTPRINTK(level, tag, force, _f, _a...)				\
drivers/xen/blktap/device.c +0 -105

123 lines not on this page · raw message

drivers/xen/blktap/sysfs.c +0 -44

50 lines not on this page · raw message

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel