mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
bitkeeper revision 1.1159.35.1 (41222da4iDbEv0TvZWP90i6L3s4Z5Q)
small 2.6 blkfront / netfront fixes
This commit is contained in:
1 parent
bc09a61ef3
commit
0d1fa4d142
2 files changed
+52
-40
No files matched your search
@@ -49,15 +49,6 @@ static int recovery = 0; /* "Recovery in progress" flag. Protected
|
||||
#define BLKIF_RING_FULL (((req_prod - resp_cons) == BLKIF_RING_SIZE) || \
|
||||
(blkif_state != BLKIF_STATE_CONNECTED))
|
||||
|
||||
/*
|
||||
* Request queues with outstanding work, but ring is currently full.
|
||||
* We need no special lock here, as we always access this with the
|
||||
* blkif_io_lock held. We only need a small maximum list.
|
||||
*/
|
||||
#define MAX_PENDING 8
|
||||
static request_queue_t *pending_queues[MAX_PENDING];
|
||||
static int nr_pending;
|
||||
|
||||
static inline void translate_req_to_mfn(blkif_request_t *xreq,
|
||||
blkif_request_t *req);
|
||||
|
||||
@@ -99,6 +90,23 @@ static inline void ADD_ID_TO_FREELIST( unsigned long id )
|
||||
|
||||
__initcall(xlblk_init);
|
||||
|
||||
|
||||
static void kick_pending_request_queues(void)
|
||||
{
|
||||
|
||||
if ( (xlbd_blk_queue != NULL) &&
|
||||
test_bit(QUEUE_FLAG_STOPPED, &xlbd_blk_queue->queue_flags) )
|
||||
{
|
||||
blk_start_queue(xlbd_blk_queue);
|
||||
/* XXXcl call to request_fn should not be needed but
|
||||
* we get stuck without... needs investigating
|
||||
*/
|
||||
xlbd_blk_queue->request_fn(xlbd_blk_queue);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
int blkif_open(struct inode *inode, struct file *filep)
|
||||
{
|
||||
struct gendisk *gd = inode->i_bdev->bd_disk;
|
||||
@@ -244,7 +252,7 @@ static int blkif_queue_request(struct request *req)
|
||||
id = GET_ID_FROM_FREELIST();
|
||||
rec_ring[id].id = (unsigned long) req;
|
||||
|
||||
//printk("r: %d req %p (%ld)\n",req_prod,req,id);
|
||||
//printk(KERN_ALERT"r: %d req %p (%ld)\n",req_prod,req,id);
|
||||
|
||||
ring_req->id = id;
|
||||
ring_req->operation = rq_data_dir(req) ? BLKIF_OP_WRITE :
|
||||
@@ -291,6 +299,8 @@ void do_blkif_request(request_queue_t *rq)
|
||||
|
||||
DPRINTK("Entered do_blkif_request\n");
|
||||
|
||||
//printk(KERN_ALERT"r: %d req\n",req_prod);
|
||||
|
||||
queued = 0;
|
||||
|
||||
while ((req = elv_next_request(rq)) != NULL) {
|
||||
@@ -347,7 +357,7 @@ static irqreturn_t blkif_int(int irq, void *dev_id, struct pt_regs *ptregs)
|
||||
id = bret->id;
|
||||
req = (struct request *)rec_ring[id].id;
|
||||
|
||||
//printk("i: %d req %p (%ld)\n",i,req,id);
|
||||
//printk(KERN_ALERT"i: %d req %p (%ld)\n",i,req,id);
|
||||
|
||||
ADD_ID_TO_FREELIST(id); // overwrites req
|
||||
|
||||
@@ -378,15 +388,7 @@ static irqreturn_t blkif_int(int irq, void *dev_id, struct pt_regs *ptregs)
|
||||
|
||||
resp_cons = i;
|
||||
|
||||
if ( (xlbd_blk_queue != NULL) &&
|
||||
test_bit(QUEUE_FLAG_STOPPED, &xlbd_blk_queue->queue_flags) )
|
||||
{
|
||||
blk_start_queue(xlbd_blk_queue);
|
||||
/* XXXcl call to request_fn should not be needed but
|
||||
* we get stuck without... needs investigating
|
||||
*/
|
||||
xlbd_blk_queue->request_fn(xlbd_blk_queue);
|
||||
}
|
||||
kick_pending_request_queues();
|
||||
|
||||
spin_unlock_irqrestore(&blkif_io_lock, flags);
|
||||
|
||||
@@ -400,6 +402,16 @@ static kdev_t sg_dev;
|
||||
static int sg_operation = -1;
|
||||
static unsigned long sg_next_sect;
|
||||
|
||||
/*
|
||||
* Request queues with outstanding work, but ring is currently full.
|
||||
* We need no special lock here, as we always access this with the
|
||||
* blkif_io_lock held. We only need a small maximum list.
|
||||
*/
|
||||
#define MAX_PENDING 8
|
||||
static request_queue_t *pending_queues[MAX_PENDING];
|
||||
static int nr_pending;
|
||||
|
||||
|
||||
#define DISABLE_SCATTERGATHER() (sg_operation = -1)
|
||||
|
||||
#define blkif_io_lock io_request_lock
|
||||
@@ -418,6 +430,18 @@ static void update_vbds_task(void *unused)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void kick_pending_request_queues(void)
|
||||
{
|
||||
/* We kick pending request queues if the ring is reasonably empty. */
|
||||
if ( (nr_pending != 0) &&
|
||||
((req_prod - resp_cons) < (BLKIF_RING_SIZE >> 1)) )
|
||||
{
|
||||
/* Attempt to drain the queue, but bail if the ring becomes full. */
|
||||
while ( (nr_pending != 0) && !BLKIF_RING_FULL )
|
||||
do_blkif_request(pending_queues[--nr_pending]);
|
||||
}
|
||||
}
|
||||
|
||||
int blkif_open(struct inode *inode, struct file *filep)
|
||||
{
|
||||
short xldev = inode->i_rdev;
|
||||
@@ -949,24 +973,13 @@ static inline void translate_req_to_mfn(blkif_request_t *xreq,
|
||||
static inline void flush_requests(void)
|
||||
{
|
||||
DISABLE_SCATTERGATHER();
|
||||
//printk(KERN_ALERT"flush %d\n",req_prod);
|
||||
wmb(); /* Ensure that the frontend can see the requests. */
|
||||
blk_ring->req_prod = req_prod;
|
||||
notify_via_evtchn(blkif_evtchn);
|
||||
}
|
||||
|
||||
|
||||
static void kick_pending_request_queues(void)
|
||||
{
|
||||
/* We kick pending request queues if the ring is reasonably empty. */
|
||||
if ( (nr_pending != 0) &&
|
||||
((req_prod - resp_cons) < (BLKIF_RING_SIZE >> 1)) )
|
||||
{
|
||||
/* Attempt to drain the queue, but bail if the ring becomes full. */
|
||||
while ( (nr_pending != 0) && !BLKIF_RING_FULL )
|
||||
do_blkif_request(pending_queues[--nr_pending]);
|
||||
}
|
||||
}
|
||||
|
||||
void blkif_control_send(blkif_request_t *req, blkif_response_t *rsp)
|
||||
{
|
||||
unsigned long flags, id;
|
||||
@@ -1016,6 +1029,7 @@ static void blkif_status_change(blkif_fe_interface_status_changed_t *status)
|
||||
{
|
||||
ctrl_msg_t cmsg;
|
||||
blkif_fe_interface_connect_t up;
|
||||
long rc;
|
||||
|
||||
if ( status->handle != 0 )
|
||||
{
|
||||
@@ -1075,11 +1089,13 @@ static void blkif_status_change(blkif_fe_interface_status_changed_t *status)
|
||||
" in state %d\n", blkif_state);
|
||||
break;
|
||||
}
|
||||
|
||||
blkif_evtchn = status->evtchn;
|
||||
blkif_irq = bind_evtchn_to_irq(blkif_evtchn);
|
||||
(void)request_irq(blkif_irq, blkif_int,
|
||||
SA_SAMPLE_RANDOM, "blkif", NULL);
|
||||
if ( (rc=request_irq(blkif_irq, blkif_int,
|
||||
SA_SAMPLE_RANDOM, "blkif", NULL)) )
|
||||
{
|
||||
printk(KERN_ALERT"blkfront request_irq failed (%ld)\n",rc);
|
||||
}
|
||||
|
||||
if ( recovery )
|
||||
{
|
||||
|
||||
@@ -721,7 +721,6 @@ static void netif_status_change(netif_fe_interface_status_changed_t *status)
|
||||
np->irq = bind_evtchn_to_irq(np->evtchn);
|
||||
(void)request_irq(np->irq, netif_int, SA_SAMPLE_RANDOM,
|
||||
dev->name, dev);
|
||||
|
||||
netctrl_connected_count();
|
||||
break;
|
||||
|
||||
@@ -906,10 +905,9 @@ void netif_suspend(void)
|
||||
sprintf(name,"eth%d",i);
|
||||
dev = __dev_get_by_name(name);
|
||||
|
||||
if ( dev && (dev->flags & IFF_UP) )
|
||||
if ( dev )
|
||||
{
|
||||
np = dev->priv;
|
||||
|
||||
free_irq(np->irq, dev);
|
||||
unbind_evtchn_from_irq(np->evtchn);
|
||||
}
|
||||
@@ -925,8 +923,6 @@ void netif_resume(void)
|
||||
struct net_private *np = NULL;
|
||||
int i;
|
||||
|
||||
|
||||
|
||||
#if 1
|
||||
/* XXX THIS IS TEMPORARY */
|
||||
|
||||
|
||||