27 Jun, 2012

1 commit

  • Currently, request_queue has one request_list to allocate requests
    from regardless of blkcg of the IO being issued. When the unified
    request pool is used up, cfq proportional IO limits become meaningless
    - whoever grabs the next request being freed wins the race regardless
    of the configured weights.

    This can be easily demonstrated by creating a blkio cgroup w/ very low
    weight, put a program which can issue a lot of random direct IOs there
    and running a sequential IO from a different cgroup. As soon as the
    request pool is used up, the sequential IO bandwidth crashes.

    This patch implements per-blkg request_list. Each blkg has its own
    request_list and any IO allocates its request from the matching blkg
    making blkcgs completely isolated in terms of request allocation.

    * Root blkcg uses the request_list embedded in each request_queue,
    which was renamed to @q->root_rl from @q->rq. While making blkcg rl
    handling a bit harier, this enables avoiding most overhead for root
    blkcg.

    * Queue fullness is properly per request_list but bdi isn't blkcg
    aware yet, so congestion state currently just follows the root
    blkcg. As writeback isn't aware of blkcg yet, this works okay for
    async congestion but readahead may get the wrong signals. It's
    better than blkcg completely collapsing with shared request_list but
    needs to be improved with future changes.

    * After this change, each block cgroup gets a full request pool making
    resource consumption of each cgroup higher. This makes allowing
    non-root users to create cgroups less desirable; however, note that
    allowing non-root users to directly manage cgroups is already
    severely broken regardless of this patch - each block cgroup
    consumes kernel memory and skews IO weight (IO weights are not
    hierarchical).

    v2: queue-sysfs.txt updated and patch description udpated as suggested
    by Vivek.

    v3: blk_get_rl() wasn't checking error return from
    blkg_lookup_create() and may cause oops on lookup failure. Fix it
    by falling back to root_rl on blkg lookup failures. This problem
    was spotted by Rakesh Iyer .

    v4: Updated to accomodate 458f27a982 "block: Avoid missed wakeup in
    request waitqueue". blk_drain_queue() now wakes up waiters on all
    blkg->rl on the target queue.

    Signed-off-by: Tejun Heo
    Acked-by: Vivek Goyal
    Cc: Wu Fengguang
    Signed-off-by: Jens Axboe

    Tejun Heo
     

25 Jun, 2012

3 commits

  • Make bio_blkcg() and friends inline. They all are very simple and
    used only in few places.

    This patch is to prepare for further updates to request allocation
    path.

    Signed-off-by: Tejun Heo
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Currently, blkcg_activate_policy() depends on %GFP_ATOMIC allocation
    from __blkg_lookup_create() for root blkcg creation. This could make
    policy fail unnecessarily.

    Make blkg_alloc() take @gfp_mask, __blkg_lookup_create() take an
    optional @new_blkg for preallocated blkg, and blkcg_activate_policy()
    preload radix tree and preallocate blkg with %GFP_KERNEL before trying
    to create the root blkg.

    v2: __blkg_lookup_create() was returning %NULL on blkg alloc failure
    instead of ERR_PTR() value. Fixed.

    Signed-off-by: Tejun Heo
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • There's no point in calling radix_tree_preload() if preloading doesn't
    use more permissible GFP mask. Drop preloading from
    __blkg_lookup_create().

    While at it, drop sparse locking annotation which no longer applies.

    v2: Vivek pointed out the odd preload usage. Instead of updating,
    just drop it.

    Signed-off-by: Tejun Heo
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     

06 Jun, 2012

1 commit

  • blkg_destroy() caches @blkg->q in local variable @q. While there are
    two places which needs @blkg->q, only lockdep_assert_held() used the
    local variable leading to unused local variable warning if lockdep is
    configured out. Drop the local variable and just use @blkg->q
    directly.

    Signed-off-by: Tejun Heo
    Reported-by: Rakesh Iyer
    Signed-off-by: Jens Axboe

    Tejun Heo
     

04 Jun, 2012

1 commit

  • When policy data allocation fails in the middle, blkg_alloc() invokes
    blkg_free() to destroy the half constructed blkg. This ends up
    calling pd_exit_fn() on policy datas which didn't go through
    pd_init_fn(). Fix it by making blkg_alloc() call pd_init_fn()
    immediately after each policy data allocation.

    Signed-off-by: Tejun Heo
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     

20 Apr, 2012

