@@ -334,7 +334,6 @@ struct swap_cgroup {
334
334
unsigned short id ;
335
335
};
336
336
#define SC_PER_PAGE (PAGE_SIZE/sizeof(struct swap_cgroup))
337
- #define SC_POS_MASK (SC_PER_PAGE - 1)
338
337
339
338
/*
340
339
* SwapCgroup implements "lookup" and "exchange" operations.
@@ -376,6 +375,21 @@ static int swap_cgroup_prepare(int type)
376
375
return - ENOMEM ;
377
376
}
378
377
378
+ static struct swap_cgroup * lookup_swap_cgroup (swp_entry_t ent ,
379
+ struct swap_cgroup_ctrl * * ctrlp )
380
+ {
381
+ pgoff_t offset = swp_offset (ent );
382
+ struct swap_cgroup_ctrl * ctrl ;
383
+ struct page * mappage ;
384
+
385
+ ctrl = & swap_cgroup_ctrl [swp_type (ent )];
386
+ if (ctrlp )
387
+ * ctrlp = ctrl ;
388
+
389
+ mappage = ctrl -> map [offset / SC_PER_PAGE ];
390
+ return page_address (mappage ) + offset % SC_PER_PAGE ;
391
+ }
392
+
379
393
/**
380
394
* swap_cgroup_cmpxchg - cmpxchg mem_cgroup's id for this swp_entry.
381
395
* @end: swap entry to be cmpxchged
@@ -388,21 +402,13 @@ static int swap_cgroup_prepare(int type)
388
402
unsigned short swap_cgroup_cmpxchg (swp_entry_t ent ,
389
403
unsigned short old , unsigned short new )
390
404
{
391
- int type = swp_type (ent );
392
- unsigned long offset = swp_offset (ent );
393
- unsigned long idx = offset / SC_PER_PAGE ;
394
- unsigned long pos = offset & SC_POS_MASK ;
395
405
struct swap_cgroup_ctrl * ctrl ;
396
- struct page * mappage ;
397
406
struct swap_cgroup * sc ;
398
407
unsigned long flags ;
399
408
unsigned short retval ;
400
409
401
- ctrl = & swap_cgroup_ctrl [ type ] ;
410
+ sc = lookup_swap_cgroup ( ent , & ctrl ) ;
402
411
403
- mappage = ctrl -> map [idx ];
404
- sc = page_address (mappage );
405
- sc += pos ;
406
412
spin_lock_irqsave (& ctrl -> lock , flags );
407
413
retval = sc -> id ;
408
414
if (retval == old )
@@ -423,21 +429,13 @@ unsigned short swap_cgroup_cmpxchg(swp_entry_t ent,
423
429
*/
424
430
unsigned short swap_cgroup_record (swp_entry_t ent , unsigned short id )
425
431
{
426
- int type = swp_type (ent );
427
- unsigned long offset = swp_offset (ent );
428
- unsigned long idx = offset / SC_PER_PAGE ;
429
- unsigned long pos = offset & SC_POS_MASK ;
430
432
struct swap_cgroup_ctrl * ctrl ;
431
- struct page * mappage ;
432
433
struct swap_cgroup * sc ;
433
434
unsigned short old ;
434
435
unsigned long flags ;
435
436
436
- ctrl = & swap_cgroup_ctrl [ type ] ;
437
+ sc = lookup_swap_cgroup ( ent , & ctrl ) ;
437
438
438
- mappage = ctrl -> map [idx ];
439
- sc = page_address (mappage );
440
- sc += pos ;
441
439
spin_lock_irqsave (& ctrl -> lock , flags );
442
440
old = sc -> id ;
443
441
sc -> id = id ;
@@ -447,28 +445,14 @@ unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id)
447
445
}
448
446
449
447
/**
450
- * lookup_swap_cgroup - lookup mem_cgroup tied to swap entry
448
+ * lookup_swap_cgroup_id - lookup mem_cgroup id tied to swap entry
451
449
* @ent: swap entry to be looked up.
452
450
*
453
451
* Returns CSS ID of mem_cgroup at success. 0 at failure. (0 is invalid ID)
454
452
*/
455
- unsigned short lookup_swap_cgroup (swp_entry_t ent )
453
+ unsigned short lookup_swap_cgroup_id (swp_entry_t ent )
456
454
{
457
- int type = swp_type (ent );
458
- unsigned long offset = swp_offset (ent );
459
- unsigned long idx = offset / SC_PER_PAGE ;
460
- unsigned long pos = offset & SC_POS_MASK ;
461
- struct swap_cgroup_ctrl * ctrl ;
462
- struct page * mappage ;
463
- struct swap_cgroup * sc ;
464
- unsigned short ret ;
465
-
466
- ctrl = & swap_cgroup_ctrl [type ];
467
- mappage = ctrl -> map [idx ];
468
- sc = page_address (mappage );
469
- sc += pos ;
470
- ret = sc -> id ;
471
- return ret ;
455
+ return lookup_swap_cgroup (ent , NULL )-> id ;
472
456
}
473
457
474
458
int swap_cgroup_swapon (int type , unsigned long max_pages )
0 commit comments