Merge branch 'blk-softirq' of git://brick.kernel.dk/data/git/linux-2.6-block

Manual merge for trivial #include changes

+253 -139
+105 -1
block/ll_rw_blk.c
··· 26 26 #include <linux/slab.h> 27 27 #include <linux/swap.h> 28 28 #include <linux/writeback.h> 29 + #include <linux/interrupt.h> 30 + #include <linux/cpu.h> 29 31 30 32 /* 31 33 * for max sense size ··· 63 61 /* 64 62 * Controlling structure to kblockd 65 63 */ 66 - static struct workqueue_struct *kblockd_workqueue; 64 + static struct workqueue_struct *kblockd_workqueue; 67 65 68 66 unsigned long blk_max_low_pfn, blk_max_pfn; 69 67 70 68 EXPORT_SYMBOL(blk_max_low_pfn); 71 69 EXPORT_SYMBOL(blk_max_pfn); 70 + 71 + static DEFINE_PER_CPU(struct list_head, blk_cpu_done); 72 72 73 73 /* Amount of time in which a process may batch requests */ 74 74 #define BLK_BATCH_TIME (HZ/50UL) ··· 210 206 211 207 EXPORT_SYMBOL(blk_queue_merge_bvec); 212 208 209 + void blk_queue_softirq_done(request_queue_t *q, softirq_done_fn *fn) 210 + { 211 + q->softirq_done_fn = fn; 212 + } 213 + 214 + EXPORT_SYMBOL(blk_queue_softirq_done); 215 + 213 216 /** 214 217 * blk_queue_make_request - define an alternate make_request function for a device 215 218 * @q: the request queue for the device to be affected ··· 280 269 static inline void rq_init(request_queue_t *q, struct request *rq) 281 270 { 282 271 INIT_LIST_HEAD(&rq->queuelist); 272 + INIT_LIST_HEAD(&rq->donelist); 283 273 284 274 rq->errors = 0; 285 275 rq->rq_status = RQ_ACTIVE; ··· 297 285 rq->sense = NULL; 298 286 rq->end_io = NULL; 299 287 rq->end_io_data = NULL; 288 + rq->completion_data = NULL; 300 289 } 301 290 302 291 /** ··· 3275 3262 EXPORT_SYMBOL(end_that_request_chunk); 3276 3263 3277 3264 /* 3265 + * splice the completion data to a local structure and hand off to 3266 + * process_completion_queue() to complete the requests 3267 + */ 3268 + static void blk_done_softirq(struct softirq_action *h) 3269 + { 3270 + struct list_head *cpu_list; 3271 + LIST_HEAD(local_list); 3272 + 3273 + local_irq_disable(); 3274 + cpu_list = &__get_cpu_var(blk_cpu_done); 3275 + list_splice_init(cpu_list, &local_list); 3276 + local_irq_enable(); 3277 + 3278 + while (!list_empty(&local_list)) { 3279 + struct request *rq = list_entry(local_list.next, struct request, donelist); 3280 + 3281 + list_del_init(&rq->donelist); 3282 + rq->q->softirq_done_fn(rq); 3283 + } 3284 + } 3285 + 3286 + #ifdef CONFIG_HOTPLUG_CPU 3287 + 3288 + static int blk_cpu_notify(struct notifier_block *self, unsigned long action, 3289 + void *hcpu) 3290 + { 3291 + /* 3292 + * If a CPU goes away, splice its entries to the current CPU 3293 + * and trigger a run of the softirq 3294 + */ 3295 + if (action == CPU_DEAD) { 3296 + int cpu = (unsigned long) hcpu; 3297 + 3298 + local_irq_disable(); 3299 + list_splice_init(&per_cpu(blk_cpu_done, cpu), 3300 + &__get_cpu_var(blk_cpu_done)); 3301 + raise_softirq_irqoff(BLOCK_SOFTIRQ); 3302 + local_irq_enable(); 3303 + } 3304 + 3305 + return NOTIFY_OK; 3306 + } 3307 + 3308 + 3309 + static struct notifier_block __devinitdata blk_cpu_notifier = { 3310 + .notifier_call = blk_cpu_notify, 3311 + }; 3312 + 3313 + #endif /* CONFIG_HOTPLUG_CPU */ 3314 + 3315 + /** 3316 + * blk_complete_request - end I/O on a request 3317 + * @req: the request being processed 3318 + * 3319 + * Description: 3320 + * Ends all I/O on a request. It does not handle partial completions, 3321 + * unless the driver actually implements this in its completionc callback 3322 + * through requeueing. Theh actual completion happens out-of-order, 3323 + * through a softirq handler. The user must have registered a completion 3324 + * callback through blk_queue_softirq_done(). 3325 + **/ 3326 + 3327 + void blk_complete_request(struct request *req) 3328 + { 3329 + struct list_head *cpu_list; 3330 + unsigned long flags; 3331 + 3332 + BUG_ON(!req->q->softirq_done_fn); 3333 + 3334 + local_irq_save(flags); 3335 + 3336 + cpu_list = &__get_cpu_var(blk_cpu_done); 3337 + list_add_tail(&req->donelist, cpu_list); 3338 + raise_softirq_irqoff(BLOCK_SOFTIRQ); 3339 + 3340 + local_irq_restore(flags); 3341 + } 3342 + 3343 + EXPORT_SYMBOL(blk_complete_request); 3344 + 3345 + /* 3278 3346 * queue lock must be held 3279 3347 */ 3280 3348 void end_that_request_last(struct request *req, int uptodate) ··· 3433 3339 3434 3340 int __init blk_dev_init(void) 3435 3341 { 3342 + int i; 3343 + 3436 3344 kblockd_workqueue = create_workqueue("kblockd"); 3437 3345 if (!kblockd_workqueue) 3438 3346 panic("Failed to create kblockd\n"); ··· 3447 3351 3448 3352 iocontext_cachep = kmem_cache_create("blkdev_ioc", 3449 3353 sizeof(struct io_context), 0, SLAB_PANIC, NULL, NULL); 3354 + 3355 + for (i = 0; i < NR_CPUS; i++) 3356 + INIT_LIST_HEAD(&per_cpu(blk_cpu_done, i)); 3357 + 3358 + open_softirq(BLOCK_SOFTIRQ, blk_done_softirq, NULL); 3359 + #ifdef CONFIG_HOTPLUG_CPU 3360 + register_cpu_notifier(&blk_cpu_notifier); 3361 + #endif 3450 3362 3451 3363 blk_max_low_pfn = max_low_pfn; 3452 3364 blk_max_pfn = max_pfn;
+46 -26
drivers/block/cciss.c
··· 2178 2178 2179 2179 start_io(h); 2180 2180 } 2181 + 2182 + static void cciss_softirq_done(struct request *rq) 2183 + { 2184 + CommandList_struct *cmd = rq->completion_data; 2185 + ctlr_info_t *h = hba[cmd->ctlr]; 2186 + u64bit temp64; 2187 + int i, ddir; 2188 + 2189 + if (cmd->Request.Type.Direction == XFER_READ) 2190 + ddir = PCI_DMA_FROMDEVICE; 2191 + else 2192 + ddir = PCI_DMA_TODEVICE; 2193 + 2194 + /* command did not need to be retried */ 2195 + /* unmap the DMA mapping for all the scatter gather elements */ 2196 + for(i=0; i<cmd->Header.SGList; i++) { 2197 + temp64.val32.lower = cmd->SG[i].Addr.lower; 2198 + temp64.val32.upper = cmd->SG[i].Addr.upper; 2199 + pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir); 2200 + } 2201 + 2202 + complete_buffers(rq->bio, rq->errors); 2203 + 2204 + #ifdef CCISS_DEBUG 2205 + printk("Done with %p\n", rq); 2206 + #endif /* CCISS_DEBUG */ 2207 + 2208 + spin_lock_irq(&h->lock); 2209 + end_that_request_last(rq, rq->errors); 2210 + cmd_free(h, cmd,1); 2211 + spin_unlock_irq(&h->lock); 2212 + } 2213 + 2181 2214 /* checks the status of the job and calls complete buffers to mark all 2182 - * buffers for the completed job. 2215 + * buffers for the completed job. Note that this function does not need 2216 + * to hold the hba/queue lock. 2183 2217 */ 2184 2218 static inline void complete_command( ctlr_info_t *h, CommandList_struct *cmd, 2185 2219 int timeout) 2186 2220 { 2187 2221 int status = 1; 2188 - int i; 2189 2222 int retry_cmd = 0; 2190 - u64bit temp64; 2191 2223 2192 2224 if (timeout) 2193 2225 status = 0; ··· 2327 2295 resend_cciss_cmd(h,cmd); 2328 2296 return; 2329 2297 } 2330 - /* command did not need to be retried */ 2331 - /* unmap the DMA mapping for all the scatter gather elements */ 2332 - for(i=0; i<cmd->Header.SGList; i++) { 2333 - temp64.val32.lower = cmd->SG[i].Addr.lower; 2334 - temp64.val32.upper = cmd->SG[i].Addr.upper; 2335 - pci_unmap_page(hba[cmd->ctlr]->pdev, 2336 - temp64.val, cmd->SG[i].Len, 2337 - (cmd->Request.Type.Direction == XFER_READ) ? 2338 - PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); 2339 - } 2340 - complete_buffers(cmd->rq->bio, status); 2341 2298 2342 - #ifdef CCISS_DEBUG 2343 - printk("Done with %p\n", cmd->rq); 2344 - #endif /* CCISS_DEBUG */ 2345 - 2346 - end_that_request_last(cmd->rq, status ? 1 : -EIO); 2347 - cmd_free(h,cmd,1); 2299 + cmd->rq->completion_data = cmd; 2300 + cmd->rq->errors = status; 2301 + blk_complete_request(cmd->rq); 2348 2302 } 2349 2303 2350 2304 /* ··· 3217 3199 drv->queue = q; 3218 3200 3219 3201 q->backing_dev_info.ra_pages = READ_AHEAD; 3220 - blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask); 3202 + blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask); 3221 3203 3222 - /* This is a hardware imposed limit. */ 3223 - blk_queue_max_hw_segments(q, MAXSGENTRIES); 3204 + /* This is a hardware imposed limit. */ 3205 + blk_queue_max_hw_segments(q, MAXSGENTRIES); 3224 3206 3225 - /* This is a limit in the driver and could be eliminated. */ 3226 - blk_queue_max_phys_segments(q, MAXSGENTRIES); 3207 + /* This is a limit in the driver and could be eliminated. */ 3208 + blk_queue_max_phys_segments(q, MAXSGENTRIES); 3227 3209 3228 - blk_queue_max_sectors(q, 512); 3210 + blk_queue_max_sectors(q, 512); 3211 + 3212 + blk_queue_softirq_done(q, cciss_softirq_done); 3229 3213 3230 3214 q->queuedata = hba[i]; 3231 3215 sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
+35 -7
drivers/ide/ide-io.c
··· 55 55 #include <asm/io.h> 56 56 #include <asm/bitops.h> 57 57 58 + void ide_softirq_done(struct request *rq) 59 + { 60 + request_queue_t *q = rq->q; 61 + 62 + add_disk_randomness(rq->rq_disk); 63 + end_that_request_chunk(rq, rq->errors, rq->data_len); 64 + 65 + spin_lock_irq(q->queue_lock); 66 + end_that_request_last(rq, rq->errors); 67 + spin_unlock_irq(q->queue_lock); 68 + } 69 + 58 70 int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate, 59 71 int nr_sectors) 60 72 { 73 + unsigned int nbytes; 61 74 int ret = 1; 62 75 63 76 BUG_ON(!(rq->flags & REQ_STARTED)); ··· 94 81 HWGROUP(drive)->hwif->ide_dma_on(drive); 95 82 } 96 83 97 - if (!end_that_request_first(rq, uptodate, nr_sectors)) { 98 - add_disk_randomness(rq->rq_disk); 99 - 100 - if (blk_rq_tagged(rq)) 101 - blk_queue_end_tag(drive->queue, rq); 102 - 84 + /* 85 + * For partial completions (or non fs/pc requests), use the regular 86 + * direct completion path. 87 + */ 88 + nbytes = nr_sectors << 9; 89 + if (rq_all_done(rq, nbytes)) { 90 + rq->errors = uptodate; 91 + rq->data_len = nbytes; 103 92 blkdev_dequeue_request(rq); 104 93 HWGROUP(drive)->rq = NULL; 105 - end_that_request_last(rq, uptodate); 94 + blk_complete_request(rq); 106 95 ret = 0; 96 + } else { 97 + if (!end_that_request_first(rq, uptodate, nr_sectors)) { 98 + add_disk_randomness(rq->rq_disk); 99 + blkdev_dequeue_request(rq); 100 + HWGROUP(drive)->rq = NULL; 101 + end_that_request_last(rq, uptodate); 102 + ret = 0; 103 + } 107 104 } 105 + 108 106 return ret; 109 107 } 110 108 EXPORT_SYMBOL(__ide_end_request); ··· 137 113 unsigned long flags; 138 114 int ret = 1; 139 115 116 + /* 117 + * room for locking improvements here, the calls below don't 118 + * need the queue lock held at all 119 + */ 140 120 spin_lock_irqsave(&ide_lock, flags); 141 121 rq = HWGROUP(drive)->rq; 142 122
+2
drivers/ide/ide-probe.c
··· 1011 1011 blk_queue_max_hw_segments(q, max_sg_entries); 1012 1012 blk_queue_max_phys_segments(q, max_sg_entries); 1013 1013 1014 + blk_queue_softirq_done(q, ide_softirq_done); 1015 + 1014 1016 /* assign drive queue */ 1015 1017 drive->queue = q; 1016 1018
+8 -101
drivers/scsi/scsi.c
··· 69 69 #include "scsi_logging.h" 70 70 71 71 static void scsi_done(struct scsi_cmnd *cmd); 72 - static int scsi_retry_command(struct scsi_cmnd *cmd); 73 72 74 73 /* 75 74 * Definitions and constants. ··· 751 752 * isn't running --- used by scsi_times_out */ 752 753 void __scsi_done(struct scsi_cmnd *cmd) 753 754 { 754 - unsigned long flags; 755 + struct request *rq = cmd->request; 755 756 756 757 /* 757 758 * Set the serial numbers back to zero ··· 762 763 if (cmd->result) 763 764 atomic_inc(&cmd->device->ioerr_cnt); 764 765 766 + BUG_ON(!rq); 767 + 765 768 /* 766 - * Next, enqueue the command into the done queue. 767 - * It is a per-CPU queue, so we just disable local interrupts 768 - * and need no spinlock. 769 + * The uptodate/nbytes values don't matter, as we allow partial 770 + * completes and thus will check this in the softirq callback 769 771 */ 770 - local_irq_save(flags); 771 - list_add_tail(&cmd->eh_entry, &__get_cpu_var(scsi_done_q)); 772 - raise_softirq_irqoff(SCSI_SOFTIRQ); 773 - local_irq_restore(flags); 774 - } 775 - 776 - /** 777 - * scsi_softirq - Perform post-interrupt processing of finished SCSI commands. 778 - * 779 - * This is the consumer of the done queue. 780 - * 781 - * This is called with all interrupts enabled. This should reduce 782 - * interrupt latency, stack depth, and reentrancy of the low-level 783 - * drivers. 784 - */ 785 - static void scsi_softirq(struct softirq_action *h) 786 - { 787 - int disposition; 788 - LIST_HEAD(local_q); 789 - 790 - local_irq_disable(); 791 - list_splice_init(&__get_cpu_var(scsi_done_q), &local_q); 792 - local_irq_enable(); 793 - 794 - while (!list_empty(&local_q)) { 795 - struct scsi_cmnd *cmd = list_entry(local_q.next, 796 - struct scsi_cmnd, eh_entry); 797 - /* The longest time any command should be outstanding is the 798 - * per command timeout multiplied by the number of retries. 799 - * 800 - * For a typical command, this is 2.5 minutes */ 801 - unsigned long wait_for 802 - = cmd->allowed * cmd->timeout_per_command; 803 - list_del_init(&cmd->eh_entry); 804 - 805 - disposition = scsi_decide_disposition(cmd); 806 - if (disposition != SUCCESS && 807 - time_before(cmd->jiffies_at_alloc + wait_for, jiffies)) { 808 - sdev_printk(KERN_ERR, cmd->device, 809 - "timing out command, waited %lus\n", 810 - wait_for/HZ); 811 - disposition = SUCCESS; 812 - } 813 - 814 - scsi_log_completion(cmd, disposition); 815 - switch (disposition) { 816 - case SUCCESS: 817 - scsi_finish_command(cmd); 818 - break; 819 - case NEEDS_RETRY: 820 - scsi_retry_command(cmd); 821 - break; 822 - case ADD_TO_MLQUEUE: 823 - scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY); 824 - break; 825 - default: 826 - if (!scsi_eh_scmd_add(cmd, 0)) 827 - scsi_finish_command(cmd); 828 - } 829 - } 772 + rq->completion_data = cmd; 773 + blk_complete_request(rq); 830 774 } 831 775 832 776 /* ··· 782 840 * level drivers should not become re-entrant as a result of 783 841 * this. 784 842 */ 785 - static int scsi_retry_command(struct scsi_cmnd *cmd) 843 + int scsi_retry_command(struct scsi_cmnd *cmd) 786 844 { 787 845 /* 788 846 * Restore the SCSI command state. ··· 1215 1273 } 1216 1274 EXPORT_SYMBOL(scsi_device_cancel); 1217 1275 1218 - #ifdef CONFIG_HOTPLUG_CPU 1219 - static int scsi_cpu_notify(struct notifier_block *self, 1220 - unsigned long action, void *hcpu) 1221 - { 1222 - int cpu = (unsigned long)hcpu; 1223 - 1224 - switch(action) { 1225 - case CPU_DEAD: 1226 - /* Drain scsi_done_q. */ 1227 - local_irq_disable(); 1228 - list_splice_init(&per_cpu(scsi_done_q, cpu), 1229 - &__get_cpu_var(scsi_done_q)); 1230 - raise_softirq_irqoff(SCSI_SOFTIRQ); 1231 - local_irq_enable(); 1232 - break; 1233 - default: 1234 - break; 1235 - } 1236 - return NOTIFY_OK; 1237 - } 1238 - 1239 - static struct notifier_block __devinitdata scsi_cpu_nb = { 1240 - .notifier_call = scsi_cpu_notify, 1241 - }; 1242 - 1243 - #define register_scsi_cpu() register_cpu_notifier(&scsi_cpu_nb) 1244 - #define unregister_scsi_cpu() unregister_cpu_notifier(&scsi_cpu_nb) 1245 - #else 1246 - #define register_scsi_cpu() 1247 - #define unregister_scsi_cpu() 1248 - #endif /* CONFIG_HOTPLUG_CPU */ 1249 - 1250 1276 MODULE_DESCRIPTION("SCSI core"); 1251 1277 MODULE_LICENSE("GPL"); 1252 1278 ··· 1248 1338 INIT_LIST_HEAD(&per_cpu(scsi_done_q, i)); 1249 1339 1250 1340 devfs_mk_dir("scsi"); 1251 - open_softirq(SCSI_SOFTIRQ, scsi_softirq, NULL); 1252 - register_scsi_cpu(); 1253 1341 printk(KERN_NOTICE "SCSI subsystem initialized\n"); 1254 1342 return 0; 1255 1343 ··· 1275 1367 devfs_remove("scsi"); 1276 1368 scsi_exit_procfs(); 1277 1369 scsi_exit_queue(); 1278 - unregister_scsi_cpu(); 1279 1370 } 1280 1371 1281 1372 subsys_initcall(init_scsi);
+36
drivers/scsi/scsi_lib.c
··· 1493 1493 __scsi_done(cmd); 1494 1494 } 1495 1495 1496 + static void scsi_softirq_done(struct request *rq) 1497 + { 1498 + struct scsi_cmnd *cmd = rq->completion_data; 1499 + unsigned long wait_for = cmd->allowed * cmd->timeout_per_command; 1500 + int disposition; 1501 + 1502 + INIT_LIST_HEAD(&cmd->eh_entry); 1503 + 1504 + disposition = scsi_decide_disposition(cmd); 1505 + if (disposition != SUCCESS && 1506 + time_before(cmd->jiffies_at_alloc + wait_for, jiffies)) { 1507 + sdev_printk(KERN_ERR, cmd->device, 1508 + "timing out command, waited %lus\n", 1509 + wait_for/HZ); 1510 + disposition = SUCCESS; 1511 + } 1512 + 1513 + scsi_log_completion(cmd, disposition); 1514 + 1515 + switch (disposition) { 1516 + case SUCCESS: 1517 + scsi_finish_command(cmd); 1518 + break; 1519 + case NEEDS_RETRY: 1520 + scsi_retry_command(cmd); 1521 + break; 1522 + case ADD_TO_MLQUEUE: 1523 + scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY); 1524 + break; 1525 + default: 1526 + if (!scsi_eh_scmd_add(cmd, 0)) 1527 + scsi_finish_command(cmd); 1528 + } 1529 + } 1530 + 1496 1531 /* 1497 1532 * Function: scsi_request_fn() 1498 1533 * ··· 1702 1667 blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost)); 1703 1668 blk_queue_segment_boundary(q, shost->dma_boundary); 1704 1669 blk_queue_issue_flush_fn(q, scsi_issue_flush_fn); 1670 + blk_queue_softirq_done(q, scsi_softirq_done); 1705 1671 1706 1672 if (!shost->use_clustering) 1707 1673 clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
+1
drivers/scsi/scsi_priv.h
··· 44 44 struct scsi_request *sreq); 45 45 extern void __scsi_release_request(struct scsi_request *sreq); 46 46 extern void __scsi_done(struct scsi_cmnd *cmd); 47 + extern int scsi_retry_command(struct scsi_cmnd *cmd); 47 48 #ifdef CONFIG_SCSI_LOGGING 48 49 void scsi_log_send(struct scsi_cmnd *cmd); 49 50 void scsi_log_completion(struct scsi_cmnd *cmd, int disposition);
+18 -3
include/linux/blkdev.h
··· 118 118 * try to put the fields that are referenced together in the same cacheline 119 119 */ 120 120 struct request { 121 - struct list_head queuelist; /* looking for ->queue? you must _not_ 122 - * access it directly, use 123 - * blkdev_dequeue_request! */ 121 + struct list_head queuelist; 122 + struct list_head donelist; 123 + 124 124 unsigned long flags; /* see REQ_ bits below */ 125 125 126 126 /* Maintain bio traversal state for part by part I/O submission. ··· 141 141 struct bio *biotail; 142 142 143 143 void *elevator_private; 144 + void *completion_data; 144 145 145 146 unsigned short ioprio; 146 147 ··· 292 291 typedef void (activity_fn) (void *data, int rw); 293 292 typedef int (issue_flush_fn) (request_queue_t *, struct gendisk *, sector_t *); 294 293 typedef void (prepare_flush_fn) (request_queue_t *, struct request *); 294 + typedef void (softirq_done_fn)(struct request *); 295 295 296 296 enum blk_queue_state { 297 297 Queue_down, ··· 334 332 activity_fn *activity_fn; 335 333 issue_flush_fn *issue_flush_fn; 336 334 prepare_flush_fn *prepare_flush_fn; 335 + softirq_done_fn *softirq_done_fn; 337 336 338 337 /* 339 338 * Dispatch queue sorting ··· 648 645 extern int end_that_request_chunk(struct request *, int, int); 649 646 extern void end_that_request_last(struct request *, int); 650 647 extern void end_request(struct request *req, int uptodate); 648 + extern void blk_complete_request(struct request *); 649 + 650 + static inline int rq_all_done(struct request *rq, unsigned int nr_bytes) 651 + { 652 + if (blk_fs_request(rq)) 653 + return (nr_bytes >= (rq->hard_nr_sectors << 9)); 654 + else if (blk_pc_request(rq)) 655 + return nr_bytes >= rq->data_len; 656 + 657 + return 0; 658 + } 651 659 652 660 /* 653 661 * end_that_request_first/chunk() takes an uptodate argument. we account ··· 707 693 extern void blk_queue_prep_rq(request_queue_t *, prep_rq_fn *pfn); 708 694 extern void blk_queue_merge_bvec(request_queue_t *, merge_bvec_fn *); 709 695 extern void blk_queue_dma_alignment(request_queue_t *, int); 696 + extern void blk_queue_softirq_done(request_queue_t *, softirq_done_fn *); 710 697 extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); 711 698 extern int blk_queue_ordered(request_queue_t *, unsigned, prepare_flush_fn *); 712 699 extern void blk_queue_issue_flush_fn(request_queue_t *, issue_flush_fn *);
+1
include/linux/ide.h
··· 1001 1001 1002 1002 extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs); 1003 1003 extern int __ide_end_request (ide_drive_t *drive, struct request *rq, int uptodate, int nrsecs); 1004 + extern void ide_softirq_done(struct request *rq); 1004 1005 1005 1006 /* 1006 1007 * This is used on exit from the driver to designate the next irq handler
+1 -1
include/linux/interrupt.h
··· 112 112 TIMER_SOFTIRQ, 113 113 NET_TX_SOFTIRQ, 114 114 NET_RX_SOFTIRQ, 115 - SCSI_SOFTIRQ, 115 + BLOCK_SOFTIRQ, 116 116 TASKLET_SOFTIRQ 117 117 }; 118 118