diff options
author | Dan Williams <dan.j.williams@intel.com> | 2019-03-11 12:37:55 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2019-03-11 12:37:55 -0700 |
commit | 4083014e32699af04a8e6eaa4855b08dba36a47a (patch) | |
tree | fa37f9f9691fe64ca8a3c0cdc0315dc12462e6e4 /net/sctp/stream.c | |
parent | 6fd96ff557963de8e62842a0dc360a6e3610d2bb (diff) | |
parent | 78153dd45e7e0596ba32b15d02bda08e1513111e (diff) | |
download | linux-4083014e32699af04a8e6eaa4855b08dba36a47a.tar.bz2 |
Merge branch 'for-5.1/nfit/ars' into libnvdimm-for-next
Merge several updates to the ARS implementation. Highlights include:
* Support retrieval of short-ARS results if the ARS state is "requires
continuation", and even if the "no_init_ars" module parameter is
specified.
* Allow busy-polling of the kernel ARS state by allowing root to reset
the exponential back-off timer.
* Filter potentially stale ARS results by tracking query-ARS relative to
the previous start-ARS.
Diffstat (limited to 'net/sctp/stream.c')
-rw-r--r-- | net/sctp/stream.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/net/sctp/stream.c b/net/sctp/stream.c index 80e0ae5534ec..f24633114dfd 100644 --- a/net/sctp/stream.c +++ b/net/sctp/stream.c @@ -84,6 +84,19 @@ static void fa_zero(struct flex_array *fa, size_t index, size_t count) } } +static size_t fa_index(struct flex_array *fa, void *elem, size_t count) +{ + size_t index = 0; + + while (count--) { + if (elem == flex_array_get(fa, index)) + break; + index++; + } + + return index; +} + /* Migrates chunks from stream queues to new stream queues if needed, * but not across associations. Also, removes those chunks to streams * higher than the new max. @@ -147,6 +160,13 @@ static int sctp_stream_alloc_out(struct sctp_stream *stream, __u16 outcnt, if (stream->out) { fa_copy(out, stream->out, 0, min(outcnt, stream->outcnt)); + if (stream->out_curr) { + size_t index = fa_index(stream->out, stream->out_curr, + stream->outcnt); + + BUG_ON(index == stream->outcnt); + stream->out_curr = flex_array_get(out, index); + } fa_free(stream->out); } |