28 Feb, 2015

2 commits

  • With the exception of infiniband media which does not use media
    offsets, the media address is always located at offset 4 in the
    media info field as defined by the protocol, so we move the
    definition to the generic bearer.h

    Signed-off-by: Erik Hugne
    Signed-off-by: David S. Miller

    Erik Hugne
     
  • The TIPC_MEDIA_ADDR_SIZE and TIPC_MEDIA_ADDR_OFFSET names
    are misleading, as they actually define the size and offset of
    the whole media info field and not the address part. This patch
    does not have any functional changes.

    Signed-off-by: Erik Hugne
    Signed-off-by: David S. Miller

    Erik Hugne
     

15 May, 2014

1 commit

  • TIPC currently handles two media specific addresses: Ethernet MAC
    addresses and InfiniBand addresses. Those are kept in three different
    formats:

    1) A "raw" format as obtained from the device. This format is known
    only by the media specific adapter code in eth_media.c and
    ib_media.c.
    2) A "generic" internal format, in the form of struct tipc_media_addr,
    which can be referenced and passed around by the generic media-
    unaware code.
    3) A serialized version of the latter, to be conveyed in neighbor
    discovery messages.

    Conversion between the three formats can only be done by the media
    specific code, so we have function pointers for this purpose in
    struct tipc_media. Here, the media adapters can install their own
    conversion functions at startup.

    We now introduce a new such function, 'raw2addr()', whose purpose
    is to convert from format 1 to format 2 above. We also try to as far
    as possible uniform commenting, variable names and usage of these
    functions, with the purpose of making them more comprehensible.

    We can now also remove the function tipc_l2_media_addr_set(), whose
    job is done better by the new function.

    Finally, we expand the field for serialized addresses (format 3)
    in discovery messages from 20 to 32 bytes. This is permitted
    according to the spec, and reduces the risk of problems when we
    add new media in the future.

    Signed-off-by: Jon Maloy
    Reviewed-by: Ying Xue
    Signed-off-by: David S. Miller

    Jon Paul Maloy
     

11 Dec, 2013

4 commits

  • Currently TIPC supports two L2 media types, Ethernet and Infiniband.
    Because both these media are accessed through the common net_device API,
    several functions in the two media adaptation files turn out to be
    fully or almost identical, leading to unnecessary code duplication.

    In this commit we extract this common code from the two media files
    and move them to the generic bearer.c. Additionally, we change
    the function names to reflect their real role: to access L2 media,
    irrespective of type.

    Signed-off-by: Ying Xue
    Cc: Patrick McHardy
    Reviewed-by: Paul Gortmaker
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Ying Xue
     
  • Currently, registering a TIPC stack handler in the network device layer
    is done twice, once for Ethernet (eth_media) and Infiniband (ib_media)
    repectively. But, as this registration is not media specific, we can
    avoid some code duplication by moving the registering function to
    the generic bearer layer, to the file bearer.c, and call it only once.
    The same is true for the network device event notifier.

    As a side effect, the two workqueues we are using for for setting up/
    cleaning up media can now be eliminated. Furthermore, the array for
    storing the specific media type structs, media_array[], can be entirely
    deleted.

    Note that the eth_started and ib_started flags were removed during the
    code relocation. There is now only one call to bearer_setup and
    bearer_cleanup, and these can logically not race against each other.

    Despite its size, this cleanup work incurs no functional changes in TIPC.
    In particular, it should be noted that the sequence ordering of received
    packets is unaffected by this change, since packet reception never was
    subject to any work queue handling in the first place.

    Signed-off-by: Ying Xue
    Cc: Patrick McHardy
    Signed-off-by: Jon Maloy
    Reviewed-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Ying Xue
     
  • TIPC is currently using the field 'af_packet_priv' in struct net_device
    as a handle to find the bearer instance associated to the given network
    device. But, by doing so it is blocking other networking cleanups, such
    as the one discussed here:

    http://patchwork.ozlabs.org/patch/178044/

    This commit removes this usage from TIPC. Instead, we introduce a new
    field, 'tipc_ptr', to the net_device structure, to serve this purpose.
    When TIPC bearer is enabled, the bearer object is associated to
    'tipc_ptr'. When a TIPC packet arrives in the recv_msg() upcall
    from a networking device, the bearer object can now be obtained from
    'tipc_ptr'. When a bearer is disabled, the bearer object is detached
    from its underlying network device by setting 'tipc_ptr' to NULL.

    Additionally, an RCU lock is used to protect the new pointer.
    Henceforth, the existing tipc_net_lock is used in write mode to
    serialize write accesses to this pointer, while the new RCU lock is
    applied on the read side to ensure that the pointer is 100% valid
    within its wrapped area for all readers.

    Signed-off-by: Ying Xue
    Cc: Patrick McHardy
    Reviewed-by: Paul Gortmaker
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Ying Xue
     
  • Communication media types are abstracted through the struct 'tipc_media',
    one per media type. These structs are allocated statically inside their
    respective media file.

    Furthermore, in order to be able to reach all instances from a central
    location, we keep a static array with pointers to these structs. This
    array is currently initialized at runtime, under protection of
    tipc_net_lock. However, since the contents of the array itself never
    changes after initialization, we can just as well initialize it at
    compile time and make it 'const', at the same time making it obvious
    that no lock protection is needed here.

    This commit makes the array constant and removes the redundant lock
    protection.

    Signed-off-by: Ying Xue
    Reviewed-by: Paul Gortmaker
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Jon Paul Maloy
     

