# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1162436697 -32400 # Node ID f9d0ee0d7de12861b809af224220e247a3ea9c66 # Parent 874cc0ff214daac1fec3890e083a6ca36b79dbfa blktap various clean up necessary for ia64 support. - remove magic number 8 and 64. page size / sector size is 8 on x86, however on ia64 page size is 16kb. blkring size is 64 on x86. however it's 128 on ia64. - replace 0xFFFF with INVALID_GRANT_HANDLE - don't map io ring into user space with uncachable. kernel access the page with cacable and tapdisk uses memory barrier so that it isn't necessary. - remove printk warning and inserted new line. - remove unused variable, page. - add one BUG() PATCHNAME: blktap_cleanup Signed-off-by: Isaku Yamahata diff -r 874cc0ff214d -r f9d0ee0d7de1 linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Wed Nov 01 09:55:43 2006 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Thu Nov 02 12:04:57 2006 +0900 @@ -93,8 +93,9 @@ int setup_xen_class(void) * mmap_alloc is initialised to 2 and should be adjustable on the fly via * sysfs. */ -#define MAX_DYNAMIC_MEM 64 -#define MAX_PENDING_REQS 64 +#define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE) +#define MAX_DYNAMIC_MEM BLK_RING_SIZE +#define MAX_PENDING_REQS BLK_RING_SIZE #define MMAP_PAGES (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST) #define MMAP_VADDR(_start, _req,_seg) \ (_start + \ @@ -215,6 +216,7 @@ struct grant_handle_pair grant_handle_t kernel; grant_handle_t user; }; +#define INVALID_GRANT_HANDLE 0xFFFF static struct grant_handle_pair pending_grant_handles[MAX_DYNAMIC_MEM][MMAP_PAGES]; @@ -293,10 +295,11 @@ static inline int GET_NEXT_REQ(unsigned #define BLKTAP_INVALID_HANDLE(_g) \ - (((_g->kernel) == 0xFFFF) && ((_g->user) == 0xFFFF)) + (((_g->kernel) == INVALID_GRANT_HANDLE) && \ + ((_g->user) == INVALID_GRANT_HANDLE)) #define BLKTAP_INVALIDATE_HANDLE(_g) do { \ - (_g)->kernel = 0xFFFF; (_g)->user = 0xFFFF; \ + (_g)->kernel = INVALID_GRANT_HANDLE; (_g)->user = INVALID_GRANT_HANDLE; \ } while(0) @@ -588,8 +591,6 @@ static int blktap_mmap(struct file *filp info->user_vstart = info->rings_vstart + (RING_PAGES << PAGE_SHIFT); /* Map the ring pages to the start of the region and reserve it. */ - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - if (remap_pfn_range(vma, vma->vm_start, __pa(info->ufe_ring.sring) >> PAGE_SHIFT, PAGE_SIZE, vma->vm_page_prot)) { @@ -892,14 +893,14 @@ static void fast_flush_area(pending_req_ khandle = &pending_handle(mmap_idx, k_idx, i); - if (khandle->kernel != 0xFFFF) { + if (khandle->kernel != INVALID_GRANT_HANDLE) { gnttab_set_unmap_op(&unmap[invcount], idx_to_kaddr(mmap_idx, k_idx, i), GNTMAP_host_map, khandle->kernel); invcount++; } - if (khandle->user != 0xFFFF) { + if (khandle->user != INVALID_GRANT_HANDLE) { if (create_lookup_pte_addr( info->vma->vm_mm, MMAP_VADDR(info->user_vstart, u_idx, i), @@ -1184,8 +1185,10 @@ static void dispatch_rw_block_io(blkif_t /* Check we have space on user ring - should never fail. */ usr_idx = GET_NEXT_REQ(info->idx_map); - if (usr_idx == INVALID_REQ) + if (usr_idx == INVALID_REQ) { + BUG(); goto fail_response; + } /* Check that number of segments is sane. */ nseg = req->nr_segments; @@ -1219,14 +1222,12 @@ static void dispatch_rw_block_io(blkif_t unsigned long uvaddr; unsigned long kvaddr; uint64_t ptep; - struct page *page; uint32_t flags; uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i); kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i); - page = virt_to_page(kvaddr); - - sector = req->sector_number + (8*i); + + sector = req->sector_number + ((PAGE_SIZE / 512) * i); if( (blkif->sectors > 0) && (sector >= blkif->sectors) ) { WPRINTK("BLKTAP: Sector request greater" "than size\n"); @@ -1236,7 +1237,7 @@ static void dispatch_rw_block_io(blkif_t BLKIF_OP_WRITE ? "WRITE" : "READ"), (long long unsigned) sector, (long long unsigned) sector>>9, - blkif->sectors); + (long long unsigned) blkif->sectors); } flags = GNTMAP_host_map; @@ -1279,14 +1280,14 @@ static void dispatch_rw_block_io(blkif_t WPRINTK("invalid kernel buffer -- " "could not remap it\n"); ret |= 1; - map[i].handle = 0xFFFF; + map[i].handle = INVALID_GRANT_HANDLE; } if (unlikely(map[i+1].status != 0)) { WPRINTK("invalid user buffer -- " "could not remap it\n"); ret |= 1; - map[i+1].handle = 0xFFFF; + map[i+1].handle = INVALID_GRANT_HANDLE; } pending_handle(mmap_idx, pending_idx, i/2).kernel diff -r 874cc0ff214d -r f9d0ee0d7de1 linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c Wed Nov 01 09:55:43 2006 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c Thu Nov 02 12:04:57 2006 +0900 @@ -189,7 +189,7 @@ static int blktap_probe(struct xenbus_de return 0; fail: - DPRINTK("blktap probe failed"); + DPRINTK("blktap probe failed\n"); blktap_remove(dev); return err; } @@ -243,7 +243,7 @@ static void tap_frontend_changed(struct struct backend_info *be = dev->dev.driver_data; int err; - DPRINTK(""); + DPRINTK("\n"); switch (frontend_state) { case XenbusStateInitialising: @@ -318,7 +318,7 @@ static int connect_ring(struct backend_i unsigned int evtchn; int err; - DPRINTK("%s", dev->otherend); + DPRINTK("%s\n", dev->otherend); err = xenbus_gather(XBT_NIL, dev->otherend, "ring-ref", "%lu", &ring_ref, "event-channel", "%u", &evtchn, NULL); diff -r 874cc0ff214d -r f9d0ee0d7de1 tools/blktap/drivers/blktapctrl.c --- a/tools/blktap/drivers/blktapctrl.c Wed Nov 01 09:55:43 2006 +0000 +++ b/tools/blktap/drivers/blktapctrl.c Thu Nov 02 12:04:57 2006 +0900 @@ -607,9 +607,11 @@ int main(int argc, char *argv[]) struct xs_handle *h; struct pollfd pfd[NUM_POLL_FDS]; pid_t process; + char buf[128]; __init_blkif(); - openlog("BLKTAPCTRL", LOG_CONS|LOG_ODELAY, LOG_DAEMON); + snprintf(buf, sizeof(buf), "BLKTAPCTRL[%d]", getpid()); + openlog(buf, LOG_CONS|LOG_ODELAY, LOG_DAEMON); daemon(0,0); print_drivers(); diff -r 874cc0ff214d -r f9d0ee0d7de1 tools/blktap/drivers/tapdisk.c --- a/tools/blktap/drivers/tapdisk.c Wed Nov 01 09:55:43 2006 +0000 +++ b/tools/blktap/drivers/tapdisk.c Thu Nov 02 12:04:57 2006 +0900 @@ -562,12 +562,14 @@ int main(int argc, char *argv[]) fd_list_entry_t *ptr; struct tap_disk *drv; struct td_state *s; + char openlogbuf[128]; if (argc != 3) usage(); daemonize(); - openlog("TAPDISK", LOG_CONS|LOG_ODELAY, LOG_DAEMON); + snprintf(openlogbuf, sizeof(openlogbuf), "TAPDISK[%d]", getpid()); + openlog(openlogbuf, LOG_CONS|LOG_ODELAY, LOG_DAEMON); /*Setup signal handlers*/ signal (SIGBUS, sig_handler); signal (SIGINT, sig_handler); diff -r 874cc0ff214d -r f9d0ee0d7de1 tools/blktap/drivers/tapdisk.h --- a/tools/blktap/drivers/tapdisk.h Wed Nov 01 09:55:43 2006 +0000 +++ b/tools/blktap/drivers/tapdisk.h Thu Nov 02 12:04:57 2006 +0900 @@ -61,7 +61,6 @@ /* Things disks need to know about, these should probably be in a higher-level * header. */ -#define MAX_REQUESTS 64 #define MAX_SEGMENTS_PER_REQ 11 #define SECTOR_SHIFT 9 #define DEFAULT_SECTOR_SIZE 512 diff -r 874cc0ff214d -r f9d0ee0d7de1 tools/blktap/lib/blktaplib.h --- a/tools/blktap/lib/blktaplib.h Wed Nov 01 09:55:43 2006 +0000 +++ b/tools/blktap/lib/blktaplib.h Thu Nov 02 12:04:57 2006 +0900 @@ -41,7 +41,7 @@ #include #include -#define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, getpagesize()) +#define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, XC_PAGE_SIZE) /* size of the extra VMA area to map in attached pages. */ #define BLKTAP_VMA_PAGES BLK_RING_SIZE @@ -74,10 +74,10 @@ static inline int BLKTAP_MODE_VALID(unsi ( arg == BLKTAP_MODE_INTERPOSE ) ); } -#define MAX_REQUESTS 64 +#define MAX_REQUESTS BLK_RING_SIZE #define BLKTAP_IOCTL_KICK 1 -#define MAX_PENDING_REQS 64 +#define MAX_PENDING_REQS BLK_RING_SIZE #define BLKTAP_DEV_DIR "/dev/xen" #define BLKTAP_DEV_NAME "blktap" #define BLKTAP_DEV_MINOR 0 @@ -199,7 +199,6 @@ int xs_fire_next_watch(struct xs_handle /* Abitrary values, must match the underlying driver... */ -#define MAX_PENDING_REQS 64 #define MAX_TAP_DEV 100 /* Accessing attached data page mappings */