- * Under Linux the arc shrinker may be called for synchronous (direct)
- * reclaim, or asynchronous (indirect) reclaim. When called by kswapd
- * for indirect reclaim we take a conservative approach and just reap
- * free slabs from the ARC caches. If this proves to be insufficient
- * direct reclaim will be trigger. In direct reclaim a more aggressive
- * strategy is used, data is evicted from the ARC and free slabs reaped.
+ * Determine the amount of memory eligible for eviction contained in the
+ * ARC. All clean data reported by the ghost lists can always be safely
+ * evicted. Due to arc_c_min, the same does not hold for all clean data
+ * contained by the regular mru and mfu lists.
+ *
+ * In the case of the regular mru and mfu lists, we need to report as
+ * much clean data as possible, such that evicting that same reported
+ * data will not bring arc_size below arc_c_min. Thus, in certain
+ * circumstances, the total amount of clean data in the mru and mfu
+ * lists might not actually be evictable.
+ *
+ * The following two distinct cases are accounted for:
+ *
+ * 1. The sum of the amount of dirty data contained by both the mru and
+ * mfu lists, plus the ARC's other accounting (e.g. the anon list),
+ * is greater than or equal to arc_c_min.
+ * (i.e. amount of dirty data >= arc_c_min)
+ *
+ * This is the easy case; all clean data contained by the mru and mfu
+ * lists is evictable. Evicting all clean data can only drop arc_size
+ * to the amount of dirty data, which is greater than arc_c_min.
+ *
+ * 2. The sum of the amount of dirty data contained by both the mru and
+ * mfu lists, plus the ARC's other accounting (e.g. the anon list),
+ * is less than arc_c_min.
+ * (i.e. arc_c_min > amount of dirty data)
+ *
+ * 2.1. arc_size is greater than or equal arc_c_min.
+ * (i.e. arc_size >= arc_c_min > amount of dirty data)
+ *
+ * In this case, not all clean data from the regular mru and mfu
+ * lists is actually evictable; we must leave enough clean data
+ * to keep arc_size above arc_c_min. Thus, the maximum amount of
+ * evictable data from the two lists combined, is exactly the
+ * difference between arc_size and arc_c_min.
+ *
+ * 2.2. arc_size is less than arc_c_min
+ * (i.e. arc_c_min > arc_size > amount of dirty data)
+ *
+ * In this case, none of the data contained in the mru and mfu
+ * lists is evictable, even if it's clean. Since arc_size is
+ * already below arc_c_min, evicting any more would only
+ * increase this negative difference.