10 Oct, 2012

2 commits

  • If we're in FIPS mode, we should panic if we fail to verify the signature on a
    module or we're asked to load an unsigned module in signature enforcing mode.
    Possibly FIPS mode should automatically enable enforcing mode.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • We do a very simple search for a particular string appended to the module
    (which is cache-hot and about to be SHA'd anyway). There's both a config
    option and a boot parameter which control whether we accept or fail with
    unsigned modules and modules that are signed with an unknown key.

    If module signing is enabled, the kernel will be tainted if a module is
    loaded that is unsigned or has a signature for which we don't have the
    key.

    (Useful feedback and tweaks by David Howells )

    Signed-off-by: Rusty Russell
    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    Rusty Russell
     

08 Oct, 2012

16 commits

  • Add a crypto key parser for binary (DER) encoded X.509 certificates. The
    certificate is parsed and, if possible, the signature is verified.

    An X.509 key can be added like this:

    # keyctl padd crypto bar @s
    Signed-off-by: Rusty Russell

    David Howells
     
  • Provide a function to read raw data of a predetermined size into an MPI rather
    than expecting the size to be encoded within the data. The data is assumed to
    represent an unsigned integer, and the resulting MPI will be positive.

    The function looks like this:

    MPI mpi_read_raw_data(const void *, size_t);

    This is useful for reading ASN.1 integer primitives where the length is encoded
    in the ASN.1 metadata.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Add an ASN.1 BER/DER/CER decoder. This uses the bytecode from the ASN.1
    compiler in the previous patch to inform it as to what to expect to find in the
    encoded byte stream. The output from the compiler also tells it what functions
    to call on what tags, thus allowing the caller to retrieve information.

    The decoder is called as follows:

    int asn1_decoder(const struct asn1_decoder *decoder,
    void *context,
    const unsigned char *data,
    size_t datalen);

    The decoder argument points to the bytecode from the ASN.1 compiler. context
    is the caller's context and is passed to the action functions. data and
    datalen define the byte stream to be decoded.

    Note that the decoder is currently limited to datalen being less than 64K.
    This reduces the amount of stack space used by the decoder because ASN.1 is a
    nested construct. Similarly, the decoder is limited to a maximum of 10 levels
    of constructed data outside of a leaf node also in an effort to keep stack
    usage down.

    These restrictions can be raised if necessary.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Add a simple ASN.1 grammar compiler. This produces a bytecode output that can
    be fed to a decoder to inform the decoder how to interpret the ASN.1 stream it
    is trying to parse.

    Action functions can be specified in the grammar by interpolating:

    ({ foo })

    after a type, for example:

    SubjectPublicKeyInfo ::= SEQUENCE {
    algorithm AlgorithmIdentifier,
    subjectPublicKey BIT STRING ({ do_key_data })
    }

    The decoder is expected to call these after matching this type and parsing the
    contents if it is a constructed type.

    The grammar compiler does not currently support the SET type (though it does
    support SET OF) as I can't see a good way of tracking which members have been
    encountered yet without using up extra stack space.

    Currently, the grammar compiler will fail if more than 256 bytes of bytecode
    would be produced or more than 256 actions have been specified as it uses
    8-bit jump values and action indices to keep space usage down.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Add a pair of utility functions to render OIDs as strings. The first takes an
    encoded OID and turns it into a "a.b.c.d" form string:

    int sprint_oid(const void *data, size_t datasize,
    char *buffer, size_t bufsize);

    The second takes an OID enum index and calls the first on the data held
    therein:

    int sprint_OID(enum OID oid, char *buffer, size_t bufsize);

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Implement a simple static OID registry that allows the mapping of an encoded
    OID to an enum value for ease of use.

    The OID registry index enum appears in the:

    linux/oid_registry.h

    header file. A script generates the registry from lines in the header file
    that look like:

    OID_foo,/*1.2.3.4*/

    The actual OID is taken to be represented by the numbers with interpolated
    dots in the comment.

    All other lines in the header are ignored.

    The registry is queries by calling:

    OID look_up_oid(const void *data, size_t datasize);

    This returns a number from the registry enum representing the OID if found or
    OID__NR if not.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • gpg can produce a signature file where length of signature is less than the
    modulus size because the amount of space an MPI takes up is kept as low as
    possible by discarding leading zeros. This regularly happens for several
    modules during the build.

    Fix it by relaxing check in RSA verification code.

    Thanks to Tomas Mraz and Miloslav Trmac for help.

    Signed-off-by: Milan Broz
    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Implement RSA public key cryptography [PKCS#1 / RFC3447]. At this time, only
    the signature verification algorithm is supported. This uses the asymmetric
    public key subtype to hold its key data.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Reinstate and export mpi_cmp() and mpi_cmp_ui() from the MPI library for use by
    RSA signature verification as per RFC3447 section 5.2.2 step 1.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Provide signature verification using an asymmetric-type key to indicate the
    public key to be used.

    The API is a single function that can be found in crypto/public_key.h:

    int verify_signature(const struct key *key,
    const struct public_key_signature *sig)

    The first argument is the appropriate key to be used and the second argument
    is the parsed signature data:

    struct public_key_signature {
    u8 *digest;
    u16 digest_size;
    enum pkey_hash_algo pkey_hash_algo : 8;
    union {
    MPI mpi[2];
    struct {
    MPI s; /* m^d mod n */
    } rsa;
    struct {
    MPI r;
    MPI s;
    } dsa;
    };
    };

    This should be filled in prior to calling the function. The hash algorithm
    should already have been called and the hash finalised and the output should
    be in a buffer pointed to by the 'digest' member.

    Any extra data to be added to the hash by the hash format (eg. PGP) should
    have been added by the caller prior to finalising the hash.

    It is assumed that the signature is made up of a number of MPI values. If an
    algorithm becomes available for which this is not the case, the above structure
    will have to change.

    It is also assumed that it will have been checked that the signature algorithm
    matches the key algorithm.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Add a subtype for supporting asymmetric public-key encryption algorithms such
    as DSA (FIPS-186) and RSA (PKCS#1 / RFC1337).

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • The instantiation data passed to the asymmetric key type are expected to be
    formatted in some way, and there are several possible standard ways to format
    the data.

    The two obvious standards are OpenPGP keys and X.509 certificates. The latter
    is especially useful when dealing with UEFI, and the former might be useful
    when dealing with, say, eCryptfs.

    Further, it might be desirable to provide formatted blobs that indicate
    hardware is to be accessed to retrieve the keys or that the keys live
    unretrievably in a hardware store, but that the keys can be used by means of
    the hardware.

    From userspace, the keys can be loaded using the keyctl command, for example,
    an X.509 binary certificate:

    keyctl padd asymmetric foo @s
    Signed-off-by: Rusty Russell

    David Howells
     
  • Create a key type that can be used to represent an asymmetric key type for use
    in appropriate cryptographic operations, such as encryption, decryption,
    signature generation and signature verification.

    The key type is "asymmetric" and can provide access to a variety of
    cryptographic algorithms.

    Possibly, this would be better as "public_key" - but that has the disadvantage
    that "public key" is an overloaded term.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • In-source documentation for the asymmetric key type. This will be located in:

    Documentation/crypto/asymmetric-keys.txt

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     
  • Provide count_leading/trailing_zeros() macros based on extant arch bit scanning
    functions rather than reimplementing from scratch in MPILIB.

    Whilst we're at it, turn count_foo_zeros(n, x) into n = count_foo_zeros(x).

    Also move the definition to asm-generic as other people may be interested in
    using it.

    Signed-off-by: David Howells
    Cc: David S. Miller
    Cc: Dmitry Kasatkin
    Cc: Arnd Bergmann
    Signed-off-by: Rusty Russell

    David Howells
     
  • Give the key type the opportunity to preparse the payload prior to the
    instantiation and update routines being called. This is done with the
    provision of two new key type operations:

    int (*preparse)(struct key_preparsed_payload *prep);
    void (*free_preparse)(struct key_preparsed_payload *prep);

    If the first operation is present, then it is called before key creation (in
    the add/update case) or before the key semaphore is taken (in the update and
    instantiate cases). The second operation is called to clean up if the first
    was called.

    preparse() is given the opportunity to fill in the following structure:

    struct key_preparsed_payload {
    char *description;
    void *type_data[2];
    void *payload;
    const void *data;
    size_t datalen;
    size_t quotalen;
    };

    Before the preparser is called, the first three fields will have been cleared,
    the payload pointer and size will be stored in data and datalen and the default
    quota size from the key_type struct will be stored into quotalen.

    The preparser may parse the payload in any way it likes and may store data in
    the type_data[] and payload fields for use by the instantiate() and update()
    ops.

    The preparser may also propose a description for the key by attaching it as a
    string to the description field. This can be used by passing a NULL or ""
    description to the add_key() system call or the key_create_or_update()
    function. This cannot work with request_key() as that required the description
    to tell the upcall about the key to be created.

    This, for example permits keys that store PGP public keys to generate their own
    name from the user ID and public key fingerprint in the key.

    The instantiate() and update() operations are then modified to look like this:

    int (*instantiate)(struct key *key, struct key_preparsed_payload *prep);
    int (*update)(struct key *key, struct key_preparsed_payload *prep);

    and the new payload data is passed in *prep, whether or not it was preparsed.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells
     

28 Sep, 2012

5 commits

  • The original module-init-tools module loader used a fnctl lock on the
    .ko file to avoid attempts to simultaneously load a module.
    Unfortunately, you can't get an exclusive fcntl lock on a read-only
    fd, making this not work for read-only mounted filesystems.
    module-init-tools has a hacky sleep-and-loop for this now.

    It's not that hard to wait in the kernel, and only return -EEXIST once
    the first module has finished loading (or continue loading the module
    if the first one failed to initialize for some reason). It's also
    consistent with what we do for dependent modules which are still loading.

    Suggested-by: Lucas De Marchi
    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • We use resolve_symbol_wait(), which blocks if the module containing
    the symbol is still loading. However:

    1) The module_wq we use is only woken after calling the modules' init
    function, but there are other failure paths after the module is
    placed in the linked list where we need to do the same thing.

    2) wake_up() only wakes one waiter, and our waitqueue is shared by all
    modules, so we need to wake them all.

    3) wake_up_all() doesn't imply a memory barrier: I feel happier calling
    it after we've grabbed and dropped the module_mutex, not just after
    the state assignment.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • Use the mapping of Elf_[SPE]hdr, Elf_Addr, Elf_Sym, Elf_Dyn, Elf_Rel/Rela,
    ELF_R_TYPE() and ELF_R_SYM() to either the 32-bit version or the 64-bit version
    into asm-generic/module.h for all arches bar MIPS.

    Also, use the generic definition mod_arch_specific where possible.

    To this end, I've defined three new config bools:

    (*) HAVE_MOD_ARCH_SPECIFIC

    Arches define this if they don't want to use the empty generic
    mod_arch_specific struct.

    (*) MODULES_USE_ELF_RELA

    Arches define this if their modules can contain RELA records. This causes
    the Elf_Rela mapping to be emitted and allows apply_relocate_add() to be
    defined by the arch rather than have the core emit an error message.

    (*) MODULES_USE_ELF_REL

    Arches define this if their modules can contain REL records. This causes
    the Elf_Rel mapping to be emitted and allows apply_relocate() to be
    defined by the arch rather than have the core emit an error message.

    Note that it is possible to allow both REL and RELA records: m68k and mips are
    two arches that do this.

    With this, some arch asm/module.h files can be deleted entirely and replaced
    with a generic-y marker in the arch Kbuild file.

    Additionally, I have removed the bits from m32r and score that handle the
    unsupported type of relocation record as that's now handled centrally.

    Signed-off-by: David Howells
    Acked-by: Sam Ravnborg
    Signed-off-by: Rusty Russell

    David Howells
     
  • Fixes build failure introduced by "Make most arch asm/module.h files use
    asm-generic/module.h" by moving all the RELA processing code to a
    separate file to be used only for RELA processing on 64-bit kernels.

    CC arch/mips/kernel/module.o
    arch/mips/kernel/module.c:250:14: error: 'reloc_handlers_rela' defined but not
    used [-Werror=unused-variable]
    cc1: all warnings being treated as errors

    make[6]: *** [arch/mips/kernel/module.o] Error 1

    Signed-off-by: Ralf Baechle
    Signed-off-by: Rusty Russell

    Ralf Baechle
     
  • Cloudlinux have a product called lve that includes a kernel module. This
    was previously GPLed but is now under a proprietary license, but the
    module continues to declare MODULE_LICENSE("GPL") and makes use of some
    EXPORT_SYMBOL_GPL symbols. Forcibly taint it in order to avoid this.

    Signed-off-by: Matthew Garrett
    Cc: Alex Lyashkov
    Signed-off-by: Rusty Russell
    Cc: stable@kernel.org

    Matthew Garrett
     

