Skip to content

Commit

Permalink
aoe: improve handling of misbehaving network paths
Browse files Browse the repository at this point in the history
An AoE target can have multiple network ports used for AoE, and in the
aoe driver, those are tracked by the aoetgt struct.  These changes allow
the aoe driver to handle network paths, or aoetgts, that are not working
well, compared to the others.

Paths that do not get responses despite the retransmission of AoE
commands are marked as "tainted", and non-tainted paths are preferred.

Meanwhile, the aoe driver attempts to "probe" the tainted path in the
background by issuing reads of LBA 0 that are padded out to full
(possibly jumbo-frame) size.  If the probes get responses, then the path
is "redeemed", and its taint is removed.

This mechanism has been shown to be helpful in transparently handling
and recovering from real-world network "brown outs" in ways that the
earlier "shoot the help-needing target in the head" mechanism could not.

Signed-off-by: Ed Cashin <ecashin@coraid.com>
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Ed Cashin authored and Linus Torvalds committed Dec 18, 2012
1 parent b91316f commit bbb44e3
Show file tree
Hide file tree
Showing 3 changed files with 268 additions and 121 deletions.
11 changes: 10 additions & 1 deletion drivers/block/aoe/aoe.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ enum {
RTTDSCALE = 3,
RTTAVG_INIT = USEC_PER_SEC / 4 << RTTSCALE,
RTTDEV_INIT = RTTAVG_INIT / 4,

HARD_SCORN_SECS = 10, /* try another remote port after this */
MAX_TAINT = 1000, /* cap on aoetgt taint */
};

struct buf {
Expand All @@ -103,6 +106,10 @@ struct buf {
struct request *rq;
};

enum frame_flags {
FFL_PROBE = 1,
};

struct frame {
struct list_head head;
u32 tag;
Expand All @@ -118,6 +125,7 @@ struct frame {
struct bio_vec *bv;
ulong bcnt;
ulong bv_off;
char flags;
};

struct aoeif {
Expand All @@ -138,8 +146,10 @@ struct aoetgt {
ushort next_cwnd; /* incr maxout after decrementing to zero */
ushort ssthresh; /* slow start threshold */
ulong falloc; /* number of allocated frames */
int taint; /* how much we want to avoid this aoetgt */
int minbcnt;
int wpkts, rpkts;
char nout_probes;
};

struct aoedev {
Expand Down Expand Up @@ -174,7 +184,6 @@ struct aoedev {
struct list_head rexmitq; /* deferred retransmissions */
struct aoetgt *targets[NTARGETS];
struct aoetgt **tgt; /* target in use when working */
struct aoetgt *htgt; /* target needing rexmit assistance */
ulong ntargets;
ulong kicked;
char ident[512];
Expand Down
Loading

0 comments on commit bbb44e3

Please sign in to comment.