MFV r322238: 7915 checks in l2arc_evict could use some cleaning up
illumos/illumos-gate@267ae6c3a8
267ae6c3a8
https://www.illumos.org/issues/7915
l2arc_evict() is strictly serialized with respect to
l2arc_write_buffers() and l2arc_write_done(). Normally, l2arc_evict()
and l2arc_write_buffers() are called from the same thread, so they can
not be concurrent. Also, l2arc_write_buffers() uses zio_wait() on the
parent zio of all cache zio-s. That ensures that l2arc_write_done()
is completed before l2arc_write_buffers() returns. Finally, if a
cache device is removed, then l2arc_evict() is called under SCL_ALL in
the exclusive mode. That ensures that it can not be concurrent with
the normal L2ARC accesses to the device (including writing and
evicting buffers). Given the above, some checks and actions in
l2arc_evict() do not make sense. For instance, it must never
encounter the write head header let alone remove it from the buffer
list.
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Approved by: Matthew Ahrens <mahrens@delphix.com>
Author: Andriy Gapon <avg@FreeBSD.org>
MFC after: 2 weeks
This commit is contained in:
commit
6f2f8727e3
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=322239
@ -7284,18 +7284,16 @@ l2arc_evict(l2arc_dev_t *dev, uint64_t distance, boolean_t all)
|
||||
goto top;
|
||||
}
|
||||
|
||||
if (HDR_L2_WRITE_HEAD(hdr)) {
|
||||
/*
|
||||
* We hit a write head node. Leave it for
|
||||
* l2arc_write_done().
|
||||
*/
|
||||
list_remove(buflist, hdr);
|
||||
mutex_exit(hash_lock);
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* A header can't be on this list if it doesn't have L2 header.
|
||||
*/
|
||||
ASSERT(HDR_HAS_L2HDR(hdr));
|
||||
|
||||
if (!all && HDR_HAS_L2HDR(hdr) &&
|
||||
(hdr->b_l2hdr.b_daddr >= taddr ||
|
||||
/* Ensure this header has finished being written. */
|
||||
ASSERT(!HDR_L2_WRITING(hdr));
|
||||
ASSERT(!HDR_L2_WRITE_HEAD(hdr));
|
||||
|
||||
if (!all && (hdr->b_l2hdr.b_daddr >= taddr ||
|
||||
hdr->b_l2hdr.b_daddr < dev->l2ad_hand)) {
|
||||
/*
|
||||
* We've evicted to the target address,
|
||||
@ -7305,7 +7303,6 @@ l2arc_evict(l2arc_dev_t *dev, uint64_t distance, boolean_t all)
|
||||
break;
|
||||
}
|
||||
|
||||
ASSERT(HDR_HAS_L2HDR(hdr));
|
||||
if (!HDR_HAS_L1HDR(hdr)) {
|
||||
ASSERT(!HDR_L2_READING(hdr));
|
||||
/*
|
||||
@ -7328,9 +7325,6 @@ l2arc_evict(l2arc_dev_t *dev, uint64_t distance, boolean_t all)
|
||||
arc_hdr_set_flags(hdr, ARC_FLAG_L2_EVICTED);
|
||||
}
|
||||
|
||||
/* Ensure this header has finished being written */
|
||||
ASSERT(!HDR_L2_WRITING(hdr));
|
||||
|
||||
arc_hdr_l2hdr_destroy(hdr);
|
||||
}
|
||||
mutex_exit(hash_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user