blktap/pvops updates
Subsystems (4)
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
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
PATCH 1/1 linux: Remove unmap hook from vm_operations struct
In reply to Daniel Stoddenlinux: Remove unmap hook from vm_operations struct.
include/linux/mm.h +0 -4
@@ -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
@@ -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
PATCH 1/1 blktap: Remove broken sysfs pause/resume API
In reply to Daniel Stoddenblktap: 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
@@ -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
@@ -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
PATCH 1/1 blktap: Make the device destruction path synchronous
In reply to Daniel Stoddenblktap: Make the device destruction path synchronous.
drivers/xen/blktap/control.c +12 -29
@@ -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
@@ -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
@@ -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
@@ -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
PATCH 1/1 blktap: Remove obsolete kernel version dependencies
In reply to Daniel Stoddenblktap: Remove obsolete kernel version dependencies.
drivers/xen/blktap/device.c +0 -26
@@ -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
PATCH 1/1 blktap: Update tap state when failing ring mmap
In reply to Daniel Stoddenblktap: Update tap state when failing ring mmap.
drivers/xen/blktap/ring.c +2 -0
@@ -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
PATCH 1/1 blktap: Remove passthrough mode
In reply to Daniel Stoddenblktap: Remove passthrough mode.
drivers/xen/blktap/blktap.h +0 -2
@@ -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
Re: [PATCH 4 of 7] blktap: Make the device destruction path synchronous
In reply to Daniel StoddenOn Wed, 2010-06-02 at 23:12 -0400, Daniel Stodden wrote: