Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21136f89 authored by Mike Snitzer's avatar Mike Snitzer
Browse files

dm mpath: remove repeat_count support from multipath core



Preparation for making __multipath_map() avoid taking the m->lock
spinlock -- in favor of using RCU locking.

repeat_count was primarily for bio-based DM multipath's benefit.  There
is really no need for it anymore now that DM multipath is request-based.
As such, repeat_count > 1 is no longer honored and a warning is
displayed if the user attempts to use a value > 1.  This is a temporary
change for the round-robin path-selector (as a later commit will restore
its support for repeat_count > 1).

Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 7943bd6d
Loading
Loading
Loading
Loading
+3 −4
Original line number Original line Diff line number Diff line
@@ -83,7 +83,6 @@ struct multipath {
	struct pgpath *current_pgpath;
	struct pgpath *current_pgpath;
	struct priority_group *current_pg;
	struct priority_group *current_pg;
	struct priority_group *next_pg;	/* Switch to this PG if set */
	struct priority_group *next_pg;	/* Switch to this PG if set */
	unsigned repeat_count;		/* I/Os left before calling PS again */


	unsigned queue_io:1;		/* Must we queue all I/O? */
	unsigned queue_io:1;		/* Must we queue all I/O? */
	unsigned queue_if_no_path:1;	/* Queue I/O if last path fails? */
	unsigned queue_if_no_path:1;	/* Queue I/O if last path fails? */
@@ -319,8 +318,9 @@ static int __choose_path_in_pg(struct multipath *m, struct priority_group *pg,
			       size_t nr_bytes)
			       size_t nr_bytes)
{
{
	struct dm_path *path;
	struct dm_path *path;
	unsigned repeat_count;


	path = pg->ps.type->select_path(&pg->ps, &m->repeat_count, nr_bytes);
	path = pg->ps.type->select_path(&pg->ps, &repeat_count, nr_bytes);
	if (!path)
	if (!path)
		return -ENXIO;
		return -ENXIO;


@@ -412,8 +412,7 @@ static int __multipath_map(struct dm_target *ti, struct request *clone,
	spin_lock_irq(&m->lock);
	spin_lock_irq(&m->lock);


	/* Do we need to select a new pgpath? */
	/* Do we need to select a new pgpath? */
	if (!m->current_pgpath ||
	if (!m->current_pgpath || !m->queue_io)
	    (!m->queue_io && (m->repeat_count && --m->repeat_count == 0)))
		__choose_pgpath(m, nr_bytes);
		__choose_pgpath(m, nr_bytes);


	pgpath = m->current_pgpath;
	pgpath = m->current_pgpath;
+7 −2
Original line number Original line Diff line number Diff line
@@ -23,8 +23,8 @@
#include <linux/atomic.h>
#include <linux/atomic.h>


#define DM_MSG_PREFIX	"multipath queue-length"
#define DM_MSG_PREFIX	"multipath queue-length"
#define QL_MIN_IO	128
#define QL_MIN_IO	1
#define QL_VERSION	"0.1.0"
#define QL_VERSION	"0.2.0"


struct selector {
struct selector {
	struct list_head	valid_paths;
	struct list_head	valid_paths;
@@ -129,6 +129,11 @@ static int ql_add_path(struct path_selector *ps, struct dm_path *path,
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (repeat_count > 1) {
		DMWARN_LIMIT("repeat_count > 1 is deprecated, using 1 instead");
		repeat_count = 1;
	}

	/* Allocate the path information structure */
	/* Allocate the path information structure */
	pi = kmalloc(sizeof(*pi), GFP_KERNEL);
	pi = kmalloc(sizeof(*pi), GFP_KERNEL);
	if (!pi) {
	if (!pi) {
+8 −3
Original line number Original line Diff line number Diff line
@@ -17,6 +17,8 @@
#include <linux/module.h>
#include <linux/module.h>


#define DM_MSG_PREFIX "multipath round-robin"
#define DM_MSG_PREFIX "multipath round-robin"
#define RR_MIN_IO     1
#define RR_VERSION    "1.1.0"


/*-----------------------------------------------------------------
/*-----------------------------------------------------------------
 * Path-handling code, paths are held in lists
 * Path-handling code, paths are held in lists
@@ -41,8 +43,6 @@ static void free_paths(struct list_head *paths)
 * Round-robin selector
 * Round-robin selector
 *---------------------------------------------------------------*/
 *---------------------------------------------------------------*/


#define RR_MIN_IO		1000

struct selector {
struct selector {
	struct list_head valid_paths;
	struct list_head valid_paths;
	struct list_head invalid_paths;
	struct list_head invalid_paths;
@@ -127,6 +127,11 @@ static int rr_add_path(struct path_selector *ps, struct dm_path *path,
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (repeat_count > 1) {
		DMWARN_LIMIT("repeat_count > 1 is deprecated, using 1 instead");
		repeat_count = 1;
	}

	/* allocate the path */
	/* allocate the path */
	pi = kmalloc(sizeof(*pi), GFP_KERNEL);
	pi = kmalloc(sizeof(*pi), GFP_KERNEL);
	if (!pi) {
	if (!pi) {
@@ -198,7 +203,7 @@ static int __init dm_rr_init(void)
	if (r < 0)
	if (r < 0)
		DMERR("register failed %d", r);
		DMERR("register failed %d", r);


	DMINFO("version 1.0.0 loaded");
	DMINFO("version " RR_VERSION " loaded");


	return r;
	return r;
}
}
+6 −1
Original line number Original line Diff line number Diff line
@@ -19,7 +19,7 @@
#define ST_MAX_RELATIVE_THROUGHPUT	100
#define ST_MAX_RELATIVE_THROUGHPUT	100
#define ST_MAX_RELATIVE_THROUGHPUT_SHIFT	7
#define ST_MAX_RELATIVE_THROUGHPUT_SHIFT	7
#define ST_MAX_INFLIGHT_SIZE	((size_t)-1 >> ST_MAX_RELATIVE_THROUGHPUT_SHIFT)
#define ST_MAX_INFLIGHT_SIZE	((size_t)-1 >> ST_MAX_RELATIVE_THROUGHPUT_SHIFT)
#define ST_VERSION	"0.2.0"
#define ST_VERSION	"0.3.0"


struct selector {
struct selector {
	struct list_head valid_paths;
	struct list_head valid_paths;
@@ -134,6 +134,11 @@ static int st_add_path(struct path_selector *ps, struct dm_path *path,
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (repeat_count > 1) {
		DMWARN_LIMIT("repeat_count > 1 is deprecated, using 1 instead");
		repeat_count = 1;
	}

	if ((argc == 2) &&
	if ((argc == 2) &&
	    (sscanf(argv[1], "%u%c", &relative_throughput, &dummy) != 1 ||
	    (sscanf(argv[1], "%u%c", &relative_throughput, &dummy) != 1 ||
	     relative_throughput > ST_MAX_RELATIVE_THROUGHPUT)) {
	     relative_throughput > ST_MAX_RELATIVE_THROUGHPUT)) {