Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 17110
b: refs/heads/master
c: b887030
h: refs/heads/master
v: v3
  • Loading branch information
Andrew Chew authored and Jeff Garzik committed Jan 9, 2006
1 parent 453f062 commit eb5dd3b
Show file tree
Hide file tree
Showing 48 changed files with 491 additions and 644 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cf10b2853f86e714eac7117484c0d368ce710fa4
refs/heads/master: b887030aec0971a47ca97a18e93ff446bc7d049e
2 changes: 2 additions & 0 deletions trunk/Documentation/networking/bonding.txt
Original file line number Diff line number Diff line change
Expand Up @@ -945,13 +945,15 @@ bond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
collisions:0 txqueuelen:0

eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0
TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0
collisions:0 txqueuelen:100
Interrupt:10 Base address:0x1080

eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0
TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
Expand Down
1 change: 1 addition & 0 deletions trunk/MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -1697,6 +1697,7 @@ S: Maintained

MARVELL MV64340 ETHERNET DRIVER
P: Manish Lachwani
M: Manish_Lachwani@pmc-sierra.com
L: linux-mips@linux-mips.org
L: netdev@vger.kernel.org
S: Supported
Expand Down
3 changes: 2 additions & 1 deletion trunk/block/elevator.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ inline int elv_rq_merge_ok(struct request *rq, struct bio *bio)
}
EXPORT_SYMBOL(elv_rq_merge_ok);

static inline int elv_try_merge(struct request *__rq, struct bio *bio)
inline int elv_try_merge(struct request *__rq, struct bio *bio)
{
int ret = ELEVATOR_NO_MERGE;

Expand All @@ -80,6 +80,7 @@ static inline int elv_try_merge(struct request *__rq, struct bio *bio)

return ret;
}
EXPORT_SYMBOL(elv_try_merge);

