@@ -1698,6 +1698,7 @@ struct memcg_stock_pcp {
1698
1698
#define FLUSHING_CACHED_CHARGE 0
1699
1699
};
1700
1700
static DEFINE_PER_CPU (struct memcg_stock_pcp , memcg_stock ) ;
1701
+ static DEFINE_LOCAL_IRQ_LOCK (memcg_stock_ll );
1701
1702
static DEFINE_MUTEX (percpu_charge_mutex );
1702
1703
1703
1704
/**
@@ -1720,15 +1721,15 @@ static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
1720
1721
if (nr_pages > CHARGE_BATCH )
1721
1722
return ret ;
1722
1723
1723
- local_irq_save ( flags );
1724
+ local_lock_irqsave ( memcg_stock_ll , flags );
1724
1725
1725
1726
stock = this_cpu_ptr (& memcg_stock );
1726
1727
if (memcg == stock -> cached && stock -> nr_pages >= nr_pages ) {
1727
1728
stock -> nr_pages -= nr_pages ;
1728
1729
ret = true;
1729
1730
}
1730
1731
1731
- local_irq_restore ( flags );
1732
+ local_unlock_irqrestore ( memcg_stock_ll , flags );
1732
1733
1733
1734
return ret ;
1734
1735
}
@@ -1755,13 +1756,13 @@ static void drain_local_stock(struct work_struct *dummy)
1755
1756
struct memcg_stock_pcp * stock ;
1756
1757
unsigned long flags ;
1757
1758
1758
- local_irq_save ( flags );
1759
+ local_lock_irqsave ( memcg_stock_ll , flags );
1759
1760
1760
1761
stock = this_cpu_ptr (& memcg_stock );
1761
1762
drain_stock (stock );
1762
1763
clear_bit (FLUSHING_CACHED_CHARGE , & stock -> flags );
1763
1764
1764
- local_irq_restore ( flags );
1765
+ local_unlock_irqrestore ( memcg_stock_ll , flags );
1765
1766
}
1766
1767
1767
1768
/*
@@ -1773,7 +1774,7 @@ static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
1773
1774
struct memcg_stock_pcp * stock ;
1774
1775
unsigned long flags ;
1775
1776
1776
- local_irq_save ( flags );
1777
+ local_lock_irqsave ( memcg_stock_ll , flags );
1777
1778
1778
1779
stock = this_cpu_ptr (& memcg_stock );
1779
1780
if (stock -> cached != memcg ) { /* reset if necessary */
@@ -1782,7 +1783,7 @@ static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
1782
1783
}
1783
1784
stock -> nr_pages += nr_pages ;
1784
1785
1785
- local_irq_restore ( flags );
1786
+ local_unlock_irqrestore ( memcg_stock_ll , flags );
1786
1787
}
1787
1788
1788
1789
/*
0 commit comments