10 Dec, 2013

1 commit

  • struct 'tipc_bearer' is a generic representation of the underlying
    media type, and exists in a one-to-one relationship to each interface
    TIPC is using. The struct contains a 'blocked' flag that mirrors the
    operational and execution state of the represented interface, and is
    updated through notification calls from the latter. The users of
    tipc_bearer are checking this flag before each attempt to send a
    packet via the interface.

    This state mirroring serves no purpose in the current code base. TIPC
    links will not discover a media failure any faster through this
    mechanism, and in reality the flag only adds overhead at packet
    sending and reception.

    Furthermore, the fact that the flag needs to be protected by a spinlock
    aggregated into tipc_bearer has turned out to cause a serious and
    completely unnecessary deadlock problem.

    CPU0 CPU1
    ---- ----
    Time 0: bearer_disable() link_timeout()
    Time 1: spin_lock_bh(&b_ptr->lock) tipc_link_push_queue()
    Time 2: tipc_link_delete() tipc_bearer_blocked(b_ptr)
    Time 3: k_cancel_timer(&req->timer) spin_lock_bh(&b_ptr->lock)
    Time 4: del_timer_sync(&req->timer)

    I.e., del_timer_sync() on CPU0 never returns, because the timer handler
    on CPU1 is waiting for the bearer lock.

    We eliminate the 'blocked' flag from struct tipc_bearer, along with all
    tests on this flag. This not only resolves the deadlock, but also
    simplifies and speeds up the data path execution of TIPC. It also fits
    well into our ongoing effort to make the locking policy simpler and
    more manageable.

    An effect of this change is that we can get rid of functions such as
    tipc_bearer_blocked(), tipc_continue() and tipc_block_bearer().
    We replace the latter with a new function, tipc_reset_bearer(), which
    resets all links associated to the bearer immediately after an
    interface goes down.

    A user might notice one slight change in link behaviour after this
    change. When an interface goes down, (e.g. through a NETDEV_DOWN
    event) all attached links will be reset immediately, instead of
    leaving it to each link to detect the failure through a timer-driven
    mechanism. We consider this an improvement, and see no obvious risks
    with the new behavior.

    Signed-off-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Paul Gortmaker
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Erik Hugne
     

19 Oct, 2013