14 commits

  • blkg lookup is currently performed by traversing linked list anchored
    at blkcg->blkg_list. This is very unscalable and with blk-throttle
    enabled and enough request queues on the system, this can get very
    ugly quickly (blk-throttle performs look up on every bio submission).

    This patch makes blkcg use radix tree to index blkgs combined with
    simple last-looked-up hint. This is mostly identical to how icqs are
    indexed from ioc.

    Note that because __blkg_lookup() may be invoked without holding queue
    lock, hint is only updated from __blkg_lookup_create(). Due to cfq's
    cfqq caching, this makes hint updates overly lazy. This will be
    improved with scheduled blkcg aware request allocation.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • __blkg_lookup_create() leaked blkcg->css ref if blkg allocation
    failed. Fix it.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • There's no reason to keep blkcg_policy_ops separate. Collapse it into
    blkcg_policy.

    This patch doesn't introduce any functional change.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Currently blkg_policy_data carries policy specific data as char flex
    array instead of being embedded in policy specific data. This was
    forced by oddities around blkg allocation which are all gone now.

    This patch makes blkg_policy_data embedded in policy specific data -
    throtl_grp and cfq_group so that it's more conventional and consistent
    with how io_cq is handled.

    * blkcg_policy->pdata_size is renamed to ->pd_size.

    * Functions which used to take void *pdata now takes struct
    blkg_policy_data *pd.

    * blkg_to_pdata/pdata_to_blkg() updated to blkg_to_pd/pd_to_blkg().

    * Dummy struct blkg_policy_data definition added. Dummy
    pdata_to_blkg() definition was unused and inconsistent with the
    non-dummy version - correct dummy pd_to_blkg() added.

    * throtl and cfq updated accordingly.

    * As dummy blkg_to_pd/pd_to_blkg() are provided,
    blkg_to_cfqg/cfqg_to_blkg() don't need to be ifdef'd. Moved outside
    ifdef block.

    This patch doesn't introduce any functional change.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • During the recent blkcg cleanup, most of blkcg API has changed to such
    extent that mass renaming wouldn't cause any noticeable pain. Take
    the chance and cleanup the naming.

    * Rename blkio_cgroup to blkcg.

    * Drop blkio / blkiocg prefixes and consistently use blkcg.

    * Rename blkio_group to blkcg_gq, which is consistent with io_cq but
    keep the blkg prefix / variable name.

    * Rename policy method type and field names to signify they're dealing
    with policy data.

    * Rename blkio_policy_type to blkcg_policy.

    This patch doesn't cause any functional change.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • blkio_group->path[] stores the path of the associated cgroup and is
    used only for debug messages. Just format the path from blkg->cgroup
    when printing debug messages.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • There's no reason to keep blkgs around if no policy is activated for
    the queue. This patch moves queue locking out of blkg_destroy_all()
    and call it from blkg_deactivate_policy() on deactivation of the last
    policy on the queue.

    This change was suggested by Vivek.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • * All_q_list is unused. Drop all_q_{mutex|list}.

    * @for_root of blkg_lookup_create() is always %false when called from
    outside blk-cgroup.c proper. Factor out __blkg_lookup_create() so
    that it doesn't check whether @q is bypassing and use the
    underscored version for the @for_root callsite.

    * blkg_destroy_all() is used only from blkcg proper and @destroy_root
    is always %true. Make it static and drop @destroy_root.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • All blkcg policies were assumed to be enabled on all request_queues.
    Due to various implementation obstacles, during the recent blkcg core
    updates, this was temporarily implemented as shooting down all !root
    blkgs on elevator switch and policy [de]registration combined with
    half-broken in-place root blkg updates. In addition to being buggy
    and racy, this meant losing all blkcg configurations across those
    events.

    Now that blkcg is cleaned up enough, this patch replaces the temporary
    implementation with proper per-queue policy activation. Each blkcg
    policy should call the new blkcg_[de]activate_policy() to enable and
    disable the policy on a specific queue. blkcg_activate_policy()
    allocates and installs policy data for the policy for all existing
    blkgs. blkcg_deactivate_policy() does the reverse. If a policy is
    not enabled for a given queue, blkg printing / config functions skip
    the respective blkg for the queue.

    blkcg_activate_policy() also takes care of root blkg creation, and
    cfq_init_queue() and blk_throtl_init() are updated accordingly.

    This replaces blkcg_bypass_{start|end}() and update_root_blkg_pd()
    unnecessary. Dropped.

    v2: cfq_init_queue() was returning uninitialized @ret on root_group
    alloc failure if !CONFIG_CFQ_GROUP_IOSCHED. Fixed.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Currently, blkg_lookup() doesn't check @q bypass state. This patch
    updates blk_queue_bypass_start() to do synchronize_rcu() before
    returning and updates blkg_lookup() to check blk_queue_bypass() and
    return %NULL if bypassing. This ensures blkg_lookup() returns %NULL
    if @q is bypassing.

    This is to guarantee that nobody is accessing policy data while @q is
    bypassing, which is necessary to allow replacing blkio_cgroup->pd[] in
    place on policy [de]activation.

    v2: Added more comments explaining bypass guarantees as suggested by
    Vivek.

    v3: Added more comments explaining why there's no synchronize_rcu() in
    blk_cleanup_queue() as suggested by Vivek.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Add @pol to blkg_conf_prep() and let it return with queue lock held
    (to be released by blkg_conf_finish()). Note that @pol isn't used
    yet.

    This is to prepare for per-queue policy activation and doesn't cause
    any visible difference.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Remove BLKIO_POLICY_* enums and let blkio_policy_register() allocate
    @pol->plid dynamically on registration. The maximum number of blkcg
    policies which can be registered at the same time is defined by
    BLKCG_MAX_POLS constant added to include/linux/blkdev.h.

    Note that blkio_policy_register() now may fail. Policy init functions
    updated accordingly and unnecessary ifdefs removed from cfq_init().

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • The two functions were taking "enum blkio_policy_id plid". Make them
    take "const struct blkio_policy_type *pol" instead.

    This is to prepare for per-queue policy activation and doesn't cause
    any functional difference.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • With blkio_policy[], blkio_list is redundant and hinders with
    per-queue policy activation. Remove it. Also, replace
    blkio_list_lock with a mutex blkcg_pol_mutex and let it protect the
    whole [un]registration.

    This is to prepare for per-queue policy activation and doesn't cause
    any functional difference.

    Signed-off-by: Tejun Heo
    Cc: Vivek Goyal
    Signed-off-by: Jens Axboe

    Tejun Heo
     