static struct elevator_type *elevator_find(const char *name)
{
Expand Down
131 changes: 26 additions & 105 deletions trunk/block/ll_rw_blk.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@
#include <linux/slab.h>
#include <linux/swap.h>
#include <linux/writeback.h>
#include <linux/interrupt.h>
#include <linux/cpu.h>
#include <linux/blkdev.h>

/*
* for max sense size
Expand Down Expand Up @@ -63,15 +62,13 @@ static wait_queue_head_t congestion_wqh[2] = {
/*
* Controlling structure to kblockd
*/
static struct workqueue_struct *kblockd_workqueue;
static struct workqueue_struct *kblockd_workqueue;

unsigned long blk_max_low_pfn, blk_max_pfn;

EXPORT_SYMBOL(blk_max_low_pfn);
EXPORT_SYMBOL(blk_max_pfn);

static DEFINE_PER_CPU(struct list_head, blk_cpu_done);

/* Amount of time in which a process may batch requests */
#define BLK_BATCH_TIME (HZ/50UL)

Expand Down Expand Up @@ -210,13 +207,6 @@ void blk_queue_merge_bvec(request_queue_t *q, merge_bvec_fn *mbfn)

EXPORT_SYMBOL(blk_queue_merge_bvec);

void blk_queue_softirq_done(request_queue_t *q, softirq_done_fn *fn)
{
q->softirq_done_fn = fn;
}

EXPORT_SYMBOL(blk_queue_softirq_done);

/**
* blk_queue_make_request - define an alternate make_request function for a device
* @q: the request queue for the device to be affected
Expand Down Expand Up @@ -280,7 +270,6 @@ EXPORT_SYMBOL(blk_queue_make_request);
static inline void rq_init(request_queue_t *q, struct request *rq)
{
INIT_LIST_HEAD(&rq->queuelist);
INIT_LIST_HEAD(&rq->donelist);

rq->errors = 0;
rq->rq_status = RQ_ACTIVE;
Expand All @@ -297,7 +286,6 @@ static inline void rq_init(request_queue_t *q, struct request *rq)
rq->sense = NULL;
rq->end_io = NULL;
rq->end_io_data = NULL;
rq->completion_data = NULL;
}

/**
Expand Down Expand Up @@ -2747,6 +2735,30 @@ static inline int attempt_front_merge(request_queue_t *q, struct request *rq)
return 0;
}

/**
* blk_attempt_remerge - attempt to remerge active head with next request
* @q: The &request_queue_t belonging to the device
* @rq: The head request (usually)
*
* Description:
* For head-active devices, the queue can easily be unplugged so quickly
* that proper merging is not done on the front request. This may hurt
* performance greatly for some devices. The block layer cannot safely
* do merging on that first request for these queues, but the driver can
* call this function and make it happen any way. Only the driver knows
* when it is safe to do so.
**/
void blk_attempt_remerge(request_queue_t *q, struct request *rq)
{
unsigned long flags;

spin_lock_irqsave(q->queue_lock, flags);
attempt_back_merge(q, rq);
spin_unlock_irqrestore(q->queue_lock, flags);
}

EXPORT_SYMBOL(blk_attempt_remerge);

static void init_request_from_bio(struct request *req, struct bio *bio)
{
req->flags |= REQ_CMD;
Expand Down Expand Up @@ -3274,87 +3286,6 @@ int end_that_request_chunk(struct request *req, int uptodate, int nr_bytes)

EXPORT_SYMBOL(end_that_request_chunk);

/*
* splice the completion data to a local structure and hand off to
* process_completion_queue() to complete the requests
*/
static void blk_done_softirq(struct softirq_action *h)
{
struct list_head *cpu_list;
LIST_HEAD(local_list);

local_irq_disable();
cpu_list = &__get_cpu_var(blk_cpu_done);
list_splice_init(cpu_list, &local_list);
local_irq_enable();

while (!list_empty(&local_list)) {
struct request *rq = list_entry(local_list.next, struct request, donelist);

list_del_init(&rq->donelist);
rq->q->softirq_done_fn(rq);
}
}

#ifdef CONFIG_HOTPLUG_CPU

static int blk_cpu_notify(struct notifier_block *self, unsigned long action,
void *hcpu)
{
/*
* If a CPU goes away, splice its entries to the current CPU
* and trigger a run of the softirq
*/
if (action == CPU_DEAD) {
int cpu = (unsigned long) hcpu;

local_irq_disable();
list_splice_init(&per_cpu(blk_cpu_done, cpu),
&__get_cpu_var(blk_cpu_done));
raise_softirq_irqoff(BLOCK_SOFTIRQ);
local_irq_enable();
}

return NOTIFY_OK;
}


static struct notifier_block __devinitdata blk_cpu_notifier = {
.notifier_call = blk_cpu_notify,
};

#endif /* CONFIG_HOTPLUG_CPU */

/**
* blk_complete_request - end I/O on a request
* @req: the request being processed
*
* Description:
* Ends all I/O on a request. It does not handle partial completions,
* unless the driver actually implements this in its completionc callback
* through requeueing. Theh actual completion happens out-of-order,
* through a softirq handler. The user must have registered a completion
* callback through blk_queue_softirq_done().
**/

void blk_complete_request(struct request *req)
{
struct list_head *cpu_list;
unsigned long flags;

BUG_ON(!req->q->softirq_done_fn);

local_irq_save(flags);

cpu_list = &__get_cpu_var(blk_cpu_done);
list_add_tail(&req->donelist, cpu_list);
raise_softirq_irqoff(BLOCK_SOFTIRQ);

local_irq_restore(flags);
}

EXPORT_SYMBOL(blk_complete_request);

/*
* queue lock must be held
*/
Expand Down Expand Up @@ -3433,8 +3364,6 @@ EXPORT_SYMBOL(kblockd_flush);

int __init blk_dev_init(void)
{
int i;

kblockd_workqueue = create_workqueue("kblockd");
if (!kblockd_workqueue)
panic("Failed to create kblockd\n");
Expand All @@ -3448,14 +3377,6 @@ int __init blk_dev_init(void)
iocontext_cachep = kmem_cache_create("blkdev_ioc",
sizeof(struct io_context), 0, SLAB_PANIC, NULL, NULL);

for (i = 0; i < NR_CPUS; i++)
INIT_LIST_HEAD(&per_cpu(blk_cpu_done, i));

open_softirq(BLOCK_SOFTIRQ, blk_done_softirq, NULL);
#ifdef CONFIG_HOTPLUG_CPU
register_cpu_notifier(&blk_cpu_notifier);
#endif

blk_max_low_pfn = max_low_pfn;
blk_max_pfn = max_pfn;

Expand Down
13 changes: 4 additions & 9 deletions trunk/block/scsi_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,21 +190,16 @@ static int verify_command(struct file *file, unsigned char *cmd)
safe_for_write(GPCMD_SET_STREAMING),
};
unsigned char type = cmd_type[cmd[0]];
int has_write_perm = 0;

/* Anybody who can open the device can do a read-safe command */
if (type & CMD_READ_SAFE)
return 0;

/*
* file can be NULL from ioctl_by_bdev()...
*/
if (file)
has_write_perm = file->f_mode & FMODE_WRITE;

/* Write-safe commands just require a writable open.. */
if ((type & CMD_WRITE_SAFE) && has_write_perm)
return 0;
if (type & CMD_WRITE_SAFE) {
if (file->f_mode & FMODE_WRITE)
return 0;
}

/* And root can do any command.. */
if (capable(CAP_SYS_RAWIO))
Expand Down
72 changes: 26 additions & 46 deletions trunk/drivers/block/cciss.c
Original file line number Diff line number Diff line change
Expand Up @@ -2178,48 +2178,16 @@ static inline void resend_cciss_cmd( ctlr_info_t *h, CommandList_struct *c)

start_io(h);
}

static void cciss_softirq_done(struct request *rq)
{
CommandList_struct *cmd = rq->completion_data;
ctlr_info_t *h = hba[cmd->ctlr];
u64bit temp64;
int i, ddir;

if (cmd->Request.Type.Direction == XFER_READ)
ddir = PCI_DMA_FROMDEVICE;
else
ddir = PCI_DMA_TODEVICE;

/* command did not need to be retried */
/* unmap the DMA mapping for all the scatter gather elements */
for(i=0; i<cmd->Header.SGList; i++) {
temp64.val32.lower = cmd->SG[i].Addr.lower;
temp64.val32.upper = cmd->SG[i].Addr.upper;
pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
}

complete_buffers(rq->bio, rq->errors);

#ifdef CCISS_DEBUG
printk("Done with %p\n", rq);
#endif /* CCISS_DEBUG */

spin_lock_irq(&h->lock);
end_that_request_last(rq, rq->errors);
cmd_free(h, cmd,1);
spin_unlock_irq(&h->lock);
}

/* checks the status of the job and calls complete buffers to mark all
* buffers for the completed job. Note that this function does not need
* to hold the hba/queue lock.
* buffers for the completed job.
*/
static inline void complete_command( ctlr_info_t *h, CommandList_struct *cmd,
int timeout)
{
int status = 1;
int i;
int retry_cmd = 0;
u64bit temp64;

if (timeout)
status = 0;
Expand Down Expand Up @@ -2327,10 +2295,24 @@ static inline void complete_command( ctlr_info_t *h, CommandList_struct *cmd,
resend_cciss_cmd(h,cmd);
return;
}
/* command did not need to be retried */
/* unmap the DMA mapping for all the scatter gather elements */
for(i=0; i<cmd->Header.SGList; i++) {
temp64.val32.lower = cmd->SG[i].Addr.lower;
temp64.val32.upper = cmd->SG[i].Addr.upper;
pci_unmap_page(hba[cmd->ctlr]->pdev,
temp64.val, cmd->SG[i].Len,
(cmd->Request.Type.Direction == XFER_READ) ?
PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
}
complete_buffers(cmd->rq->bio, status);

#ifdef CCISS_DEBUG
printk("Done with %p\n", cmd->rq);
#endif /* CCISS_DEBUG */

cmd->rq->completion_data = cmd;
cmd->rq->errors = status;
blk_complete_request(cmd->rq);
end_that_request_last(cmd->rq, status ? 1 : -EIO);
cmd_free(h,cmd,1);
}

/*
Expand Down Expand Up @@ -3217,17 +3199,15 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
drv->queue = q;

q->backing_dev_info.ra_pages = READ_AHEAD;
blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);

/* This is a hardware imposed limit. */
blk_queue_max_hw_segments(q, MAXSGENTRIES);
blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);

/* This is a limit in the driver and could be eliminated. */
blk_queue_max_phys_segments(q, MAXSGENTRIES);
/* This is a hardware imposed limit. */
blk_queue_max_hw_segments(q, MAXSGENTRIES);

blk_queue_max_sectors(q, 512);
/* This is a limit in the driver and could be eliminated. */
blk_queue_max_phys_segments(q, MAXSGENTRIES);

blk_queue_softirq_done(q, cciss_softirq_done);
blk_queue_max_sectors(q, 512);

q->queuedata = hba[i];
sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
Expand Down
10 changes: 10 additions & 0 deletions trunk/drivers/ide/ide-cd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1332,6 +1332,8 @@ static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
if (cdrom_read_from_buffer(drive))
return ide_stopped;

blk_attempt_remerge(drive->queue, rq);

/* Clear the local sector buffer. */
info->nsectors_buffered = 0;

Expand Down Expand Up @@ -1872,6 +1874,14 @@ static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
return ide_stopped;
}

/*
* for dvd-ram and such media, it's a really big deal to get
* big writes all the time. so scour the queue and attempt to
* remerge requests, often the plugging will not have had time
* to do this properly
*/
blk_attempt_remerge(drive->queue, rq);

info->nsectors_buffered = 0;

/* use dma, if possible. we don't need to check more, since we
Expand Down
Loading

0 comments on commit eb5dd3b

Please sign in to comment.