Under swapping load on huge tmpfs, /proc/meminfo's Committed_AS grows bigger and bigger: just a cosmetic issue for most users, but disabling for those who run without overcommit (/proc/sys/vm/overcommit_memory 2). shmem_uncharge() was forgetting to unaccount __vm_enough_memory's charge, and shmem_charge() was forgetting it on the filesystem-full error path.
Unified · Split
| @@ -270,7 +270,7 @@ bool shmem_charge(struct inode *inode, long pages) · 269 unmodified lines | ||
| 270 | 270 | info->alloced -= pages; |
| 271 | 271 | shmem_recalc_inode(inode); |
| 272 | 272 | spin_unlock_irqrestore(&info->lock, flags); |
| 273 | − | |
| 273 | + shmem_unacct_blocks(info->flags, pages); | |
| 274 | 274 | return false; |
| 275 | 275 | } |
| 276 | 276 | percpu_counter_add(&sbinfo->used_blocks, pages); |
| @@ -291,6 +291,7 @@ void shmem_uncharge(struct inode *inode, long pages) · 14 unmodified lines | ||
| 291 | 291 | |
| 292 | 292 | if (sbinfo->max_blocks) |
| 293 | 293 | percpu_counter_sub(&sbinfo->used_blocks, pages); |
| 294 | + shmem_unacct_blocks(info->flags, pages); | |
| 294 | 295 | } |
| 295 | 296 | |
| 296 | 297 | /* |