02 Apr, 2012

20 commits

  • Now that all stat handling code lives in policy implementations,
    there's no need to encode policy ID in cft->private.

    * Export blkcg_prfill_[rw]stat() from blkcg, remove
    blkcg_print_[rw]stat(), and implement cfqg_print_[rw]stat() which
    use hard-code BLKIO_POLICY_PROP.

    * Use cft->private for offset of the target field directly and drop
    BLKCG_STAT_{PRIV|POL|OFF}().

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Now that all conf and stat fields are moved into policy specific
    blkio_policy_data->pdata areas, there's no reason to use
    blkio_policy_data itself in prfill functions. Pass around @pd->pdata
    instead of @pd.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkio_group_conf->weight is owned by cfq and has no reason to be
    defined in blkcg core. Replace it with cfq_group->dev_weight and let
    conf setting functions directly set it. If dev_weight is zero, the
    cfqg doesn't have device specific weight configured.

    Also, rename BLKIO_WEIGHT_* constants to CFQ_WEIGHT_* and rename
    blkio_cgroup->weight to blkio_cgroup->cfq_weight. We eventually want
    per-policy storage in blkio_cgroup but just mark the ownership of the
    field for now.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkio_group_stats_cpu is used only by blk-throtl and has no reason to
    be defined in blkcg core.

    * Move blkio_group_stats_cpu to blk-throttle.c and rename it to
    tg_stats_cpu.

    * blkg_policy_data->stats_cpu is replaced with throtl_grp->stats_cpu.
    prfill functions updated accordingly.

    * All related macros / functions are renamed so that they have tg_
    prefix and the unnecessary @pol arguments are dropped.

    * Per-cpu stats allocation code is also moved from blk-cgroup.c to
    blk-throttle.c and gets simplified to only deal with
    BLKIO_POLICY_THROTL. percpu stat free is performed by the exit
    method throtl_exit_blkio_group().

    * throtl_reset_group_stats() implemented for
    blkio_reset_group_stats_fn method so that tg->stats_cpu can be
    reset.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkio_group_stats contains only fields used by cfq and has no reason
    to be defined in blkcg core.

    * Move blkio_group_stats to cfq-iosched.c and rename it to cfqg_stats.

    * blkg_policy_data->stats is replaced with cfq_group->stats.
    blkg_prfill_[rw]stat() are updated to use offset against pd->pdata
    instead.

    * All related macros / functions are renamed so that they have cfqg_
    prefix and the unnecessary @pol arguments are dropped.

    * All stat functions now take cfq_group * instead of blkio_group *.

    * lockdep assertion on queue lock dropped. Elevator runs under queue
    lock by default. There isn't much to be gained by adding lockdep
    assertions at stat function level.

    * cfqg_stats_reset() implemented for blkio_reset_group_stats_fn method
    so that cfqg->stats can be reset.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Add blkio_policy_ops->blkio_exit_group_fn() and
    ->blkio_reset_group_stats_fn(). These will be used to further
    modularize blkcg policy implementation.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkio_group_stats_cpu is used to count dispatch stats using per-cpu
    counters. This is used by both blk-throtl and cfq-iosched but the
    sharing is rather silly.

    * cfq-iosched doesn't need per-cpu dispatch stats. cfq always updates
    those stats while holding queue_lock.

    * blk-throtl needs per-cpu dispatch stats but only service_bytes and
    serviced. It doesn't make use of sectors.

    This patch makes cfq add and use global stats for service_bytes,
    serviced and sectors, removes per-cpu sectors counter and moves
    per-cpu stat printing code to blk-throttle.c.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • As with conf/stats file handling code, there's no reason for stat
    update code to live in blkcg core with policies calling into update
    them. The current organization is both inflexible and complex.

    This patch moves stat update code to specific policies. All
    blkiocg_update_*_stats() functions which deal with BLKIO_POLICY_PROP
    stats are collapsed into their cfq_blkiocg_update_*_stats()
    counterparts. blkiocg_update_dispatch_stats() is used by both
    policies and duplicated as throtl_update_dispatch_stats() and
    cfq_blkiocg_update_dispatch_stats(). This will be cleaned up later.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkcg conf/stat handling is convoluted in that details which belong to
    specific policy implementations are all out in blkcg core and then
    policies hook into core layer to access and manipulate confs and
    stats. This sadly achieves both inflexibility (confs/stats can't be
    modified without messing with blkcg core) and complexity (all the
    call-ins and call-backs).

    The previous patches restructured conf and stat handling code such
    that they can be separated out. This patch relocates the file
    handling part. All conf/stat file handling code which belongs to
    BLKIO_POLICY_PROP is moved to cfq-iosched.c and all
    BKLIO_POLICY_THROTL code to blk-throtl.c.

    The move is verbatim except for blkio_update_group_{weight|bps|iops}()
    callbacks which relays conf changes to policies. The configuration
    settings are handled in policies themselves so the relaying isn't
    necessary. Conf setting functions are modified to directly call
    per-policy update functions and the relaying mechanism is dropped.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Add blkiop->cftypes which is added and removed together with the
    policy. This will be used to move conf/stat handling to the policies.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • conf/stat handling is about to be moved to policy implementation from
    blkcg core. Export conf/stat helpers from blkcg core so that
    blk-throttle and cfq-iosched can use them.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkg_conf_prep() implements "MAJ:MIN VAL" parsing manually, which is
    unnecessary. Just use sscanf("%u:%u %llu"). This might not reject
    some malformed input (extra input at the end) but we don't care.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • As part of userland interface restructuring, this patch updates
    per-blkio_group configuration setting. Instead of funneling
    everything through a master function which has hard-coded cases for
    each config file it may handle, the common part is factored into
    blkg_conf_prep() and blkg_conf_finish() and different configuration
    setters are implemented using the helpers.

    While this doesn't result in immediate LOC reduction, this enables
    further cleanups and more modular implementation.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Similarly to the previous stat restructuring, this patch restructures
    conf printing code such that,

    * Conf printing uses the same helpers as stat.

    * Printing function doesn't require hardcoded switching on the config
    being printed. Note that this isn't complete yet for throttle
    confs. The next patch will convert setting for these confs and will
    complete the transition.

    * Printing uses read_seq_string callback (other methods will be phased
    out).

    Note that blkio_group_conf.iops[2] is changed to u64 so that they can
    be manipulated with the same functions. This is transitional and will
    go away later.

    After this patch, per-device configurations - weight, bps and iops -
    use __blkg_prfill_u64() for printing which uses white space as
    delimiter instead of tab.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkiocg_file_write_u64() has single switch case. Drop
    blkiocg_file_write_u64(), rename blkio_weight_write() to
    blkcg_set_weight() and use it directly for .write_u64 callback.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkcg stats handling is a mess. None of the stats has much to do with
    blkcg core but they are all implemented in blkcg core. Code sharing
    is achieved by mixing common code with hard-coded cases for each stat
    counter.

    This patch restructures statistics printing such that

    * Common logic exists as helper functions and specific print functions
    use the helpers to implement specific cases.

    * Printing functions serving multiple counters don't require hardcoded
    switching on specific counters.

    * Printing uses read_seq_string callback (other methods will be phased
    out).

    This change enables further cleanups and relocating stats code to the
    policy implementation it belongs to.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • blkcg uses u64_stats_sync to avoid reading wrong u64 statistic values
    on 32bit archs and some stat counters have subtypes to distinguish
    read/writes and sync/async IOs. The stat code paths are confusing and
    involve a lot of going back and forth between blkcg core and specific
    policy implementations, and synchronization and subtype handling are
    open coded in blkcg core.

    This patch introduces struct blkg_stat and blkg_rwstat which, with
    accompanying operations, encapsulate stat updating and accessing with
    proper synchronization.

    blkg_stat is simple u64 counter with 64bit read-access protection.
    blkg_rwstat is the one with rw and [a]sync subcounters and takes @rw
    flags to distinguish IO subtypes (%REQ_WRITE and %REQ_SYNC) and
    replaces stat_sub_type indexed arrays.

    All counters in blkio_group_stats and blkio_group_stats_cpu are
    replaced with either blkg_stat or blkg_rwstat along with all users.

    This does add one u64_stats_sync per counter and increase stats_sync
    operations but they're empty/noops on 64bit archs and blkcg doesn't
    have too many counters, especially with DEBUG_BLK_CGROUP off.

    While the currently resulting code isn't necessarily simpler at the
    moment, this will enable further clean up of blkcg stats code.

    - BLKIO_STAT_{READ|WRITE|SYNC|ASYNC|TOTAL} renamed to
    BLKG_RWSTAT_{READ|WRITE|SYNC|ASYNC|TOTAL}.

    - blkg_stat_add() replaces blkio_add_stat() and
    blkio_check_and_dec_stat(). Note that BUG_ON() on underflow in the
    latter function no longer exists. It's *way* better to have
    underflowed stat counters than oopsing.

    - blkio_group_stats->dequeue is now a proper u64 stat counter instead
    of ulong.

    - reset_stats() updated to clear each stat counters individually and
    BLKG_STATS_DEBUG_CLEAR_{START|SIZE} are removed.

    - Some functions reconstruct rw flags from direction and sync
    booleans. This will be removed by future patches.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • @pol to blkg_to_pdata() and @plid to blkg_lookup_create() are no
    longer necessary. Drop them.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • cgroup/for-3.5 contains the following changes which blk-cgroup needs
    to proceed with the on-going cleanup.

    * Dynamic addition and removal of cftypes to make config/stat file
    handling modular for policies.

    * cgroup removal update to not wait for css references to drain to fix
    blkcg removal hang caused by cfq caching cfqgs.

    Pull in cgroup/for-3.5 into block/for-3.5/core. This causes the
    following conflicts in block/blk-cgroup.c.

    * 761b3ef50e "cgroup: remove cgroup_subsys argument from callbacks"
    conflicts with blkiocg_pre_destroy() addition and blkiocg_attach()
    removal. Resolved by removing @subsys from all subsys methods.

    * 676f7c8f84 "cgroup: relocate cftype and cgroup_subsys definitions in
    controllers" conflicts with ->pre_destroy() and ->attach() updates
    and removal of modular config. Resolved by dropping forward
    declarations of the methods and applying updates to the relocated
    blkio_subsys.

    * 4baf6e3325 "cgroup: convert all non-memcg controllers to the new
    cftype interface" builds upon the previous item. Resolved by adding
    ->base_cftypes to the relocated blkio_subsys.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Convert debug, freezer, cpuset, cpu_cgroup, cpuacct, net_prio, blkio,
    net_cls and device controllers to use the new cftype based interface.
    Termination entry is added to cftype arrays and populate callbacks are
    replaced with cgroup_subsys->base_cftypes initializations.

    This is functionally identical transformation. There shouldn't be any
    visible behavior change.

    memcg is rather special and will be converted separately.

    Signed-off-by: Tejun Heo
    Acked-by: Li Zefan
    Cc: Paul Menage
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Cc: "David S. Miller"
    Cc: Vivek Goyal

    Tejun Heo