diff options
Diffstat (limited to 'mm/page_cgroup.c')
| -rw-r--r-- | mm/page_cgroup.c | 37 |
1 files changed, 13 insertions, 24 deletions
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index ceecfbb143fa..791905c991df 100644 --- a/mm/page_cgroup.c +++ b/mm/page_cgroup.c | |||
| @@ -285,12 +285,8 @@ struct swap_cgroup_ctrl { | |||
| 285 | 285 | ||
| 286 | struct swap_cgroup_ctrl swap_cgroup_ctrl[MAX_SWAPFILES]; | 286 | struct swap_cgroup_ctrl swap_cgroup_ctrl[MAX_SWAPFILES]; |
| 287 | 287 | ||
| 288 | /* | ||
| 289 | * This 8bytes seems big..maybe we can reduce this when we can use "id" for | ||
| 290 | * cgroup rather than pointer. | ||
| 291 | */ | ||
| 292 | struct swap_cgroup { | 288 | struct swap_cgroup { |
| 293 | struct mem_cgroup *val; | 289 | unsigned short id; |
| 294 | }; | 290 | }; |
| 295 | #define SC_PER_PAGE (PAGE_SIZE/sizeof(struct swap_cgroup)) | 291 | #define SC_PER_PAGE (PAGE_SIZE/sizeof(struct swap_cgroup)) |
| 296 | #define SC_POS_MASK (SC_PER_PAGE - 1) | 292 | #define SC_POS_MASK (SC_PER_PAGE - 1) |
| @@ -342,10 +338,10 @@ not_enough_page: | |||
| 342 | * @ent: swap entry to be recorded into | 338 | * @ent: swap entry to be recorded into |
| 343 | * @mem: mem_cgroup to be recorded | 339 | * @mem: mem_cgroup to be recorded |
| 344 | * | 340 | * |
| 345 | * Returns old value at success, NULL at failure. | 341 | * Returns old value at success, 0 at failure. |
| 346 | * (Of course, old value can be NULL.) | 342 | * (Of course, old value can be 0.) |
| 347 | */ | 343 | */ |
| 348 | struct mem_cgroup *swap_cgroup_record(swp_entry_t ent, struct mem_cgroup *mem) | 344 | unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id) |
| 349 | { | 345 | { |
| 350 | int type = swp_type(ent); | 346 | int type = swp_type(ent); |
| 351 | unsigned long offset = swp_offset(ent); | 347 | unsigned long offset = swp_offset(ent); |
| @@ -354,18 +350,18 @@ struct mem_cgroup *swap_cgroup_record(swp_entry_t ent, struct mem_cgroup *mem) | |||
| 354 | struct swap_cgroup_ctrl *ctrl; | 350 | struct swap_cgroup_ctrl *ctrl; |
| 355 | struct page *mappage; | 351 | struct page *mappage; |
| 356 | struct swap_cgroup *sc; | 352 | struct swap_cgroup *sc; |
| 357 | struct mem_cgroup *old; | 353 | unsigned short old; |
| 358 | 354 | ||
| 359 | if (!do_swap_account) | 355 | if (!do_swap_account) |
| 360 | return NULL; | 356 | return 0; |
| 361 | 357 | ||
| 362 | ctrl = &swap_cgroup_ctrl[type]; | 358 | ctrl = &swap_cgroup_ctrl[type]; |
| 363 | 359 | ||
| 364 | mappage = ctrl->map[idx]; | 360 | mappage = ctrl->map[idx]; |
| 365 | sc = page_address(mappage); | 361 | sc = page_address(mappage); |
| 366 | sc += pos; | 362 | sc += pos; |
| 367 | old = sc->val; | 363 | old = sc->id; |
| 368 | sc->val = mem; | 364 | sc->id = id; |
| 369 | 365 | ||
| 370 | return old; | 366 | return old; |
| 371 | } | 367 | } |
| @@ -374,9 +370,9 @@ struct mem_cgroup *swap_cgroup_record(swp_entry_t ent, struct mem_cgroup *mem) | |||
| 374 | * lookup_swap_cgroup - lookup mem_cgroup tied to swap entry | 370 | * lookup_swap_cgroup - lookup mem_cgroup tied to swap entry |
| 375 | * @ent: swap entry to be looked up. | 371 | * @ent: swap entry to be looked up. |
| 376 | * | 372 | * |
| 377 | * Returns pointer to mem_cgroup at success. NULL at failure. | 373 | * Returns CSS ID of mem_cgroup at success. 0 at failure. (0 is invalid ID) |
| 378 | */ | 374 | */ |
| 379 | struct mem_cgroup *lookup_swap_cgroup(swp_entry_t ent) | 375 | unsigned short lookup_swap_cgroup(swp_entry_t ent) |
| 380 | { | 376 | { |
| 381 | int type = swp_type(ent); | 377 | int type = swp_type(ent); |
| 382 | unsigned long offset = swp_offset(ent); | 378 | unsigned long offset = swp_offset(ent); |
| @@ -385,16 +381,16 @@ struct mem_cgroup *lookup_swap_cgroup(swp_entry_t ent) | |||
| 385 | struct swap_cgroup_ctrl *ctrl; | 381 | struct swap_cgroup_ctrl *ctrl; |
| 386 | struct page *mappage; | 382 | struct page *mappage; |
| 387 | struct swap_cgroup *sc; | 383 | struct swap_cgroup *sc; |
| 388 | struct mem_cgroup *ret; | 384 | unsigned short ret; |
| 389 | 385 | ||
| 390 | if (!do_swap_account) | 386 | if (!do_swap_account) |
| 391 | return NULL; | 387 | return 0; |
| 392 | 388 | ||
| 393 | ctrl = &swap_cgroup_ctrl[type]; | 389 | ctrl = &swap_cgroup_ctrl[type]; |
| 394 | mappage = ctrl->map[idx]; | 390 | mappage = ctrl->map[idx]; |
| 395 | sc = page_address(mappage); | 391 | sc = page_address(mappage); |
| 396 | sc += pos; | 392 | sc += pos; |
| 397 | ret = sc->val; | 393 | ret = sc->id; |
| 398 | return ret; | 394 | return ret; |
| 399 | } | 395 | } |
| 400 | 396 | ||
| @@ -430,13 +426,6 @@ int swap_cgroup_swapon(int type, unsigned long max_pages) | |||
| 430 | } | 426 | } |
| 431 | mutex_unlock(&swap_cgroup_mutex); | 427 | mutex_unlock(&swap_cgroup_mutex); |
| 432 | 428 | ||
| 433 | printk(KERN_INFO | ||
| 434 | "swap_cgroup: uses %ld bytes of vmalloc for pointer array space" | ||
| 435 | " and %ld bytes to hold mem_cgroup pointers on swap\n", | ||
| 436 | array_size, length * PAGE_SIZE); | ||
| 437 | printk(KERN_INFO | ||
| 438 | "swap_cgroup can be disabled by noswapaccount boot option.\n"); | ||
| 439 | |||
| 440 | return 0; | 429 | return 0; |
| 441 | nomem: | 430 | nomem: |
| 442 | printk(KERN_INFO "couldn't allocate enough memory for swap_cgroup.\n"); | 431 | printk(KERN_INFO "couldn't allocate enough memory for swap_cgroup.\n"); |