19 Sep, 2012

2 commits

  • Pull hwspinlock fix from Ohad Ben-Cohen:
    "A single hwspinlock fix by Wei Yongjun, which prevents potential NULL
    dereferences"

    * tag 'hwspinlock-3.6-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ohad/hwspinlock:
    hwspinlock/core: move the dereference below the NULL test

    Linus Torvalds
     
  • IBM reported a soft lockup after applying the fix for the rename_lock
    deadlock. Commit c83ce989cb5f ("VFS: Fix the nfs sillyrename regression
    in kernel 2.6.38") was found to be the culprit.

    The nfs sillyrename fix used DCACHE_DISCONNECTED to indicate that the
    dentry was killed. This flag can be set on non-killed dentries too,
    which results in infinite retries when trying to traverse the dentry
    tree.

    This patch introduces a separate flag: DCACHE_DENTRY_KILLED, which is
    only set in d_kill() and makes try_to_ascend() test only this flag.

    IBM reported successful test results with this patch.

    Signed-off-by: Miklos Szeredi
    Cc: Trond Myklebust
    Cc: stable@vger.kernel.org
    Signed-off-by: Linus Torvalds

    Miklos Szeredi
     

18 Sep, 2012

15 commits

  • Pull another workqueue fix from Tejun Heo:
    "Unfortunately, yet another late fix. This too is discovered and fixed
    by Lai. This bug was introduced during this merge window by commit
    25511a477657 ("workqueue: reimplement CPU online rebinding to handle
    idle workers") which started using WORKER_REBIND flag for idle rebind
    too.

    The bug is relatively easy to trigger if the CPU rapidly goes through
    off, on and then off (and stay off). The fix is on the safer side.
    This hasn't been on linux-next yet but I'm pushing early so that it
    can get more exposure before v3.6 release."

    * 'for-3.6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:
    workqueue: always clear WORKER_REBIND in busy_worker_rebind_fn()

    Linus Torvalds
     
  • busy_worker_rebind_fn() didn't clear WORKER_REBIND if rebinding failed
    (CPU is down again). This used to be okay because the flag wasn't
    used for anything else.

    However, after 25511a477 "workqueue: reimplement CPU online rebinding
    to handle idle workers", WORKER_REBIND is also used to command idle
    workers to rebind. If not cleared, the worker may confuse the next
    CPU_UP cycle by having REBIND spuriously set or oops / get stuck by
    prematurely calling idle_worker_rebind().

    WARNING: at /work/os/wq/kernel/workqueue.c:1323 worker_thread+0x4cd/0x5
    00()
    Hardware name: Bochs
    Modules linked in: test_wq(O-)
    Pid: 33, comm: kworker/1:1 Tainted: G O 3.6.0-rc1-work+ #3
    Call Trace:
    [] warn_slowpath_common+0x7f/0xc0
    [] warn_slowpath_null+0x1a/0x20
    [] worker_thread+0x4cd/0x500
    [] kthread+0xbe/0xd0
    [] kernel_thread_helper+0x4/0x10
    ---[ end trace e977cf20f4661968 ]---
    BUG: unable to handle kernel NULL pointer dereference at (null)
    IP: [] worker_thread+0x360/0x500
    PGD 0
    Oops: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
    Modules linked in: test_wq(O-)
    CPU 0
    Pid: 33, comm: kworker/1:1 Tainted: G W O 3.6.0-rc1-work+ #3 Bochs Bochs
    RIP: 0010:[] [] worker_thread+0x360/0x500
    RSP: 0018:ffff88001e1c9de0 EFLAGS: 00010086
    RAX: 0000000000000000 RBX: ffff88001e633e00 RCX: 0000000000004140
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000009
    RBP: ffff88001e1c9ea0 R08: 0000000000000000 R09: 0000000000000001
    R10: 0000000000000002 R11: 0000000000000000 R12: ffff88001fc8d580
    R13: ffff88001fc8d590 R14: ffff88001e633e20 R15: ffff88001e1c6900
    FS: 0000000000000000(0000) GS:ffff88001fc00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    CR2: 0000000000000000 CR3: 00000000130e8000 CR4: 00000000000006f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process kworker/1:1 (pid: 33, threadinfo ffff88001e1c8000, task ffff88001e1c6900)
    Stack:
    ffff880000000000 ffff88001e1c9e40 0000000000000001 ffff88001e1c8010
    ffff88001e519c78 ffff88001e1c9e58 ffff88001e1c6900 ffff88001e1c6900
    ffff88001e1c6900 ffff88001e1c6900 ffff88001fc8d340 ffff88001fc8d340
    Call Trace:
    [] kthread+0xbe/0xd0
    [] kernel_thread_helper+0x4/0x10
    Code: b1 00 f6 43 48 02 0f 85 91 01 00 00 48 8b 43 38 48 89 df 48 8b 00 48 89 45 90 e8 ac f0 ff ff 3c 01 0f 85 60 01 00 00 48 8b 53 50 02 83 e8 01 85 c0 89 02 0f 84 3b 01 00 00 48 8b 43 38 48 8b
    RIP [] worker_thread+0x360/0x500
    RSP
    CR2: 0000000000000000

    There was no reason to keep WORKER_REBIND on failure in the first
    place - WORKER_UNBOUND is guaranteed to be set in such cases
    preventing incorrectly activating concurrency management. Always
    clear WORKER_REBIND.

    tj: Updated comment and description.

    Signed-off-by: Lai Jiangshan
    Signed-off-by: Tejun Heo

    Lai Jiangshan
     
  • Merge fixes from Andrew Morton:
    "13 patches. 12 are fixes and one is a little preparatory thing for
    Andi."

    * emailed patches from Andrew Morton : (13 commits)
    memory hotplug: fix section info double registration bug
    mm/page_alloc: fix the page address of higher page's buddy calculation
    drivers/rtc/rtc-twl.c: ensure all interrupts are disabled during probe
    compiler.h: add __visible
    pid-namespace: limit value of ns_last_pid to (0, max_pid)
    include/net/sock.h: squelch compiler warning in sk_rmem_schedule()
    slub: consider pfmemalloc_match() in get_partial_node()
    slab: fix starting index for finding another object
    slab: do ClearSlabPfmemalloc() for all pages of slab
    nbd: clear waiting_queue on shutdown
    MAINTAINERS: fix TXT maintainer list and source repo path
    mm/ia64: fix a memory block size bug
    memory hotplug: reset pgdat->kswapd to NULL if creating kernel thread fails

    Linus Torvalds
     
  • There may be a bug when registering section info. For example, on my
    Itanium platform, the pfn range of node0 includes the other nodes, so
    other nodes' section info will be double registered, and memmap's page
    count will equal to 3.

    node0: start_pfn=0x100, spanned_pfn=0x20fb00, present_pfn=0x7f8a3, => 0x000100-0x20fc00
    node1: start_pfn=0x80000, spanned_pfn=0x80000, present_pfn=0x80000, => 0x080000-0x100000
    node2: start_pfn=0x100000, spanned_pfn=0x80000, present_pfn=0x80000, => 0x100000-0x180000
    node3: start_pfn=0x180000, spanned_pfn=0x80000, present_pfn=0x80000, => 0x180000-0x200000

    free_all_bootmem_node()
    register_page_bootmem_info_node()
    register_page_bootmem_info_section()

    When hot remove memory, we can't free the memmap's page because
    page_count() is 2 after put_page_bootmem().

    sparse_remove_one_section()
    free_section_usemap()
    free_map_bootmem()
    put_page_bootmem()

    [akpm@linux-foundation.org: add code comment]
    Signed-off-by: Xishi Qiu
    Signed-off-by: Jiang Liu
    Acked-by: Mel Gorman
    Cc: "Luck, Tony"
    Cc: Yasuaki Ishimatsu
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    qiuxishi
     
  • The heuristic method for buddy has been introduced since commit
    43506fad21ca ("mm/page_alloc.c: simplify calculation of combined index
    of adjacent buddy lists"). But the page address of higher page's buddy
    was wrongly calculated, which will lead page_is_buddy to fail for ever.
    IOW, the heuristic method would be disabled with the wrong page address
    of higher page's buddy.

    Calculating the page address of higher page's buddy should be based
    higher_page with the offset between index of higher page and index of
    higher page's buddy.

    Signed-off-by: Haifeng Li
    Signed-off-by: Gavin Shan
    Reviewed-by: Michal Hocko
    Cc: KyongHo Cho
    Cc: Mel Gorman
    Cc: Minchan Kim
    Cc: Johannes Weiner
    Cc: [2.6.38+]
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Li Haifeng
     
  • On some platforms, bootloaders are known to do some interesting RTC
    programming. Without going into the obscurities as to why this may be
    the case, suffice it to say the the driver should not make any
    assumptions about the state of the RTC when the driver loads. In
    particular, the driver probe should be sure that all interrupts are
    disabled until otherwise programmed.

    This was discovered when finding bursty I2C traffic every second on
    Overo platforms. This I2C overhead was keeping the SoC from hitting
    deep power states. The cause was found to be the RTC firing every
    second on the I2C-connected TWL PMIC.

    Special thanks to Felipe Balbi for suggesting to look for a rogue driver
    as the source of the I2C traffic rather than the I2C driver itself.

    Special thanks to Steve Sakoman for helping track down the source of the
    continuous RTC interrups on the Overo boards.

    Signed-off-by: Kevin Hilman
    Cc: Felipe Balbi
    Tested-by: Steve Sakoman
    Cc: Alessandro Zummo
    Tested-by: Shubhrajyoti Datta
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Kevin Hilman
     
  • gcc 4.6+ has support for a externally_visible attribute that prevents the
    optimizer from optimizing unused symbols away. Add a __visible macro to
    use it with that compiler version or later.

    This is used (at least) by the "Link Time Optimization" patchset.

    Signed-off-by: Andi Kleen
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andi Kleen
     
  • The kernel doesn't check the pid for negative values, so if you try to
    write -2 to /proc/sys/kernel/ns_last_pid, you will get a kernel panic.

    The crash happens because the next pid is -1, and alloc_pidmap() will
    try to access to a nonexistent pidmap.

    map = &pid_ns->pidmap[pid/BITS_PER_PAGE];

    Signed-off-by: Andrew Vagin
    Acked-by: Cyrill Gorcunov
    Acked-by: Oleg Nesterov
    Cc: Eric W. Biederman
    Cc: Pavel Emelyanov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrew Vagin
     
  • This warning:

    In file included from linux/include/linux/tcp.h:227:0,
    from linux/include/linux/ipv6.h:221,
    from linux/include/net/ipv6.h:16,
    from linux/include/linux/sunrpc/clnt.h:26,
    from linux/net/sunrpc/stats.c:22:
    linux/include/net/sock.h: In function `sk_rmem_schedule':
    linux/nfs-2.6/include/net/sock.h:1339:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

    is seen with gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2) using the
    -Wextra option.

    Commit c76562b6709f ("netvm: prevent a stream-specific deadlock")
    accidentally replaced the "size" parameter of sk_rmem_schedule() with an
    unsigned int. This changes the semantics of the comparison in the
    return statement.

    In sk_wmem_schedule we have syntactically the same comparison, but
    "size" is a signed integer. In addition, __sk_mem_schedule() takes a
    signed integer for its "size" parameter, so there is an implicit type
    conversion in sk_rmem_schedule() anyway.

    Revert the "size" parameter back to a signed integer so that the
    semantics of the expressions in both sk_[rw]mem_schedule() are exactly
    the same.

    Signed-off-by: Chuck Lever
    Signed-off-by: Mel Gorman
    Cc: David Miller
    Cc: Joonsoo Kim
    Cc: David Rientjes
    Cc: Pekka Enberg
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Chuck Lever
     
  • get_partial() is currently not checking pfmemalloc_match() meaning that
    it is possible for pfmemalloc pages to leak to non-pfmemalloc users.
    This is a problem in the following situation. Assume that there is a
    request from normal allocation and there are no objects in the per-cpu
    cache and no node-partial slab.

    In this case, slab_alloc enters the slow path and new_slab_objects() is
    called which may return a PFMEMALLOC page. As the current user is not
    allowed to access PFMEMALLOC page, deactivate_slab() is called
    ([5091b74a: mm: slub: optimise the SLUB fast path to avoid pfmemalloc
    checks]) and returns an object from PFMEMALLOC page.

    Next time, when we get another request from normal allocation,
    slab_alloc() enters the slow-path and calls new_slab_objects(). In
    new_slab_objects(), we call get_partial() and get a partial slab which
    was just deactivated but is a pfmemalloc page. We extract one object
    from it and re-deactivate.

    "deactivate -> re-get in get_partial -> re-deactivate" occures repeatedly.

    As a result, access to PFMEMALLOC page is not properly restricted and it
    can cause a performance degradation due to frequent deactivation.
    deactivation frequently.

    This patch changes get_partial_node() to take pfmemalloc_match() into
    account and prevents the "deactivate -> re-get in get_partial()
    scenario. Instead, new_slab() is called.

    Signed-off-by: Joonsoo Kim
    Acked-by: David Rientjes
    Signed-off-by: Mel Gorman
    Cc: David Miller
    Cc: Chuck Lever
    Cc: Pekka Enberg
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Joonsoo Kim
     
  • In array cache, there is a object at index 0, check it.

    Signed-off-by: Joonsoo Kim
    Signed-off-by: Mel Gorman
    Cc: David Miller
    Cc: Chuck Lever
    Cc: David Rientjes
    Cc: Pekka Enberg
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Joonsoo Kim
     
  • Right now, we call ClearSlabPfmemalloc() for first page of slab when we
    clear SlabPfmemalloc flag. This is fine for most swap-over-network use
    cases as it is expected that order-0 pages are in use. Unfortunately it
    is possible that that __ac_put_obj() checks SlabPfmemalloc on a tail
    page and while this is harmless, it is sloppy. This patch ensures that
    the head page is always used.

    This problem was originally identified by Joonsoo Kim.

    [js1304@gmail.com: Original implementation and problem identification]
    Signed-off-by: Mel Gorman
    Cc: David Miller
    Cc: Chuck Lever
    Cc: Joonsoo Kim
    Cc: David Rientjes
    Cc: Pekka Enberg
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mel Gorman
     
  • Fix a serious but uncommon bug in nbd which occurs when there is heavy
    I/O going to the nbd device while, at the same time, a failure (server,
    network) or manual disconnect of the nbd connection occurs.

    There is a small window between the time that the nbd_thread is stopped
    and the socket is shutdown where requests can continue to be queued to
    nbd's internal waiting_queue. When this happens, those requests are
    never completed or freed.

    The fix is to clear the waiting_queue on shutdown of the nbd device, in
    the same way that the nbd request queue (queue_head) is already being
    cleared.

    Signed-off-by: Paul Clements
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Paul Clements
     
  • Signed-off-by: Gang Wei
    Cc: Richard L Maliszewski
    Cc: Gang Wei
    Cc: Shane Wang
    Cc: Ingo Molnar
    Cc: "H. Peter Anvin"
    Cc: Thomas Gleixner
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Gang Wei
     
  • I found following definition in include/linux/memory.h, in my IA64
    platform, SECTION_SIZE_BITS is equal to 32, and MIN_MEMORY_BLOCK_SIZE
    will be 0.

    #define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS)

    Because MIN_MEMORY_BLOCK_SIZE is int type and length of 32bits,
    so MIN_MEMORY_BLOCK_SIZE(1 << 32) will will equal to 0.
    Actually when SECTION_SIZE_BITS >= 31, MIN_MEMORY_BLOCK_SIZE will be wrong.
    This will cause wrong system memory infomation in sysfs.
    I think it should be:

    #define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS)

    And "echo offline > memory0/state" will cause following call trace:

    kernel BUG at mm/memory_hotplug.c:885!
    sh[6455]: bugcheck! 0 [1]
    Pid: 6455, CPU 0, comm: sh
    psr : 0000101008526030 ifs : 8000000000000fa4 ip : [] Not tainted (3.6.0-rc1)
    ip is at offline_pages+0x210/0xee0
    Call Trace:
    show_stack+0x80/0xa0
    show_regs+0x640/0x920
    die+0x190/0x2c0
    die_if_kernel+0x50/0x80
    ia64_bad_break+0x3d0/0x6e0
    ia64_native_leave_kernel+0x0/0x270
    offline_pages+0x210/0xee0
    alloc_pages_current+0x180/0x2a0

    Signed-off-by: Jianguo Wu
    Signed-off-by: Jiang Liu
    Cc: "Luck, Tony"
    Reviewed-by: Michal Hocko
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jianguo Wu