Skip to content

Commit c411080

Browse files
Christoph Hellwigaxboe
authored andcommitted
kyber: avoid q->disk dereferences in trace points
q->disk becomes invalid after the gendisk is removed. Work around this by caching the dev_t for the tracepoints. The real fix would be to properly tear down the I/O schedulers with the gendisk, but that is a much more invasive change. Signed-off-by: Christoph Hellwig <[email protected]> Link: https://lore.kernel.org/r/[email protected] Tested-by: Yi Zhang <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent aec89dc commit c411080

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

block/kyber-iosched.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ struct kyber_ctx_queue {
151151

152152
struct kyber_queue_data {
153153
struct request_queue *q;
154+
dev_t dev;
154155

155156
/*
156157
* Each scheduling domain has a limited number of in-flight requests
@@ -257,7 +258,7 @@ static int calculate_percentile(struct kyber_queue_data *kqd,
257258
}
258259
memset(buckets, 0, sizeof(kqd->latency_buckets[sched_domain][type]));
259260

260-
trace_kyber_latency(kqd->q, kyber_domain_names[sched_domain],
261+
trace_kyber_latency(kqd->dev, kyber_domain_names[sched_domain],
261262
kyber_latency_type_names[type], percentile,
262263
bucket + 1, 1 << KYBER_LATENCY_SHIFT, samples);
263264

@@ -270,7 +271,7 @@ static void kyber_resize_domain(struct kyber_queue_data *kqd,
270271
depth = clamp(depth, 1U, kyber_depth[sched_domain]);
271272
if (depth != kqd->domain_tokens[sched_domain].sb.depth) {
272273
sbitmap_queue_resize(&kqd->domain_tokens[sched_domain], depth);
273-
trace_kyber_adjust(kqd->q, kyber_domain_names[sched_domain],
274+
trace_kyber_adjust(kqd->dev, kyber_domain_names[sched_domain],
274275
depth);
275276
}
276277
}
@@ -366,6 +367,7 @@ static struct kyber_queue_data *kyber_queue_data_alloc(struct request_queue *q)
366367
goto err;
367368

368369
kqd->q = q;
370+
kqd->dev = disk_devt(q->disk);
369371

370372
kqd->cpu_latency = alloc_percpu_gfp(struct kyber_cpu_latency,
371373
GFP_KERNEL | __GFP_ZERO);
@@ -774,7 +776,7 @@ kyber_dispatch_cur_domain(struct kyber_queue_data *kqd,
774776
list_del_init(&rq->queuelist);
775777
return rq;
776778
} else {
777-
trace_kyber_throttled(kqd->q,
779+
trace_kyber_throttled(kqd->dev,
778780
kyber_domain_names[khd->cur_domain]);
779781
}
780782
} else if (sbitmap_any_bit_set(&khd->kcq_map[khd->cur_domain])) {
@@ -787,7 +789,7 @@ kyber_dispatch_cur_domain(struct kyber_queue_data *kqd,
787789
list_del_init(&rq->queuelist);
788790
return rq;
789791
} else {
790-
trace_kyber_throttled(kqd->q,
792+
trace_kyber_throttled(kqd->dev,
791793
kyber_domain_names[khd->cur_domain]);
792794
}
793795
}

include/trace/events/kyber.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313

1414
TRACE_EVENT(kyber_latency,
1515

16-
TP_PROTO(struct request_queue *q, const char *domain, const char *type,
16+
TP_PROTO(dev_t dev, const char *domain, const char *type,
1717
unsigned int percentile, unsigned int numerator,
1818
unsigned int denominator, unsigned int samples),
1919

20-
TP_ARGS(q, domain, type, percentile, numerator, denominator, samples),
20+
TP_ARGS(dev, domain, type, percentile, numerator, denominator, samples),
2121

2222
TP_STRUCT__entry(
2323
__field( dev_t, dev )
@@ -30,7 +30,7 @@ TRACE_EVENT(kyber_latency,
3030
),
3131

3232
TP_fast_assign(
33-
__entry->dev = disk_devt(q->disk);
33+
__entry->dev = dev;
3434
strlcpy(__entry->domain, domain, sizeof(__entry->domain));
3535
strlcpy(__entry->type, type, sizeof(__entry->type));
3636
__entry->percentile = percentile;
@@ -47,10 +47,9 @@ TRACE_EVENT(kyber_latency,
4747

4848
TRACE_EVENT(kyber_adjust,
4949

50-
TP_PROTO(struct request_queue *q, const char *domain,
51-
unsigned int depth),
50+
TP_PROTO(dev_t dev, const char *domain, unsigned int depth),
5251

53-
TP_ARGS(q, domain, depth),
52+
TP_ARGS(dev, domain, depth),
5453

5554
TP_STRUCT__entry(
5655
__field( dev_t, dev )
@@ -59,7 +58,7 @@ TRACE_EVENT(kyber_adjust,
5958
),
6059

6160
TP_fast_assign(
62-
__entry->dev = disk_devt(q->disk);
61+
__entry->dev = dev;
6362
strlcpy(__entry->domain, domain, sizeof(__entry->domain));
6463
__entry->depth = depth;
6564
),
@@ -71,17 +70,17 @@ TRACE_EVENT(kyber_adjust,
7170

7271
TRACE_EVENT(kyber_throttled,
7372

74-
TP_PROTO(struct request_queue *q, const char *domain),
73+
TP_PROTO(dev_t dev, const char *domain),
7574

76-
TP_ARGS(q, domain),
75+
TP_ARGS(dev, domain),
7776

7877
TP_STRUCT__entry(
7978
__field( dev_t, dev )
8079
__array( char, domain, DOMAIN_LEN )
8180
),
8281

8382
TP_fast_assign(
84-
__entry->dev = disk_devt(q->disk);
83+
__entry->dev = dev;
8584
strlcpy(__entry->domain, domain, sizeof(__entry->domain));
8685
),
8786

0 commit comments

Comments
 (0)