14 Nov, 2018

1 commit

  • commit 95691e3eddc41da2d1cd3cca51fecdfb46bd85bc upstream.

    Currently, "disable_clkrun" yenta_socket module parameter is only
    implemented for TI CardBus bridges.
    Add also an implementation for Ricoh bridges that have the necessary
    setting documented in publicly available datasheets.

    Tested on a RL5C476II with a Sunrich C-160 CardBus NIC that doesn't work
    correctly unless the CLKRUN protocol is disabled.

    Let's also make it clear in its description that the "disable_clkrun"
    module parameter only works on these two previously mentioned brands of
    CardBus bridges.

    Signed-off-by: Maciej S. Szmigiero
    Cc: stable@vger.kernel.org
    Signed-off-by: Dominik Brodowski
    Signed-off-by: Greg Kroah-Hartman

    Maciej S. Szmigiero
     

19 Aug, 2018

1 commit

  • This function was created as a deprecated fallback case back in 2010 by
    commit eb14120f743d ("pcmcia: re-work pcmcia_request_irq()") for legacy
    cases.

    Actual in-kernel users haven't been around for a long while. The last
    in-kernel user was apparently removed four years ago by commit
    5f5316fcd08e ("am2150: Update nmclan_cs.c to use update PCMCIA API").

    Just remove it entirely.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

13 Jun, 2018

