mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
dm mpath: pass IO start time to path selector
The HST path selector needs this information to perform path prediction. For request-based mpath, struct request's io_start_time_ns is used, while for bio-based, use the start_time stored in dm_io. Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
committed by
Mike Snitzer
parent
48338daaa0
commit
087615bf3a
@@ -567,7 +567,8 @@ static void multipath_release_clone(struct request *clone,
|
|||||||
if (pgpath && pgpath->pg->ps.type->end_io)
|
if (pgpath && pgpath->pg->ps.type->end_io)
|
||||||
pgpath->pg->ps.type->end_io(&pgpath->pg->ps,
|
pgpath->pg->ps.type->end_io(&pgpath->pg->ps,
|
||||||
&pgpath->path,
|
&pgpath->path,
|
||||||
mpio->nr_bytes);
|
mpio->nr_bytes,
|
||||||
|
clone->io_start_time_ns);
|
||||||
}
|
}
|
||||||
|
|
||||||
blk_put_request(clone);
|
blk_put_request(clone);
|
||||||
@@ -1617,7 +1618,8 @@ static int multipath_end_io(struct dm_target *ti, struct request *clone,
|
|||||||
struct path_selector *ps = &pgpath->pg->ps;
|
struct path_selector *ps = &pgpath->pg->ps;
|
||||||
|
|
||||||
if (ps->type->end_io)
|
if (ps->type->end_io)
|
||||||
ps->type->end_io(ps, &pgpath->path, mpio->nr_bytes);
|
ps->type->end_io(ps, &pgpath->path, mpio->nr_bytes,
|
||||||
|
clone->io_start_time_ns);
|
||||||
}
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
@@ -1661,7 +1663,8 @@ done:
|
|||||||
struct path_selector *ps = &pgpath->pg->ps;
|
struct path_selector *ps = &pgpath->pg->ps;
|
||||||
|
|
||||||
if (ps->type->end_io)
|
if (ps->type->end_io)
|
||||||
ps->type->end_io(ps, &pgpath->path, mpio->nr_bytes);
|
ps->type->end_io(ps, &pgpath->path, mpio->nr_bytes,
|
||||||
|
dm_start_time_ns_from_clone(clone));
|
||||||
}
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
@@ -74,7 +74,7 @@ struct path_selector_type {
|
|||||||
int (*start_io) (struct path_selector *ps, struct dm_path *path,
|
int (*start_io) (struct path_selector *ps, struct dm_path *path,
|
||||||
size_t nr_bytes);
|
size_t nr_bytes);
|
||||||
int (*end_io) (struct path_selector *ps, struct dm_path *path,
|
int (*end_io) (struct path_selector *ps, struct dm_path *path,
|
||||||
size_t nr_bytes);
|
size_t nr_bytes, u64 start_time);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Register a path selector */
|
/* Register a path selector */
|
||||||
|
@@ -227,7 +227,7 @@ static int ql_start_io(struct path_selector *ps, struct dm_path *path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int ql_end_io(struct path_selector *ps, struct dm_path *path,
|
static int ql_end_io(struct path_selector *ps, struct dm_path *path,
|
||||||
size_t nr_bytes)
|
size_t nr_bytes, u64 start_time)
|
||||||
{
|
{
|
||||||
struct path_info *pi = path->pscontext;
|
struct path_info *pi = path->pscontext;
|
||||||
|
|
||||||
|
@@ -309,7 +309,7 @@ static int st_start_io(struct path_selector *ps, struct dm_path *path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int st_end_io(struct path_selector *ps, struct dm_path *path,
|
static int st_end_io(struct path_selector *ps, struct dm_path *path,
|
||||||
size_t nr_bytes)
|
size_t nr_bytes, u64 start_time)
|
||||||
{
|
{
|
||||||
struct path_info *pi = path->pscontext;
|
struct path_info *pi = path->pscontext;
|
||||||
|
|
||||||
|
@@ -675,6 +675,15 @@ static bool md_in_flight(struct mapped_device *md)
|
|||||||
return md_in_flight_bios(md);
|
return md_in_flight_bios(md);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64 dm_start_time_ns_from_clone(struct bio *bio)
|
||||||
|
{
|
||||||
|
struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone);
|
||||||
|
struct dm_io *io = tio->io;
|
||||||
|
|
||||||
|
return jiffies_to_nsecs(io->start_time);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dm_start_time_ns_from_clone);
|
||||||
|
|
||||||
static void start_io_acct(struct dm_io *io)
|
static void start_io_acct(struct dm_io *io)
|
||||||
{
|
{
|
||||||
struct mapped_device *md = io->md;
|
struct mapped_device *md = io->md;
|
||||||
|
@@ -332,6 +332,8 @@ void *dm_per_bio_data(struct bio *bio, size_t data_size);
|
|||||||
struct bio *dm_bio_from_per_bio_data(void *data, size_t data_size);
|
struct bio *dm_bio_from_per_bio_data(void *data, size_t data_size);
|
||||||
unsigned dm_bio_get_target_bio_nr(const struct bio *bio);
|
unsigned dm_bio_get_target_bio_nr(const struct bio *bio);
|
||||||
|
|
||||||
|
u64 dm_start_time_ns_from_clone(struct bio *bio);
|
||||||
|
|
||||||
int dm_register_target(struct target_type *t);
|
int dm_register_target(struct target_type *t);
|
||||||
void dm_unregister_target(struct target_type *t);
|
void dm_unregister_target(struct target_type *t);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user