[dm-devel] [PATCH 1/1] dm-mpath: Extend path selector interface for supporting Dell EqualLogic path selector
Mike Snitzer
snitzer at redhat.com
Fri Jul 9 16:10:35 UTC 2010
On Mon, Jun 28 2010 at 9:53am -0400,
Narendran Ganapathy <Narendran_Ganapathy at dell.com> wrote:
> We propose to extend the path selector interface to pass the entire
> request pointer to the 'select_path' / 'start_io' / 'end_io'
> functions so that the path selector can use any information therein to
> route the I/O.
So passing the entire request aside (Kiyoshi already shared that this is
not desirable)...
> We also propose extending the dm_mpath_io structure used to hold
> information about each I/O to include extra fields for the path
> selector to store I/O specific flags and a timestamp, so the path
> selector can determine the latency of I/Os on different paths and that
> information is passed to the 'select_path' / 'start_io' / 'end_io'
> functions for path selector usage. These additions to the dm_mpath_io
> allow future flexibility in developing algorithms that route IO based
> on other information from the request in the future.
How can you reasonably pass "extra fields for the path selector to store
I/O specific flags and a timestamp"?
'nr_bytes' and 'struct dm_ps_io_ctx' are mutually exclussive
(side-effect of using a 'union dm_mpath_ps_io').
Yet I'm not seeing where the existing 'select_path' / 'start_io' /
'end_io' interfaces are weened off of their potential dependency on
'nr_bytes'.
dm-service-time path selector uses nr_bytes (and obviously doesn't use
dm_ps_io_ctx). But what if a path selector had a need for both
'nr_bytes' and 'dm_ps_io_ctx'? Presummably the future might require us
to add additional members to dm_ps_io_ctx or dm_mpath_ps_io too.
Long story short, I do not think you should be using a union for
dm_mpath_ps_io (it should just be a struct).
But I'd imagine you've likely already switched away from a union in
order to store the relevant members of the 'struct request' (rather than
passing the request to the path selectors) in dm_mpath_ps_io.
Mike
> diff --git a/drivers/md/dm-mpath.h b/drivers/md/dm-mpath.h
> index e230f71..45e9c58 100644
> --- a/drivers/md/dm-mpath.h
> +++ b/drivers/md/dm-mpath.h
> @@ -16,6 +16,26 @@ struct dm_path {
> void *pscontext; /* For path-selector use */
> };
>
> +
> +/*
> + * Context information attached to each bio we process.
> + */
> +struct dm_ps_io_ctx {
> + uint32_t flags;
> + unsigned long iotime;
> +};
> +
> +union dm_mpath_ps_io {
> + size_t nr_bytes;
> + struct dm_ps_io_ctx ps_ctx;
> +};
> +
> +struct dm_mpath_io {
> + struct pgpath *pgpath;
> + union dm_mpath_ps_io u;
> +};
> +
> +
> /* Callback for hwh_pg_init_fn to use when complete */
> void dm_pg_init_complete(struct dm_path *path, unsigned err_flags);
>
> diff --git a/drivers/md/dm-path-selector.h b/drivers/md/dm-path-selector.h
> index e7d1fa8..cff8ca5 100644
> --- a/drivers/md/dm-path-selector.h
> +++ b/drivers/md/dm-path-selector.h
> @@ -57,7 +57,8 @@ struct path_selector_type {
> */
> struct dm_path *(*select_path) (struct path_selector *ps,
> unsigned *repeat_count,
> - size_t nr_bytes);
> + union dm_mpath_ps_io *psio,
> + struct request *clone);
>
> /*
> * Notify the selector that a path has failed.
> @@ -77,9 +78,9 @@ struct path_selector_type {
> status_type_t type, char *result, unsigned int maxlen);
>
> int (*start_io) (struct path_selector *ps, struct dm_path *path,
> - size_t nr_bytes);
> + union dm_mpath_ps_io *psio, struct request *clone);
> int (*end_io) (struct path_selector *ps, struct dm_path *path,
> - size_t nr_bytes);
> + union dm_mpath_ps_io *psio, struct request *clone);
> };
>
> /* Register a path selector */
More information about the dm-devel
mailing list