@@ -1571,6 +1571,27 @@ int folio_wait_private_2_killable(struct folio *folio)
1571
1571
}
1572
1572
EXPORT_SYMBOL (folio_wait_private_2_killable );
1573
1573
1574
+ /*
1575
+ * If folio was marked as dropbehind, then pages should be dropped when writeback
1576
+ * completes. Do that now. If we fail, it's likely because of a big folio -
1577
+ * just reset dropbehind for that case and latter completions should invalidate.
1578
+ */
1579
+ static void folio_end_dropbehind_write (struct folio * folio )
1580
+ {
1581
+ /*
1582
+ * Hitting !in_task() should not happen off RWF_DONTCACHE writeback,
1583
+ * but can happen if normal writeback just happens to find dirty folios
1584
+ * that were created as part of uncached writeback, and that writeback
1585
+ * would otherwise not need non-IRQ handling. Just skip the
1586
+ * invalidation in that case.
1587
+ */
1588
+ if (in_task () && folio_trylock (folio )) {
1589
+ if (folio -> mapping )
1590
+ folio_unmap_invalidate (folio -> mapping , folio , 0 );
1591
+ folio_unlock (folio );
1592
+ }
1593
+ }
1594
+
1574
1595
/**
1575
1596
* folio_end_writeback - End writeback against a folio.
1576
1597
* @folio: The folio.
@@ -1581,6 +1602,8 @@ EXPORT_SYMBOL(folio_wait_private_2_killable);
1581
1602
*/
1582
1603
void folio_end_writeback (struct folio * folio )
1583
1604
{
1605
+ bool folio_dropbehind = false;
1606
+
1584
1607
VM_BUG_ON_FOLIO (!folio_test_writeback (folio ), folio );
1585
1608
1586
1609
/*
@@ -1602,9 +1625,14 @@ void folio_end_writeback(struct folio *folio)
1602
1625
* reused before the folio_wake_bit().
1603
1626
*/
1604
1627
folio_get (folio );
1628
+ if (!folio_test_dirty (folio ))
1629
+ folio_dropbehind = folio_test_clear_dropbehind (folio );
1605
1630
if (__folio_end_writeback (folio ))
1606
1631
folio_wake_bit (folio , PG_writeback );
1607
1632
acct_reclaim_writeback (folio );
1633
+
1634
+ if (folio_dropbehind )
1635
+ folio_end_dropbehind_write (folio );
1608
1636
folio_put (folio );
1609
1637
}
1610
1638
EXPORT_SYMBOL (folio_end_writeback );
0 commit comments