3 commits

  • Currently, rcv_msg() always returns zero on a packet delivery upcall
    from net_device.

    To make its behavior more compliant with the way this API should be
    used, we change this to let it return NET_RX_SUCCESS (which is zero
    anyway) when it is able to handle the packet, and NET_RX_DROP otherwise.
    The latter does not imply any functional change, it only enables the
    driver to keep more accurate statistics about the fate of delivered
    packets.

    Signed-off-by: Ying Xue
    Reviewed-by: Paul Gortmaker
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Ying Xue
     
  • tipc_block_bearer() currently takes a bearer name (const char*)
    as argument. This requires the function to make a lookup to find
    the pointer to the corresponding bearer struct. In the current
    code base this is not necessary, since the only two callers
    (tipc_continue(),recv_notification()) already have validated
    copies of this pointer, and hence can pass it directly in the
    function call.

    We change tipc_block_bearer() to directly take struct tipc_bearer*
    as argument instead.

    Signed-off-by: Ying Xue
    Reviewed-by: Paul Gortmaker
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Ying Xue
     
  • TIPC 'bearer' exists as an abstract concept, while 'media'
    is deemed a specific implementation of a bearer, such as Ethernet
    or Infiniband media. When a component inside TIPC wants to control
    a specific media, it only needs to access the generic bearer API
    to achieve this. However, in the current media implementations,
    the 'bearer' name is also extensively used in media specific
    function and variable names.

    This may create confusion, so we choose to replace the term 'bearer'
    with 'media' in all function names, variable names, and prefixes
    where this is what really is meant.

    Note that this change is cosmetic only, and no runtime behaviour
    changes are made here.

    Signed-off-by: Ying Xue
    Reviewed-by: Paul Gortmaker
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Ying Xue
     

18 Jun, 2013

