diff options
Diffstat (limited to 'mm/page_cgroup.c')
| -rw-r--r-- | mm/page_cgroup.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index 3d535d594826..3dd88539a0e6 100644 --- a/mm/page_cgroup.c +++ b/mm/page_cgroup.c | |||
| @@ -335,6 +335,37 @@ not_enough_page: | |||
| 335 | } | 335 | } |
| 336 | 336 | ||
| 337 | /** | 337 | /** |
| 338 | * swap_cgroup_cmpxchg - cmpxchg mem_cgroup's id for this swp_entry. | ||
| 339 | * @end: swap entry to be cmpxchged | ||
| 340 | * @old: old id | ||
| 341 | * @new: new id | ||
| 342 | * | ||
| 343 | * Returns old id at success, 0 at failure. | ||
| 344 | * (There is no mem_cgroup useing 0 as its id) | ||
| 345 | */ | ||
| 346 | unsigned short swap_cgroup_cmpxchg(swp_entry_t ent, | ||
| 347 | unsigned short old, unsigned short new) | ||
| 348 | { | ||
| 349 | int type = swp_type(ent); | ||
| 350 | unsigned long offset = swp_offset(ent); | ||
| 351 | unsigned long idx = offset / SC_PER_PAGE; | ||
| 352 | unsigned long pos = offset & SC_POS_MASK; | ||
| 353 | struct swap_cgroup_ctrl *ctrl; | ||
| 354 | struct page *mappage; | ||
| 355 | struct swap_cgroup *sc; | ||
| 356 | |||
| 357 | ctrl = &swap_cgroup_ctrl[type]; | ||
| 358 | |||
| 359 | mappage = ctrl->map[idx]; | ||
| 360 | sc = page_address(mappage); | ||
| 361 | sc += pos; | ||
| 362 | if (cmpxchg(&sc->id, old, new) == old) | ||
| 363 | return old; | ||
| 364 | else | ||
| 365 | return 0; | ||
| 366 | } | ||
| 367 | |||
| 368 | /** | ||
| 338 | * swap_cgroup_record - record mem_cgroup for this swp_entry. | 369 | * swap_cgroup_record - record mem_cgroup for this swp_entry. |
| 339 | * @ent: swap entry to be recorded into | 370 | * @ent: swap entry to be recorded into |
| 340 | * @mem: mem_cgroup to be recorded | 371 | * @mem: mem_cgroup to be recorded |
| @@ -358,8 +389,7 @@ unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id) | |||
| 358 | mappage = ctrl->map[idx]; | 389 | mappage = ctrl->map[idx]; |
| 359 | sc = page_address(mappage); | 390 | sc = page_address(mappage); |
| 360 | sc += pos; | 391 | sc += pos; |
| 361 | old = sc->id; | 392 | old = xchg(&sc->id, id); |
| 362 | sc->id = id; | ||
| 363 | 393 | ||
| 364 | return old; | 394 | return old; |
| 365 | } | 395 | } |
