Revert "kyber: fix out of bounds access when preempted"
This reverts commit 54dbe2d2c1
as it
breaks the kernel abi at the moment. It will be restored at a later
point in time.
Bug: 161946584
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Ida737ad962db2dc0ece0bd35ccb71e0db8e76fa2
This commit is contained in:
@@ -2210,9 +2210,10 @@ static void bfq_remove_request(struct request_queue *q,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool bfq_bio_merge(struct request_queue *q, struct bio *bio,
|
static bool bfq_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio,
|
||||||
unsigned int nr_segs)
|
unsigned int nr_segs)
|
||||||
{
|
{
|
||||||
|
struct request_queue *q = hctx->queue;
|
||||||
struct bfq_data *bfqd = q->elevator->elevator_data;
|
struct bfq_data *bfqd = q->elevator->elevator_data;
|
||||||
struct request *free = NULL;
|
struct request *free = NULL;
|
||||||
/*
|
/*
|
||||||
|
@@ -348,16 +348,14 @@ bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio,
|
|||||||
unsigned int nr_segs)
|
unsigned int nr_segs)
|
||||||
{
|
{
|
||||||
struct elevator_queue *e = q->elevator;
|
struct elevator_queue *e = q->elevator;
|
||||||
struct blk_mq_ctx *ctx;
|
struct blk_mq_ctx *ctx = blk_mq_get_ctx(q);
|
||||||
struct blk_mq_hw_ctx *hctx;
|
struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, bio->bi_opf, ctx);
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
enum hctx_type type;
|
enum hctx_type type;
|
||||||
|
|
||||||
if (e && e->type->ops.bio_merge)
|
if (e && e->type->ops.bio_merge)
|
||||||
return e->type->ops.bio_merge(q, bio, nr_segs);
|
return e->type->ops.bio_merge(hctx, bio, nr_segs);
|
||||||
|
|
||||||
ctx = blk_mq_get_ctx(q);
|
|
||||||
hctx = blk_mq_map_queue(q, bio->bi_opf, ctx);
|
|
||||||
type = hctx->type;
|
type = hctx->type;
|
||||||
if (!(hctx->flags & BLK_MQ_F_SHOULD_MERGE) ||
|
if (!(hctx->flags & BLK_MQ_F_SHOULD_MERGE) ||
|
||||||
list_empty_careful(&ctx->rq_lists[type]))
|
list_empty_careful(&ctx->rq_lists[type]))
|
||||||
|
@@ -562,12 +562,11 @@ static void kyber_limit_depth(unsigned int op, struct blk_mq_alloc_data *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool kyber_bio_merge(struct request_queue *q, struct bio *bio,
|
static bool kyber_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio,
|
||||||
unsigned int nr_segs)
|
unsigned int nr_segs)
|
||||||
{
|
{
|
||||||
struct blk_mq_ctx *ctx = blk_mq_get_ctx(q);
|
|
||||||
struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, bio->bi_opf, ctx);
|
|
||||||
struct kyber_hctx_data *khd = hctx->sched_data;
|
struct kyber_hctx_data *khd = hctx->sched_data;
|
||||||
|
struct blk_mq_ctx *ctx = blk_mq_get_ctx(hctx->queue);
|
||||||
struct kyber_ctx_queue *kcq = &khd->kcqs[ctx->index_hw[hctx->type]];
|
struct kyber_ctx_queue *kcq = &khd->kcqs[ctx->index_hw[hctx->type]];
|
||||||
unsigned int sched_domain = kyber_sched_domain(bio->bi_opf);
|
unsigned int sched_domain = kyber_sched_domain(bio->bi_opf);
|
||||||
struct list_head *rq_list = &kcq->rq_list[sched_domain];
|
struct list_head *rq_list = &kcq->rq_list[sched_domain];
|
||||||
|
@@ -461,9 +461,10 @@ static int dd_request_merge(struct request_queue *q, struct request **rq,
|
|||||||
return ELEVATOR_NO_MERGE;
|
return ELEVATOR_NO_MERGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool dd_bio_merge(struct request_queue *q, struct bio *bio,
|
static bool dd_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio,
|
||||||
unsigned int nr_segs)
|
unsigned int nr_segs)
|
||||||
{
|
{
|
||||||
|
struct request_queue *q = hctx->queue;
|
||||||
struct deadline_data *dd = q->elevator->elevator_data;
|
struct deadline_data *dd = q->elevator->elevator_data;
|
||||||
struct request *free = NULL;
|
struct request *free = NULL;
|
||||||
bool ret;
|
bool ret;
|
||||||
|
@@ -34,7 +34,7 @@ struct elevator_mq_ops {
|
|||||||
void (*depth_updated)(struct blk_mq_hw_ctx *);
|
void (*depth_updated)(struct blk_mq_hw_ctx *);
|
||||||
|
|
||||||
bool (*allow_merge)(struct request_queue *, struct request *, struct bio *);
|
bool (*allow_merge)(struct request_queue *, struct request *, struct bio *);
|
||||||
bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int);
|
bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *, unsigned int);
|
||||||
int (*request_merge)(struct request_queue *q, struct request **, struct bio *);
|
int (*request_merge)(struct request_queue *q, struct request **, struct bio *);
|
||||||
void (*request_merged)(struct request_queue *, struct request *, enum elv_merge);
|
void (*request_merged)(struct request_queue *, struct request *, enum elv_merge);
|
||||||
void (*requests_merged)(struct request_queue *, struct request *, struct request *);
|
void (*requests_merged)(struct request_queue *, struct request *, struct request *);
|
||||||
|
Reference in New Issue
Block a user