2 commits

  • Convert enable_bearer() to RCU locking with dev_get_by_name().

    Based on a similar changeset in commit 840a185d ["aoe: remove
    dev_base_lock use from aoecmd_cfg_pkts()"] -- quoting that:

    "dev_base_lock is the legacy way to lock the device list,
    and is planned to disappear. (writers hold RTNL, readers
    hold RCU lock)"

    Signed-off-by: Ying Xue
    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Ying Xue
     
  • No runtime code changes here. Just a realign of the function
    arguments to start where the 1st one was, and fit as many args
    as can be put in an 80 char line.

    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Paul Gortmaker
     

29 May, 2013

1 commit

  • So far, only net_device * could be passed along with netdevice notifier
    event. This patch provides a possibility to pass custom structure
    able to provide info that event listener needs to know.

    Signed-off-by: Jiri Pirko

    v2->v3: fix typo on simeth
    shortened dev_getter
    shortened notifier_info struct name
    v1->v2: fix notifier_call parameter in call_netdevice_notifier()
    Signed-off-by: David S. Miller

    Jiri Pirko
     

18 Apr, 2013

3 commits


20 Aug, 2012

2 commits

  • When the lockdep validator is enabled, it will report the below
    warning when we enable a TIPC bearer:

    [ INFO: possible irq lock inversion dependency detected ]
    ---------------------------------------------------------
    Possible interrupt unsafe locking scenario:

    CPU0 CPU1
    ---- ----
    lock(ptype_lock);
    local_irq_disable();
    lock(tipc_net_lock);
    lock(ptype_lock);

    lock(tipc_net_lock);

    *** DEADLOCK ***

    the shortest dependencies between 2nd lock and 1st lock:
    -> (ptype_lock){+.+...} ops: 10 {
    [...]
    SOFTIRQ-ON-W at:
    [] __lock_acquire+0x528/0x13e0
    [] lock_acquire+0x90/0x100
    [] _raw_spin_lock+0x38/0x50
    [] dev_add_pack+0x3a/0x60
    [] arp_init+0x1a/0x48
    [] inet_init+0x181/0x27e
    [] do_one_initcall+0x34/0x170
    [] kernel_init+0x110/0x1b2
    [] kernel_thread_helper+0x6/0x10
    [...]
    ... key at: [] ptype_lock+0x10/0x20
    ... acquired at:
    [] lock_acquire+0x90/0x100
    [] _raw_spin_lock+0x38/0x50
    [] dev_add_pack+0x3a/0x60
    [] enable_bearer+0xf2/0x140 [tipc]
    [] tipc_enable_bearer+0x1ba/0x450 [tipc]
    [] tipc_cfg_do_cmd+0x5c4/0x830 [tipc]
    [] handle_cmd+0x42/0xd0 [tipc]
    [] genl_rcv_msg+0x232/0x280
    [] netlink_rcv_skb+0x86/0xb0
    [] genl_rcv+0x1c/0x30
    [] netlink_unicast+0x174/0x1f0
    [] netlink_sendmsg+0x1eb/0x2d0
    [] sock_aio_write+0x161/0x170
    [] do_sync_write+0xac/0xf0
    [] vfs_write+0x156/0x170
    [] sys_write+0x42/0x70
    [] sysenter_do_call+0x12/0x38
    [...]
    }
    -> (tipc_net_lock){+..-..} ops: 4 {
    [...]
    IN-SOFTIRQ-R at:
    [] __lock_acquire+0x64a/0x13e0
    [] lock_acquire+0x90/0x100
    [] _raw_read_lock_bh+0x3d/0x50
    [] tipc_recv_msg+0x1d/0x830 [tipc]
    [] recv_msg+0x3f/0x50 [tipc]
    [] __netif_receive_skb+0x22a/0x590
    [] netif_receive_skb+0x2b/0xf0
    [] pcnet32_poll+0x292/0x780
    [] net_rx_action+0xfa/0x1e0
    [] __do_softirq+0xae/0x1e0
    [...]
    }

    >From the log, we can see three different call chains between
    CPU0 and CPU1:

    Time 0 on CPU0:

    kernel_init()->inet_init()->dev_add_pack()

    At time 0, the ptype_lock is held by CPU0 in dev_add_pack();

    Time 1 on CPU1:

    tipc_enable_bearer()->enable_bearer()->dev_add_pack()

    At time 1, tipc_enable_bearer() first holds tipc_net_lock, and then
    wants to take ptype_lock to register TIPC protocol handler into the
    networking stack. But the ptype_lock has been taken by dev_add_pack()
    on CPU0, so at this time the dev_add_pack() running on CPU1 has to be
    busy looping.

    Time 2 on CPU0:

    netif_receive_skb()->recv_msg()->tipc_recv_msg()

    At time 2, an incoming TIPC packet arrives at CPU0, hence
    tipc_recv_msg() will be invoked. In tipc_recv_msg(), it first wants
    to hold tipc_net_lock. At the moment, below scenario happens:

    On CPU0, below is our sequence of taking locks:

    lock(ptype_lock)->lock(tipc_net_lock)

    On CPU1, our sequence of taking locks looks like:

    lock(tipc_net_lock)->lock(ptype_lock)

    Obviously deadlock may happen in this case.

    But please note the deadlock possibly doesn't occur at all when the
    first TIPC bearer is enabled. Before enable_bearer() -- running on
    CPU1 does not hold ptype_lock, so the TIPC receive handler (i.e.
    recv_msg()) is not registered successfully via dev_add_pack(), so
    the tipc_recv_msg() cannot be called by recv_msg() even if a TIPC
    message comes to CPU0. But when the second TIPC bearer is
    registered, the deadlock can perhaps really happen.

    To fix it, we will push the work of registering TIPC protocol
    handler into workqueue context. After the change, both paths taking
    ptype_lock are always in process contexts, thus, the deadlock should
    never occur.

    Signed-off-by: Ying Xue
    Signed-off-by: Jon Maloy
    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Ying Xue
     
  • Ethernet media initialization is only done when TIPC is started or
    switched to network mode. So the initialization of the network device
    notifier structure can be moved out of this function and done
    statically instead.

    Signed-off-by: Ying Xue
    Signed-off-by: Jon Maloy
    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Ying Xue
     

01 May, 2012

1 commit

  • Some of the comment blocks are floating in limbo between two
    functions, or between blocks of code. Delete the extra line
    feeds between any comment and its associated following block
    of code, to be consistent with the majority of the rest of
    the kernel. Also delete trailing newlines at EOF and fix
    a couple trivial typos in existing comments.

    This is a 100% cosmetic change with no runtime impact. We get
    rid of over 500 lines of non-code, and being blank line deletes,
    they won't even show up as noise in git blame.

    Signed-off-by: Paul Gortmaker

    Paul Gortmaker
     

30 Dec, 2011

1 commit


28 Dec, 2011

7 commits

  • Gets rid of two pointless operations that zero out the array used to
    record information about TIPC's Ethernet bearers. There is no need to
    initialize the array on start up since it is a global variable that is
    already zero'd out, and there is no need to zero it out on exit because
    the array is never referenced again.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Modifies Ethernet bearer disable logic to break the association between
    the bearer and its device driver at the time the bearer is disabled,
    rather than when the TIPC module is unloaded. This allows the array
    entry used by the disabled bearer to be re-used if the same bearer (or
    a different one) is subsequently enabled.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Change TIPC's shutdown code to deactivate generic networking support
    before terminating Ethernet media support. The deactivation of generic
    networking support causes all existing bearers to be destroyed, meaning
    the Ethernet media termination routine no longer has to bother marking
    them as unavailable.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Reworks TIPC's media address data structure and associated processing
    routines to transfer all media-specific details of address conversion
    to the associated TIPC media adaptation code. TIPC's generic bearer code
    now only needs to know which media type an address is associated with
    and whether or not it is a broadcast address, and totally ignores the
    "value" field that contains the actual media-specific addressing info.

    These changes eliminate the need for a number of endianness conversion
    operations and will make it easier for TIPC to support new media types
    in the future.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Enhances TIPC's Ethernet media support to provide 3 new address conversion
    routines, which allow TIPC to interpret an address that is in string form
    and to convert an address to and from the 20 byte format used in TIPC's
    neighbor discovery messages.

    These routines are pre-requisites to a follow on commit that hides all
    media-specific addressing details from TIPC's generic bearer code.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Enhances conversion of a media address to printable form so that an
    unconvertable address will be displayed as a string of hex digits,
    rather than not being displayed at all. (Also removes a pointless check
    for the existence of the media-specific address conversion routine,
    since the routine is not optional.)

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Speeds up the registration of TIPC media types by passing in a structure
    containing the required information, rather than by passing in the various
    fields describing the media type individually.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     

18 Sep, 2011

3 commits


02 Jan, 2011

3 commits


03 Dec, 2010

1 commit

  • As part of the removal of TIPC's native API support it is no longer
    necessary for TIPC to export symbols for routines that can be called
    by kernel-based applications, nor for it to have header files that
    kernel-based applications can include to access the declarations for
    those routines. This commit eliminates the exporting of symbols by
    TIPC and migrates the contents of each obsolete native API include
    file into its corresponding non-native API equivalent.

    The code which was migrated in this commit was migrated intact, in
    that there are no technical changes combined with the relocation.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Allan Stephens
     

10 Sep, 2010

1 commit

  • Remove code that trimmed excess trailing info from incoming messages
    arriving over an Ethernet interface. TIPC now ignores the extra info
    while the message is being processed by the node, and only trims it off
    if the message is retransmitted to another node. (This latter step is
    done to ensure the extra info doesn't cause the sk_buff to exceed the
    outgoing interface's MTU limit.) The outgoing buffer is guaranteed to
    be linear.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Paul Gortmaker
     

07 Sep, 2010

2 commits

  • Cause TIPC to return EAGAIN if it is unable to enable a new Ethernet
    bearer because one or more recently disabled Ethernet bearers are
    temporarily consuming resources during shut down. (The previous error
    code, EDQUOT, is now returned only if all available Ethernet bearer
    data structures are fully enabled at the time the request to enable an
    additional bearer is received.)

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Allan Stephens
     
  • Add code to expand the headroom of an outgoing TIPC message if the
    sk_buff has insufficient room to hold the header for the associated
    Ethernet device. This change is necessary to ensure that messages
    TIPC does not create itself (eg. incoming messages that are being
    routed to another node) do not cause problems, since TIPC has no
    control over the amount of headroom available in such messages.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Allan Stephens
     

30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

18 May, 2009

1 commit