2 commits

  • The kzalloc() function has a 2-factor argument form, kcalloc(). This
    patch replaces cases of:

    kzalloc(a * b, gfp)

    with:
    kcalloc(a * b, gfp)

    as well as handling cases of:

    kzalloc(a * b * c, gfp)

    with:

    kzalloc(array3_size(a, b, c), gfp)

    as it's slightly less ugly than:

    kzalloc_array(array_size(a, b), c, gfp)

    This does, however, attempt to ignore constant size factors like:

    kzalloc(4 * 1024, gfp)

    though any constants defined via macros get caught up in the conversion.

    Any factors with a sizeof() of "unsigned char", "char", and "u8" were
    dropped, since they're redundant.

    The Coccinelle script used for this was:

    // Fix redundant parens around sizeof().
    @@
    type TYPE;
    expression THING, E;
    @@

    (
    kzalloc(
    - (sizeof(TYPE)) * E
    + sizeof(TYPE) * E
    , ...)
    |
    kzalloc(
    - (sizeof(THING)) * E
    + sizeof(THING) * E
    , ...)
    )

    // Drop single-byte sizes and redundant parens.
    @@
    expression COUNT;
    typedef u8;
    typedef __u8;
    @@

    (
    kzalloc(
    - sizeof(u8) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(__u8) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(char) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(unsigned char) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(u8) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(__u8) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(char) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(unsigned char) * COUNT
    + COUNT
    , ...)
    )

    // 2-factor product with sizeof(type/expression) and identifier or constant.
    @@
    type TYPE;
    expression THING;
    identifier COUNT_ID;
    constant COUNT_CONST;
    @@

    (
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (COUNT_ID)
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * COUNT_ID
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (COUNT_CONST)
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * COUNT_CONST
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (COUNT_ID)
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * COUNT_ID
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (COUNT_CONST)
    + COUNT_CONST, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * COUNT_CONST
    + COUNT_CONST, sizeof(THING)
    , ...)
    )

    // 2-factor product, only identifiers.
    @@
    identifier SIZE, COUNT;
    @@

    - kzalloc
    + kcalloc
    (
    - SIZE * COUNT
    + COUNT, SIZE
    , ...)

    // 3-factor product with 1 sizeof(type) or sizeof(expression), with
    // redundant parens removed.
    @@
    expression THING;
    identifier STRIDE, COUNT;
    type TYPE;
    @@

    (
    kzalloc(
    - sizeof(TYPE) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    )

    // 3-factor product with 2 sizeof(variable), with redundant parens removed.
    @@
    expression THING1, THING2;
    identifier COUNT;
    type TYPE1, TYPE2;
    @@

    (
    kzalloc(
    - sizeof(TYPE1) * sizeof(TYPE2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kzalloc(
    - sizeof(THING1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(THING1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    )

    // 3-factor product, only identifiers, with redundant parens removed.
    @@
    identifier STRIDE, SIZE, COUNT;
    @@

    (
    kzalloc(
    - (COUNT) * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    )

    // Any remaining multi-factor products, first at least 3-factor products,
    // when they're not all constants...
    @@
    expression E1, E2, E3;
    constant C1, C2, C3;
    @@

    (
    kzalloc(C1 * C2 * C3, ...)
    |
    kzalloc(
    - (E1) * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - (E1) * (E2) * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - (E1) * (E2) * (E3)
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - E1 * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    )

    // And then all remaining 2 factors products when they're not all constants,
    // keeping sizeof() as the second factor argument.
    @@
    expression THING, E1, E2;
    type TYPE;
    constant C1, C2, C3;
    @@

    (
    kzalloc(sizeof(THING) * C2, ...)
    |
    kzalloc(sizeof(TYPE) * C2, ...)
    |
    kzalloc(C1 * C2 * C3, ...)
    |
    kzalloc(C1 * C2, ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (E2)
    + E2, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * E2
    + E2, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (E2)
    + E2, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * E2
    + E2, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - (E1) * E2
    + E1, E2
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - (E1) * (E2)
    + E1, E2
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - E1 * E2
    + E1, E2
    , ...)
    )

    Signed-off-by: Kees Cook

    Kees Cook
     
  • The kmalloc() function has a 2-factor argument form, kmalloc_array(). This
    patch replaces cases of:

    kmalloc(a * b, gfp)

    with:
    kmalloc_array(a * b, gfp)

    as well as handling cases of:

    kmalloc(a * b * c, gfp)

    with:

    kmalloc(array3_size(a, b, c), gfp)

    as it's slightly less ugly than:

    kmalloc_array(array_size(a, b), c, gfp)

    This does, however, attempt to ignore constant size factors like:

    kmalloc(4 * 1024, gfp)

    though any constants defined via macros get caught up in the conversion.

    Any factors with a sizeof() of "unsigned char", "char", and "u8" were
    dropped, since they're redundant.

    The tools/ directory was manually excluded, since it has its own
    implementation of kmalloc().

    The Coccinelle script used for this was:

    // Fix redundant parens around sizeof().
    @@
    type TYPE;
    expression THING, E;
    @@

    (
    kmalloc(
    - (sizeof(TYPE)) * E
    + sizeof(TYPE) * E
    , ...)
    |
    kmalloc(
    - (sizeof(THING)) * E
    + sizeof(THING) * E
    , ...)
    )

    // Drop single-byte sizes and redundant parens.
    @@
    expression COUNT;
    typedef u8;
    typedef __u8;
    @@

    (
    kmalloc(
    - sizeof(u8) * (COUNT)
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(__u8) * (COUNT)
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(char) * (COUNT)
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(unsigned char) * (COUNT)
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(u8) * COUNT
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(__u8) * COUNT
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(char) * COUNT
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(unsigned char) * COUNT
    + COUNT
    , ...)
    )

    // 2-factor product with sizeof(type/expression) and identifier or constant.
    @@
    type TYPE;
    expression THING;
    identifier COUNT_ID;
    constant COUNT_CONST;
    @@

    (
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * (COUNT_ID)
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * COUNT_ID
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * (COUNT_CONST)
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * COUNT_CONST
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * (COUNT_ID)
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * COUNT_ID
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * (COUNT_CONST)
    + COUNT_CONST, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * COUNT_CONST
    + COUNT_CONST, sizeof(THING)
    , ...)
    )

    // 2-factor product, only identifiers.
    @@
    identifier SIZE, COUNT;
    @@

    - kmalloc
    + kmalloc_array
    (
    - SIZE * COUNT
    + COUNT, SIZE
    , ...)

    // 3-factor product with 1 sizeof(type) or sizeof(expression), with
    // redundant parens removed.
    @@
    expression THING;
    identifier STRIDE, COUNT;
    type TYPE;
    @@

    (
    kmalloc(
    - sizeof(TYPE) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kmalloc(
    - sizeof(THING) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kmalloc(
    - sizeof(THING) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kmalloc(
    - sizeof(THING) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kmalloc(
    - sizeof(THING) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    )

    // 3-factor product with 2 sizeof(variable), with redundant parens removed.
    @@
    expression THING1, THING2;
    identifier COUNT;
    type TYPE1, TYPE2;
    @@

    (
    kmalloc(
    - sizeof(TYPE1) * sizeof(TYPE2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kmalloc(
    - sizeof(THING1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kmalloc(
    - sizeof(THING1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    )

    // 3-factor product, only identifiers, with redundant parens removed.
    @@
    identifier STRIDE, SIZE, COUNT;
    @@

    (
    kmalloc(
    - (COUNT) * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - COUNT * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - COUNT * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - (COUNT) * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - COUNT * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - (COUNT) * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - (COUNT) * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - COUNT * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    )

    // Any remaining multi-factor products, first at least 3-factor products,
    // when they're not all constants...
    @@
    expression E1, E2, E3;
    constant C1, C2, C3;
    @@

    (
    kmalloc(C1 * C2 * C3, ...)
    |
    kmalloc(
    - (E1) * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kmalloc(
    - (E1) * (E2) * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kmalloc(
    - (E1) * (E2) * (E3)
    + array3_size(E1, E2, E3)
    , ...)
    |
    kmalloc(
    - E1 * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    )

    // And then all remaining 2 factors products when they're not all constants,
    // keeping sizeof() as the second factor argument.
    @@
    expression THING, E1, E2;
    type TYPE;
    constant C1, C2, C3;
    @@

    (
    kmalloc(sizeof(THING) * C2, ...)
    |
    kmalloc(sizeof(TYPE) * C2, ...)
    |
    kmalloc(C1 * C2 * C3, ...)
    |
    kmalloc(C1 * C2, ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * (E2)
    + E2, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * E2
    + E2, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * (E2)
    + E2, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * E2
    + E2, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - (E1) * E2
    + E1, E2
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - (E1) * (E2)
    + E1, E2
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - E1 * E2
    + E1, E2
    , ...)
    )

    Signed-off-by: Kees Cook

    Kees Cook
     

10 Apr, 2018

1 commit

  • Pull ARM SA1100 updates from Russell King:
    "We have support for arbitary MMIO registers providing platform GPIOs,
    which allows us to abstract some of the SA11x0 CF support.

    This set of updates makes that change"

    * 'for-linus-sa1100' of git://git.armlinux.org.uk/~rmk/linux-arm:
    ARM: sa1100/simpad: switch simpad CF to use gpiod APIs
    ARM: sa1100/shannon: convert to generic CF sockets
    ARM: sa1100/nanoengine: convert to generic CF sockets
    ARM: sa1100/h3xxx: switch h3xxx PCMCIA to use gpiod APIs
    ARM: sa1100/cerf: convert to generic CF sockets
    ARM: sa1100/assabet: convert to generic CF sockets
    ARM: sa1100: provide infrastructure to support generic CF sockets
    pcmcia: sa1100: provide generic CF support

    Linus Torvalds
     

06 Apr, 2018

3 commits


04 Apr, 2018

1 commit

  • Pull power management updates from Rafael Wysocki:
    "These update the cpuidle poll state definition to reduce excessive
    energy usage related to it, add new CPU ID to the RAPL power capping
    driver, update the ACPI system suspend code to handle some special
    cases better, extend the PM core's device links code slightly, add new
    sysfs attribute for better suspend-to-idle diagnostics and easier
    hibernation handling, update power management tools and clean up
    cpufreq quite a bit.

    Specifics:

    - Modify the cpuidle poll state implementation to prevent CPUs from
    staying in the loop in there for excessive times (Rafael Wysocki).

    - Add Intel Cannon Lake chips support to the RAPL power capping
    driver (Joe Konno).

    - Add reference counting to the device links handling code in the PM
    core (Lukas Wunner).

    - Avoid reconfiguring GPEs on suspend-to-idle in the ACPI system
    suspend code (Rafael Wysocki).

    - Allow devices to be put into deeper low-power states via ACPI if
    both _SxD and _SxW are missing (Daniel Drake).

    - Reorganize the core ACPI suspend-to-idle wakeup code to avoid a
    keyboard wakeup issue on Asus UX331UA (Chris Chiu).

    - Prevent the PCMCIA library code from aborting suspend-to-idle due
    to noirq suspend failures resulting from incorrect assumptions
    (Rafael Wysocki).

    - Add coupled cpuidle supprt to the Exynos3250 platform (Marek
    Szyprowski).

    - Add new sysfs file to make it easier to specify the image storage
    location during hibernation (Mario Limonciello).

    - Add sysfs files for collecting suspend-to-idle usage and time
    statistics for CPU idle states (Rafael Wysocki).

    - Update the pm-graph utilities (Todd Brandt).

    - Reduce the kernel log noise related to reporting Low-power Idle
    constraings by the ACPI system suspend code (Rafael Wysocki).

    - Make it easier to distinguish dedicated wakeup IRQs in the
    /proc/interrupts output (Tony Lindgren).

    - Add the frequency table validation in cpufreq to the core and drop
    it from a number of cpufreq drivers (Viresh Kumar).

    - Drop "cooling-{min|max}-level" for CPU nodes from a couple of DT
    bindings (Viresh Kumar).

    - Clean up the CPU online error code path in the cpufreq core (Viresh
    Kumar).

    - Fix assorted issues in the SCPI, CPPC, mediatek and tegra186
    cpufreq drivers (Arnd Bergmann, Chunyu Hu, George Cherian, Viresh
    Kumar).

    - Drop memory allocation error messages from a few places in cpufreq
    and cpuildle drivers (Markus Elfring)"

    * tag 'pm-4.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (56 commits)
    ACPI / PM: Fix keyboard wakeup from suspend-to-idle on ASUS UX331UA
    cpufreq: CPPC: Use transition_delay_us depending transition_latency
    PM / hibernate: Change message when writing to /sys/power/resume
    PM / hibernate: Make passing hibernate offsets more friendly
    cpuidle: poll_state: Avoid invoking local_clock() too often
    PM: cpuidle/suspend: Add s2idle usage and time state attributes
    cpuidle: Enable coupled cpuidle support on Exynos3250 platform
    cpuidle: poll_state: Add time limit to poll_idle()
    cpufreq: tegra186: Don't validate the frequency table twice
    cpufreq: speedstep: Don't validate the frequency table twice
    cpufreq: sparc: Don't validate the frequency table twice
    cpufreq: sh: Don't validate the frequency table twice
    cpufreq: sfi: Don't validate the frequency table twice
    cpufreq: scpi: Don't validate the frequency table twice
    cpufreq: sc520: Don't validate the frequency table twice
    cpufreq: s3c24xx: Don't validate the frequency table twice
    cpufreq: qoirq: Don't validate the frequency table twice
    cpufreq: pxa: Don't validate the frequency table twice
    cpufreq: ppc_cbe: Don't validate the frequency table twice
    cpufreq: powernow: Don't validate the frequency table twice
    ...

    Linus Torvalds
     

26 Mar, 2018

2 commits


24 Mar, 2018

4 commits


23 Feb, 2018

1 commit

  • There is a problem with PCMCIA system resume callbacks with respect
    to suspend-to-idle in which the ->suspend_noirq() callback may be
    invoked after the ->resume_noirq() one without resuming the system
    entirely in some cases. This doesn't work for PCMCIA because of
    the lack of symmetry between its system suspend and system resume
    "noirq" callbacks.

    The system resume handling in PCMCIA is split between
    socket_early_resume() and socket_late_resume() which are called in
    different phases of system resume and both need to run for
    socket_suspend() (invoked by the system suspend "noirq" callback)
    to work. Specifically, socket_suspend() returns an error when
    called after socket_early_resume() without socket_late_resume(),
    so if the suspend-to-idle core detects a spurious wakeup event and
    attempts to put the system back to sleep, that is aborted by the
    error coming from socket_suspend().

    Avoid that by using a new socket state flag, SOCKET_IN_RESUME,
    to indicate that socket_early_resume() has already run for the
    socket in which case socket_suspend() will do minimum handling
    and return 0.

    This change has been tested on my venerable Toshiba Portege R500
    (which is where the problem has been discovered in the first place),
    but admittedly I have no PCMCIA cards to test along with the socket
    itself.

    Fixes: 33e4f80ee69b (ACPI / PM: Ignore spurious SCI wakeups from suspend-to-idle)
    Signed-off-by: Rafael J. Wysocki
    [linux@dominikbrodowski.net: follow same codepaths for both suspend variants; call ->suspend()]
    Signed-off-by: Dominik Brodowski

    Rafael J. Wysocki
     

09 Feb, 2018

1 commit

  • Pull pcmcia updates from Dominik Brodowski:
    "The linux-pcmcia mailing list was shut down, so offer an alternative
    path for patches in MAINTAINERS.

    Also, throw in two odd fixes for the pcmcia subsystem"

    * 'pcmcia' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia:
    pcmcia: soc_common: Handle return value of clk_prepare_enable
    pcmcia: use proper printk format for resource
    pcmcia: remove mailing list, update MAINTAINERS

    Linus Torvalds
     

25 Jan, 2018

2 commits


30 Nov, 2017

1 commit

  • Fix ptr_ret.cocci warnings:
    drivers/pcmcia/at91_cf.c:239:1-3: WARNING: PTR_ERR_OR_ZERO can be used

    Use PTR_ERR_OR_ZERO rather than if(IS_ERR(...)) + PTR_ERR

    Generated by: scripts/coccinelle/api/ptr_ret.cocci

    Signed-off-by: Vasyl Gomonovych
    Acked-by: Nicolas Ferre
    Signed-off-by: Alexandre Belloni

    Vasyl Gomonovych
     

18 Nov, 2017

1 commit

  • pcmv_setup() is only used when the badge4 driver is built-in, but not
    when it is a loadable module:

    drivers/pcmcia/sa1111_badge4.c:153:122: error: 'pcmv_setup' defined but not used [-Werror=unused-function]

    This adds an #ifdef to avoid the definition of the unused function in
    the modular case.

    Link: http://lkml.kernel.org/r/20170911201133.3421636-1-arnd@arndb.de
    Signed-off-by: Arnd Bergmann
    Cc: Russell King
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Arnd Bergmann
     

17 Nov, 2017

2 commits

  • Pull ARM updates from Russell King:

    - add support for ELF fdpic binaries on both MMU and noMMU platforms

    - linker script cleanups

    - support for compressed .data section for XIP images

    - discard memblock arrays when possible

    - various cleanups

    - atomic DMA pool updates

    - better diagnostics of missing/corrupt device tree

    - export information to allow userspace kexec tool to place images more
    inteligently, so that the device tree isn't overwritten by the
    booting kernel

    - make early_printk more efficient on semihosted systems

    - noMMU cleanups

    - SA1111 PCMCIA update in preparation for further cleanups

    * 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm: (38 commits)
    ARM: 8719/1: NOMMU: work around maybe-uninitialized warning
    ARM: 8717/2: debug printch/printascii: translate '\n' to "\r\n" not "\n\r"
    ARM: 8713/1: NOMMU: Support MPU in XIP configuration
    ARM: 8712/1: NOMMU: Use more MPU regions to cover memory
    ARM: 8711/1: V7M: Add support for MPU to M-class
    ARM: 8710/1: Kconfig: Kill CONFIG_VECTORS_BASE
    ARM: 8709/1: NOMMU: Disallow MPU for XIP
    ARM: 8708/1: NOMMU: Rework MPU to be mostly done in C
    ARM: 8707/1: NOMMU: Update MPU accessors to use cp15 helpers
    ARM: 8706/1: NOMMU: Move out MPU setup in separate module
    ARM: 8702/1: head-common.S: Clear lr before jumping to start_kernel()
    ARM: 8705/1: early_printk: use printascii() rather than printch()
    ARM: 8703/1: debug.S: move hexbuf to a writable section
    ARM: add additional table to compressed kernel
    ARM: decompressor: fix BSS size calculation
    pcmcia: sa1111: remove special sa1111 mmio accessors
    pcmcia: sa1111: use sa1111_get_irq() to obtain IRQ resources
    ARM: better diagnostics with missing/corrupt dtb
    ARM: 8699/1: dma-mapping: Remove init_dma_coherent_pool_size()
    ARM: 8698/1: dma-mapping: Mark atomic_pool as __ro_after_init
    ..

    Linus Torvalds
     
  • …/git/gregkh/char-misc

    Pull char/misc updates from Greg KH:
    "Here is the big set of char/misc and other driver subsystem patches
    for 4.15-rc1.

    There are small changes all over here, hyperv driver updates, pcmcia
    driver updates, w1 driver updats, vme driver updates, nvmem driver
    updates, and lots of other little one-off driver updates as well. The
    shortlog has the full details.

    All of these have been in linux-next for quite a while with no
    reported issues"

    * tag 'char-misc-4.15-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (90 commits)
    VME: Return -EBUSY when DMA list in use
    w1: keep balance of mutex locks and refcnts
    MAINTAINERS: Update VME subsystem tree.
    nvmem: sunxi-sid: add support for A64/H5's SID controller
    nvmem: imx-ocotp: Update module description
    nvmem: imx-ocotp: Enable i.MX7D OTP write support
    nvmem: imx-ocotp: Add i.MX7D timing write clock setup support
    nvmem: imx-ocotp: Move i.MX6 write clock setup to dedicated function
    nvmem: imx-ocotp: Add support for banked OTP addressing
    nvmem: imx-ocotp: Pass parameters via a struct
    nvmem: imx-ocotp: Restrict OTP write to IMX6 processors
    nvmem: uniphier: add UniPhier eFuse driver
    dt-bindings: nvmem: add description for UniPhier eFuse
    nvmem: set nvmem->owner to nvmem->dev->driver->owner if unset
    nvmem: qfprom: fix different address space warnings of sparse
    nvmem: mtk-efuse: fix different address space warnings of sparse
    nvmem: mtk-efuse: use stack for nvmem_config instead of malloc'ing it
    nvmem: imx-iim: use stack for nvmem_config instead of malloc'ing it
    thunderbolt: tb: fix use after free in tb_activate_pcie_devices
    MAINTAINERS: Add git tree for Thunderbolt development
    ...

    Linus Torvalds
     

16 Nov, 2017

2 commits

  • Pull PCI updates from Bjorn Helgaas:

    - detach driver before tearing down procfs/sysfs (Alex Williamson)

    - disable PCIe services during shutdown (Sinan Kaya)

    - fix ASPM oops on systems with no Root Ports (Ard Biesheuvel)

    - fix ASPM LTR_L1.2_THRESHOLD programming (Bjorn Helgaas)

    - fix ASPM Common_Mode_Restore_Time computation (Bjorn Helgaas)

    - fix portdrv MSI/MSI-X vector allocation (Dongdong Liu, Bjorn
    Helgaas)

    - report non-fatal AER errors only to the affected endpoint (Gabriele
    Paoloni)

    - distribute bus numbers, MMIO, and I/O space among hotplug bridges to
    allow more devices to be hot-added (Mika Westerberg)

    - fix pciehp races during initialization and surprise link down (Mika
    Westerberg)

    - handle surprise-removed devices in PME handling (Qiang)

    - support resizable BARs for large graphics devices (Christian König)

    - expose SR-IOV offset, stride, and VF device ID via sysfs (Filippo
    Sironi)

    - create SR-IOV virtfn/physfn sysfs links before attaching driver
    (Stuart Hayes)

    - fix SR-IOV "ARI Capable Hierarchy" restore issue (Tony Nguyen)

    - enforce Kconfig IOV/REALLOC dependency (Sascha El-Sharkawy)

    - avoid slot reset if bridge itself is broken (Jan Glauber)

    - clean up pci_reset_function() path (Jan H. Schönherr)

    - make pci_map_rom() fail if the option ROM is invalid (Changbin Du)

    - convert timers to timer_setup() (Kees Cook)

    - move PCI_QUIRKS to PCI bus Kconfig menu (Randy Dunlap)

    - constify pci_dev_type and intel_mid_pci_ops (Bhumika Goyal)

    - remove unnecessary pci_dev, pci_bus, resource, pcibios_set_master()
    declarations (Bjorn Helgaas)

    - fix endpoint framework overflows and BUG()s (Dan Carpenter)

    - fix endpoint framework issues (Kishon Vijay Abraham I)

    - avoid broken Cavium CN8xxx bus reset behavior (David Daney)

    - extend Cavium ACS capability quirks (Vadim Lomovtsev)

    - support Synopsys DesignWare RC in ECAM mode (Ard Biesheuvel)

    - turn off dra7xx clocks cleanly on shutdown (Keerthy)

    - fix Faraday probe error path (Wei Yongjun)

    - support HiSilicon STB SoC PCIe host controller (Jianguo Sun)

    - fix Hyper-V interrupt affinity issue (Dexuan Cui)

    - remove useless ACPI warning for Hyper-V pass-through devices (Vitaly
    Kuznetsov)

    - support multiple MSI on iProc (Sandor Bodo-Merle)

    - support Layerscape LS1012a and LS1046a PCIe host controllers (Hou
    Zhiqiang)

    - fix Layerscape default error response (Minghuan Lian)

    - support MSI on Tango host controller (Marc Gonzalez)

    - support Tegra186 PCIe host controller (Manikanta Maddireddy)

    - use generic accessors on Tegra when possible (Thierry Reding)

    - support V3 Semiconductor PCI host controller (Linus Walleij)

    * tag 'pci-v4.15-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (85 commits)
    PCI/ASPM: Add L1 Substates definitions
    PCI/ASPM: Reformat ASPM register definitions
    PCI/ASPM: Use correct capability pointer to program LTR_L1.2_THRESHOLD
    PCI/ASPM: Account for downstream device's Port Common_Mode_Restore_Time
    PCI: xgene: Rename xgene_pcie_probe_bridge() to xgene_pcie_probe()
    PCI: xilinx: Rename xilinx_pcie_link_is_up() to xilinx_pcie_link_up()
    PCI: altera: Rename altera_pcie_link_is_up() to altera_pcie_link_up()
    PCI: Fix kernel-doc build warning
    PCI: Fail pci_map_rom() if the option ROM is invalid
    PCI: Move pci_map_rom() error path
    PCI: Move PCI_QUIRKS to the PCI bus menu
    alpha/PCI: Make pdev_save_srm_config() static
    PCI: Remove unused declarations
    PCI: Remove redundant pci_dev, pci_bus, resource declarations
    PCI: Remove redundant pcibios_set_master() declarations
    PCI/PME: Handle invalid data when reading Root Status
    PCI: hv: Use effective affinity mask
    PCI: pciehp: Do not clear Presence Detect Changed during initialization
    PCI: pciehp: Fix race condition handling surprise link down
    PCI: Distribute available resources to hotplug-capable bridges
    ...

    Linus Torvalds
     
  • Pull networking updates from David Miller:
    "Highlights:

    1) Maintain the TCP retransmit queue using an rbtree, with 1GB
    windows at 100Gb this really has become necessary. From Eric
    Dumazet.

    2) Multi-program support for cgroup+bpf, from Alexei Starovoitov.

    3) Perform broadcast flooding in hardware in mv88e6xxx, from Andrew
    Lunn.

    4) Add meter action support to openvswitch, from Andy Zhou.

    5) Add a data meta pointer for BPF accessible packets, from Daniel
    Borkmann.

    6) Namespace-ify almost all TCP sysctl knobs, from Eric Dumazet.

    7) Turn on Broadcom Tags in b53 driver, from Florian Fainelli.

    8) More work to move the RTNL mutex down, from Florian Westphal.

    9) Add 'bpftool' utility, to help with bpf program introspection.
    From Jakub Kicinski.

    10) Add new 'cpumap' type for XDP_REDIRECT action, from Jesper
    Dangaard Brouer.

    11) Support 'blocks' of transformations in the packet scheduler which
    can span multiple network devices, from Jiri Pirko.

    12) TC flower offload support in cxgb4, from Kumar Sanghvi.

    13) Priority based stream scheduler for SCTP, from Marcelo Ricardo
    Leitner.

    14) Thunderbolt networking driver, from Amir Levy and Mika Westerberg.

    15) Add RED qdisc offloadability, and use it in mlxsw driver. From
    Nogah Frankel.

    16) eBPF based device controller for cgroup v2, from Roman Gushchin.

    17) Add some fundamental tracepoints for TCP, from Song Liu.

    18) Remove garbage collection from ipv6 route layer, this is a
    significant accomplishment. From Wei Wang.

    19) Add multicast route offload support to mlxsw, from Yotam Gigi"

    * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (2177 commits)
    tcp: highest_sack fix
    geneve: fix fill_info when link down
    bpf: fix lockdep splat
    net: cdc_ncm: GetNtbFormat endian fix
    openvswitch: meter: fix NULL pointer dereference in ovs_meter_cmd_reply_start
    netem: remove unnecessary 64 bit modulus
    netem: use 64 bit divide by rate
    tcp: Namespace-ify sysctl_tcp_default_congestion_control
    net: Protect iterations over net::fib_notifier_ops in fib_seq_sum()
    ipv6: set all.accept_dad to 0 by default
    uapi: fix linux/tls.h userspace compilation error
    usbnet: ipheth: prevent TX queue timeouts when device not ready
    vhost_net: conditionally enable tx polling
    uapi: fix linux/rxrpc.h userspace compilation errors
    net: stmmac: fix LPI transitioning for dwmac4
    atm: horizon: Fix irq release error
    net-sysfs: trigger netlink notification on ifalias change via sysfs
    openvswitch: Using kfree_rcu() to simplify the code
    openvswitch: Make local function ovs_nsh_key_attr_size() static
    openvswitch: Fix return value check in ovs_meter_cmd_features()
    ...

    Linus Torvalds
     

14 Nov, 2017

1 commit

  • Pull timer updates from Thomas Gleixner:
    "Yet another big pile of changes:

    - More year 2038 work from Arnd slowly reaching the point where we
    need to think about the syscalls themself.

    - A new timer function which allows to conditionally (re)arm a timer
    only when it's either not running or the new expiry time is sooner
    than the armed expiry time. This allows to use a single timer for
    multiple timeout requirements w/o caring about the first expiry
    time at the call site.

    - A new NMI safe accessor to clock real time for the printk timestamp
    work. Can be used by tracing, perf as well if required.

    - A large number of timer setup conversions from Kees which got
    collected here because either maintainers requested so or they
    simply got ignored. As Kees pointed out already there are a few
    trivial merge conflicts and some redundant commits which was
    unavoidable due to the size of this conversion effort.

    - Avoid a redundant iteration in the timer wheel softirq processing.

    - Provide a mechanism to treat RTC implementations depending on their
    hardware properties, i.e. don't inflict the write at the 0.5
    seconds boundary which originates from the PC CMOS RTC to all RTCs.
    No functional change as drivers need to be updated separately.

    - The usual small updates to core code clocksource drivers. Nothing
    really exciting"

    * 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (111 commits)
    timers: Add a function to start/reduce a timer
    pstore: Use ktime_get_real_fast_ns() instead of __getnstimeofday()
    timer: Prepare to change all DEFINE_TIMER() callbacks
    netfilter: ipvs: Convert timers to use timer_setup()
    scsi: qla2xxx: Convert timers to use timer_setup()
    block/aoe: discover_timer: Convert timers to use timer_setup()
    ide: Convert timers to use timer_setup()
    drbd: Convert timers to use timer_setup()
    mailbox: Convert timers to use timer_setup()
    crypto: Convert timers to use timer_setup()
    drivers/pcmcia: omap1: Fix error in automated timer conversion
    ARM: footbridge: Fix typo in timer conversion
    drivers/sgi-xp: Convert timers to use timer_setup()
    drivers/pcmcia: Convert timers to use timer_setup()
    drivers/memstick: Convert timers to use timer_setup()
    drivers/macintosh: Convert timers to use timer_setup()
    hwrng/xgene-rng: Convert timers to use timer_setup()
    auxdisplay: Convert timers to use timer_setup()
    sparc/led: Convert timers to use timer_setup()
    mips: ip22/32: Convert timers to use timer_setup()
    ...

    Linus Torvalds
     

07 Nov, 2017

2 commits

  • The following pattern is often used:

    list_for_each_entry(dev, &bus->devices, bus_list) {
    if (pci_is_bridge(dev)) {
    ...
    }
    }

    Add a for_each_pci_bridge() helper to make that code easier to write and
    read by reducing indentation level. It also saves one or few lines of code
    in each occurrence.

    Convert PCI core parts here at the same time.

    Signed-off-by: Andy Shevchenko
    [bhelgaas: fold in http://lkml.kernel.org/r/20171013165352.25550-1-andriy.shevchenko@linux.intel.com]
    Signed-off-by: Bjorn Helgaas

    Andy Shevchenko
     
  • One part of automated timer conversion tools did not take into account
    void * variables when searching out prior direct timer callback usage,
    which resulted in an attempt to dereference the timer field without a
    proper type.

    Reported-by: kbuild test robot
    Signed-off-by: Kees Cook

    Kees Cook
     

05 Nov, 2017

1 commit


04 Nov, 2017

2 commits


03 Nov, 2017

1 commit

  • In preparation for unconditionally passing the struct timer_list pointer to
    all timer callbacks, switch to using the new timer_setup() and from_timer()
    to pass the timer pointer explicitly.

    Cc: Florian Fainelli
    Cc: bcm-kernel-feedback-list@broadcom.com
    Cc: David Howells
    Cc: Arnd Bergmann
    Cc: linux-pcmcia@lists.infradead.org
    Cc: linux-arm-kernel@lists.infradead.org
    Signed-off-by: Kees Cook
    Acked-by: Russell King # for soc_common.c

    Kees Cook
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

20 Oct, 2017

1 commit

  • In preparation for unconditionally passing the struct timer_list pointer to
    all timer callbacks, switch to using the new timer_setup() and from_timer()
    to pass the timer pointer explicitly.

    Cc: Andrew Morton
    Cc: Sudip Mukherjee
    Cc: linux-pcmcia@lists.infradead.org
    Signed-off-by: Kees Cook
    Signed-off-by: Greg Kroah-Hartman

    Kees Cook
     

18 Oct, 2017

1 commit

  • In preparation for unconditionally passing the struct timer_list pointer to
    all timer callbacks, switch to using the new timer_setup() and from_timer()
    to pass the timer pointer explicitly.

    Cc: Michael Ellerman
    Cc: linux-pcmcia@lists.infradead.org
    Signed-off-by: Kees Cook
    Signed-off-by: David S. Miller

    Kees Cook
     

04 Oct, 2017

1 commit

  • Make this const as it is only passed to the const arguments of the
    functions sysfs_remove_bin_file and sysfs_create_bin_file. Make the
    declaration const too.

    Structure found using Coccinelle and changes done by hand.

    Signed-off-by: Bhumika Goyal
    Signed-off-by: Greg Kroah-Hartman

    Bhumika Goyal
     

03 Oct, 2017

2 commits


29 Aug, 2017

1 commit

  • This introduces threaded carddetect irqs for the db1200/db1300 boards.
    Main benefit is that the broken insertion/ejection interrupt pairs
    can now be better supported and debounced in software.

    Signed-off-by: Manuel Lauss
    Cc: James Hogan
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/15287/
    Signed-off-by: Ralf Baechle

    Manuel Lauss
     

12 Jun, 2017

1 commit