Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b47f531 authored by Jens Axboe's avatar Jens Axboe Committed by Jens Axboe
Browse files

[PATCH] generic dispatch fixes



- Split elv_dispatch_insert() into two functions
- Rename rq_last_sector() to rq_end_sector()

Signed-off-by: default avatarJens Axboe <axboe@suse.de>
parent 8922e16c
Loading
Loading
Loading
Loading
+12 −21
Original line number Original line Diff line number Diff line
@@ -40,11 +40,6 @@
static DEFINE_SPINLOCK(elv_list_lock);
static DEFINE_SPINLOCK(elv_list_lock);
static LIST_HEAD(elv_list);
static LIST_HEAD(elv_list);


static inline sector_t rq_last_sector(struct request *rq)
{
	return rq->sector + rq->nr_sectors;
}

/*
/*
 * can we safely merge with this request?
 * can we safely merge with this request?
 */
 */
@@ -148,7 +143,7 @@ static int elevator_attach(request_queue_t *q, struct elevator_type *e,
	INIT_LIST_HEAD(&q->queue_head);
	INIT_LIST_HEAD(&q->queue_head);
	q->last_merge = NULL;
	q->last_merge = NULL;
	q->elevator = eq;
	q->elevator = eq;
	q->last_sector = 0;
	q->end_sector = 0;
	q->boundary_rq = NULL;
	q->boundary_rq = NULL;
	q->max_back_kb = 0;
	q->max_back_kb = 0;


@@ -233,26 +228,22 @@ void elevator_exit(elevator_t *e)
	kfree(e);
	kfree(e);
}
}


void elv_dispatch_insert_tail(request_queue_t *q, struct request *rq)
{
}

/*
/*
 * Insert rq into dispatch queue of q.  Queue lock must be held on
 * Insert rq into dispatch queue of q.  Queue lock must be held on
 * entry.  If sort != 0, rq is sort-inserted; otherwise, rq will be
 * entry.  If sort != 0, rq is sort-inserted; otherwise, rq will be
 * appended to the dispatch queue.  To be used by specific elevators.
 * appended to the dispatch queue.  To be used by specific elevators.
 */
 */
void elv_dispatch_insert(request_queue_t *q, struct request *rq, int sort)
void elv_dispatch_sort(request_queue_t *q, struct request *rq)
{
{
	sector_t boundary;
	sector_t boundary;
	unsigned max_back;
	unsigned max_back;
	struct list_head *entry;
	struct list_head *entry;


	if (!sort) {
	boundary = q->end_sector;
		/* Specific elevator is performing sort.  Step away. */
		q->last_sector = rq_last_sector(rq);
		q->boundary_rq = rq;
		list_add_tail(&rq->queuelist, &q->queue_head);
		return;
	}

	boundary = q->last_sector;
	max_back = q->max_back_kb * 2;
	max_back = q->max_back_kb * 2;
	boundary = boundary > max_back ? boundary - max_back : 0;
	boundary = boundary > max_back ? boundary - max_back : 0;
	
	
@@ -343,10 +334,10 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
			where = ELEVATOR_INSERT_BACK;
			where = ELEVATOR_INSERT_BACK;


		/*
		/*
		 * this request is scheduling boundary, update last_sector
		 * this request is scheduling boundary, update end_sector
		 */
		 */
		if (blk_fs_request(rq)) {
		if (blk_fs_request(rq)) {
			q->last_sector = rq_last_sector(rq);
			q->end_sector = rq_end_sector(rq);
			q->boundary_rq = rq;
			q->boundary_rq = rq;
		}
		}
	}
	}
@@ -479,7 +470,7 @@ struct request *elv_next_request(request_queue_t *q)
			q->last_merge = NULL;
			q->last_merge = NULL;


		if (!q->boundary_rq || q->boundary_rq == rq) {
		if (!q->boundary_rq || q->boundary_rq == rq) {
			q->last_sector = rq_last_sector(rq);
			q->end_sector = rq_end_sector(rq);
			q->boundary_rq = NULL;
			q->boundary_rq = NULL;
		}
		}


@@ -802,7 +793,7 @@ ssize_t elv_iosched_show(request_queue_t *q, char *name)
	return len;
	return len;
}
}


EXPORT_SYMBOL(elv_dispatch_insert);
EXPORT_SYMBOL(elv_dispatch_sort);
EXPORT_SYMBOL(elv_add_request);
EXPORT_SYMBOL(elv_add_request);
EXPORT_SYMBOL(__elv_add_request);
EXPORT_SYMBOL(__elv_add_request);
EXPORT_SYMBOL(elv_requeue_request);
EXPORT_SYMBOL(elv_requeue_request);
+12 −1
Original line number Original line Diff line number Diff line
@@ -337,7 +337,7 @@ struct request_queue
	/*
	/*
	 * Dispatch queue sorting
	 * Dispatch queue sorting
	 */
	 */
	sector_t		last_sector;
	sector_t		end_sector;
	struct request		*boundary_rq;
	struct request		*boundary_rq;
	unsigned int		max_back_kb;
	unsigned int		max_back_kb;


@@ -624,6 +624,17 @@ static inline void blkdev_dequeue_request(struct request *req)
	elv_dequeue_request(req->q, req);
	elv_dequeue_request(req->q, req);
}
}


/*
 * This should be in elevator.h, but that requires pulling in rq and q
 */
static inline void elv_dispatch_add_tail(struct request_queue *q,
					 struct request *rq)
{
	q->end_sector = rq_end_sector(rq);
	q->boundary_rq = rq;
	list_add_tail(&rq->queuelist, &q->queue_head);
}

/*
/*
 * Access functions for manipulating queue properties
 * Access functions for manipulating queue properties
 */
 */
+3 −1
Original line number Original line Diff line number Diff line
@@ -79,7 +79,7 @@ struct elevator_queue
/*
/*
 * block elevator interface
 * block elevator interface
 */
 */
extern void elv_dispatch_insert(request_queue_t *, struct request *, int);
extern void elv_dispatch_sort(request_queue_t *, struct request *);
extern void elv_add_request(request_queue_t *, struct request *, int, int);
extern void elv_add_request(request_queue_t *, struct request *, int, int);
extern void __elv_add_request(request_queue_t *, struct request *, int, int);
extern void __elv_add_request(request_queue_t *, struct request *, int, int);
extern int elv_merge(request_queue_t *, struct request **, struct bio *);
extern int elv_merge(request_queue_t *, struct request **, struct bio *);
@@ -140,4 +140,6 @@ enum {
	ELV_MQUEUE_MUST,
	ELV_MQUEUE_MUST,
};
};


#define rq_end_sector(rq)	((rq)->sector + (rq)->nr_sectors)

#endif
#endif