mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 06:25:52 +02:00
Revert "Revert "kyber: fix out of bounds access when preempted""
This reverts commit 59870a78d4.
Bring back the commit in 5.10.38 that broke the kabi.
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Ic93df6ad7bb79dda947aedc31d23d69fcd97b7d7
This commit is contained in:
parent
a993cac61a
commit
df50ab971a
|
|
@ -2210,10 +2210,9 @@ static void bfq_remove_request(struct request_queue *q,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool bfq_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio,
|
static bool bfq_bio_merge(struct request_queue *q, 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,14 +348,16 @@ 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 = blk_mq_get_ctx(q);
|
struct blk_mq_ctx *ctx;
|
||||||
struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, bio->bi_opf, ctx);
|
struct blk_mq_hw_ctx *hctx;
|
||||||
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(hctx, bio, nr_segs);
|
return e->type->ops.bio_merge(q, 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,11 +562,12 @@ static void kyber_limit_depth(unsigned int op, struct blk_mq_alloc_data *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool kyber_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio,
|
static bool kyber_bio_merge(struct request_queue *q, 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,10 +461,9 @@ 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 blk_mq_hw_ctx *hctx, struct bio *bio,
|
static bool dd_bio_merge(struct request_queue *q, 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 blk_mq_hw_ctx *, struct bio *, unsigned int);
|
bool (*bio_merge)(struct request_queue *, 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 *);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user