21 Apr, 2020

14 commits

  • invalidate_partition and bdev_unhash_inode are always paired, and
    invalidate_partition already does an icache lookup for the block device
    inode. Piggy back on that to remove the inode from the hash.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • invalidate_partition is only used in genhd.c, so mark it static. Also
    drop the return value given that is is always ignored.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • We just checked a little above that the block device for the partition
    im busy. That implies no file system is mounted, and thus the only
    thing in fsync_bdev that actually is used is sync_blockdev. Just call
    sync_blockdev directly.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • Given that the device must not be busy, most of the calls from
    invalidate_partition that are related to file system metadata are
    guranteed to not happen. Just open code the calls to sync_blockdev
    and invalidate_bdev instead.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • Use the blk_drop_partitions function instead of messing around with
    ioctls that get kernel pointers. For this blk_drop_partitions needs
    to be exported, which it normally shouldn't - make an exception for
    s390 only.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • The gendisk can be trivially deducted from the block_device.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • The function has a single caller, so just open code it.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • Move hd_ref_init out of line as there it isn't anywhere near a fast path,
    and rename the rcu ref freeing callbacks to be more descriptive.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • All callers have the hd_struct at hand, so pass it instead of performing
    another lookup.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • Split each sub-command out into a separate helper, and move those helpers
    to block/partitions/core.c instead of having a lot of partition
    manipulation logic open coded in block/ioctl.c.

    Signed-off-by: Christoph Hellwig

    Christoph Hellwig
     
  • This reverts commit 7e70aa789d4a0c89dbfbd2c8a974a4df717475ec.

    Now that we have the patches ("blk-mq: In blk_mq_dispatch_rq_list()
    "no budget" is a reason to kick") and ("blk-mq: Rerun dispatching in
    the case of budget contention") we should no longer need the fix in
    the SCSI code. Revert it, resolving conflicts with other patches that
    have touched this code.

    With this revert (and the two new patches) I can run the script that
    was in commit 7e70aa789d4a ("scsi: core: run queue if SCSI device
    queue isn't ready and queue is idle") in a loop with no failure. If I
    do this revert without the two new patches I can easily get a failure.

    Signed-off-by: Douglas Anderson
    Reviewed-by: Ming Lei
    Acked-by: Martin K. Petersen
    Signed-off-by: Jens Axboe

    Douglas Anderson
     
  • If ever a thread running blk-mq code tries to get budget and fails it
    immediately stops doing work and assumes that whenever budget is freed
    up that queues will be kicked and whatever work the thread was trying
    to do will be tried again.

    One path where budget is freed and queues are kicked in the normal
    case can be seen in scsi_finish_command(). Specifically:
    - scsi_finish_command()
    - scsi_device_unbusy()
    - # Decrement "device_busy", AKA release budget
    - scsi_io_completion()
    - scsi_end_request()
    - blk_mq_run_hw_queues()

    The above is all well and good. The problem comes up when a thread
    claims the budget but then releases it without actually dispatching
    any work. Since we didn't schedule any work we'll never run the path
    of finishing work / kicking the queues.

    This isn't often actually a problem which is why this issue has
    existed for a while and nobody noticed. Specifically we only get into
    this situation when we unexpectedly found that we weren't going to do
    any work. Code that later receives new work kicks the queues. All
    good, right?

    The problem shows up, however, if timing is just wrong and we hit a
    race. To see this race let's think about the case where we only have
    a budget of 1 (only one thread can hold budget). Now imagine that a
    thread got budget and then decided not to dispatch work. It's about
    to call put_budget() but then the thread gets context switched out for
    a long, long time. While in this state, any and all kicks of the
    queue (like the when we received new work) will be no-ops because
    nobody can get budget. Finally the thread holding budget gets to run
    again and returns. All the normal kicks will have been no-ops and we
    have an I/O stall.

    As you can see from the above, you need just the right timing to see
    the race. To start with, the only case it happens if we thought we
    had work, actually managed to get the budget, but then actually didn't
    have work. That's pretty rare to start with. Even then, there's
    usually a very small amount of time between realizing that there's no
    work and putting the budget. During this small amount of time new
    work has to come in and the queue kick has to make it all the way to
    trying to get the budget and fail. It's pretty unlikely.

    One case where this could have failed is illustrated by an example of
    threads running blk_mq_do_dispatch_sched():

    * Threads A and B both run has_work() at the same time with the same
    "hctx". Imagine has_work() is exact. There's no lock, so it's OK
    if Thread A and B both get back true.
    * Thread B gets interrupted for a long time right after it decides
    that there is work. Maybe its CPU gets an interrupt and the
    interrupt handler is slow.
    * Thread A runs, get budget, dispatches work.
    * Thread A's work finishes and budget is released.
    * Thread B finally runs again and gets budget.
    * Since Thread A already took care of the work and no new work has
    come in, Thread B will get NULL from dispatch_request(). I believe
    this is specifically why dispatch_request() is allowed to return
    NULL in the first place if has_work() must be exact.
    * Thread B will now be holding the budget and is about to call
    put_budget(), but hasn't called it yet.
    * Thread B gets interrupted for a long time (again). Dang interrupts.
    * Now Thread C (maybe with a different "hctx" but the same queue)
    comes along and runs blk_mq_do_dispatch_sched().
    * Thread C won't do anything because it can't get budget.
    * Finally Thread B will run again and put the budget without kicking
    any queues.

    Even though the example above is with blk_mq_do_dispatch_sched() I
    believe the race is possible any time someone is holding budget but
    doesn't do work.

    Unfortunately, the unlikely has become more likely if you happen to be
    using the BFQ I/O scheduler. BFQ, by design, sometimes returns "true"
    for has_work() but then NULL for dispatch_request() and stays in this
    state for a while (currently up to 9 ms). Suddenly you only need one
    race to hit, not two races in a row. With my current setup this is
    easy to reproduce in reboot tests and traces have actually shown that
    we hit a race similar to the one described above.

    Note that we only need to fix blk_mq_do_dispatch_sched() and
    blk_mq_do_dispatch_ctx() and not the other places that put budget. In
    other cases we know that we have work to do on at least one "hctx" and
    code already exists to kick that "hctx"'s queue. When that work
    finally finishes all the queues will be kicked using the normal flow.

    One last note is that (at least in the SCSI case) budget is shared by
    all "hctx"s that have the same queue. Thus we need to make sure to
    kick the whole queue, not just re-run dispatching on a single "hctx".

    Signed-off-by: Douglas Anderson
    Reviewed-by: Ming Lei
    Signed-off-by: Jens Axboe

    Douglas Anderson
     
  • We have:
    * blk_mq_run_hw_queue()
    * blk_mq_delay_run_hw_queue()
    * blk_mq_run_hw_queues()

    ...but not blk_mq_delay_run_hw_queues(), presumably because nobody
    needed it before now. Since we need it for a later patch in this
    series, add it.

    Signed-off-by: Douglas Anderson
    Reviewed-by: Ming Lei
    Signed-off-by: Jens Axboe

    Douglas Anderson
     
  • In blk_mq_dispatch_rq_list(), if blk_mq_sched_needs_restart() returns
    true and the driver returns BLK_STS_RESOURCE then we'll kick the
    queue. However, there's another case where we might need to kick it.
    If we were unable to get budget we can be in much the same state as
    when the driver returns BLK_STS_RESOURCE, so we should treat it the
    same.

    It should be noted that even if we add a whole bunch of extra kicking
    to the queue in other patches this patch is still important.
    Specifically any kicking that happened before we re-spliced leftover
    requests into 'hctx->dispatch' wouldn't have found any work, so we
    really need to make sure we kick ourselves after we've done the
    splicing.

    Signed-off-by: Douglas Anderson
    Reviewed-by: Ming Lei
    Signed-off-by: Jens Axboe

    Douglas Anderson
     

20 Apr, 2020

12 commits

  • Linus Torvalds
     
  • When remapping a mapping where a portion of a VMA is remapped
    into another portion of the VMA it can cause the VMA to become
    split. During the copy_vma operation the VMA can actually
    be remerged if it's an anonymous VMA whose pages have not yet
    been faulted. This isn't normally a problem because at the end
    of the remap the original portion is unmapped causing it to
    become split again.

    However, MREMAP_DONTUNMAP leaves that original portion in place which
    means that the VMA which was split and then remerged is not actually
    split at the end of the mremap. This patch fixes a bug where
    we don't detect that the VMAs got remerged and we end up
    putting back VM_ACCOUNT on the next mapping which is completely
    unreleated. When that next mapping is unmapped it results in
    incorrectly unaccounting for the memory which was never accounted,
    and eventually we will underflow on the memory comittment.

    There is also another issue which is similar, we're currently
    accouting for the number of pages in the new_vma but that's wrong.
    We need to account for the length of the remap operation as that's
    all that is being added. If there was a mapping already at that
    location its comittment would have been adjusted as part of
    the munmap at the start of the mremap.

    A really simple repro can be seen in:
    https://gist.github.com/bgaff/e101ce99da7d9a8c60acc641d07f312c

    Fixes: e346b3813067 ("mm/mremap: add MREMAP_DONTUNMAP to mremap()")
    Reported-by: syzbot
    Signed-off-by: Brian Geffon
    Signed-off-by: Linus Torvalds

    Brian Geffon
     
  • Pull clk fixes from Stephen Boyd:
    "Two build fixes for a couple clk drivers and a fix for the Unisoc
    serial clk where we want to keep it on for earlycon"

    * tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux:
    clk: sprd: don't gate uart console clock
    clk: mmp2: fix link error without mmp2
    clk: asm9260: fix __clk_hw_register_fixed_rate_with_accuracy typo

    Linus Torvalds
     
  • Pull x86 and objtool fixes from Thomas Gleixner:
    "A set of fixes for x86 and objtool:

    objtool:

    - Ignore the double UD2 which is emitted in BUG() when
    CONFIG_UBSAN_TRAP is enabled.

    - Support clang non-section symbols in objtool ORC dump

    - Fix switch table detection in .text.unlikely

    - Make the BP scratch register warning more robust.

    x86:

    - Increase microcode maximum patch size for AMD to cope with new CPUs
    which have a larger patch size.

    - Fix a crash in the resource control filesystem when the removal of
    the default resource group is attempted.

    - Preserve Code and Data Prioritization enabled state accross CPU
    hotplug.

    - Update split lock cpu matching to use the new X86_MATCH macros.

    - Change the split lock enumeration as Intel finaly decided that the
    IA32_CORE_CAPABILITIES bits are not architectural contrary to what
    the SDM claims. !@#%$^!

    - Add Tremont CPU models to the split lock detection cpu match.

    - Add a missing static attribute to make sparse happy"

    * tag 'x86-urgent-2020-04-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    x86/split_lock: Add Tremont family CPU models
    x86/split_lock: Bits in IA32_CORE_CAPABILITIES are not architectural
    x86/resctrl: Preserve CDP enable over CPU hotplug
    x86/resctrl: Fix invalid attempt at removing the default resource group
    x86/split_lock: Update to use X86_MATCH_INTEL_FAM6_MODEL()
    x86/umip: Make umip_insns static
    x86/microcode/AMD: Increase microcode PATCH_MAX_SIZE
    objtool: Make BP scratch register warning more robust
    objtool: Fix switch table detection in .text.unlikely
    objtool: Support Clang non-section symbols in ORC generation
    objtool: Support Clang non-section symbols in ORC dump
    objtool: Fix CONFIG_UBSAN_TRAP unreachable warnings

    Linus Torvalds
     
  • Pull time namespace fix from Thomas Gleixner:
    "An update for the proc interface of time namespaces: Use symbolic
    names instead of clockid numbers. The usability nuisance of numbers
    was noticed by Michael when polishing the man page"

    * tag 'timers-urgent-2020-04-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    proc, time/namespace: Show clock symbolic names in /proc/pid/timens_offsets

    Linus Torvalds
     
  • Pull perf tooling fixes and updates from Thomas Gleixner:

    - Fix the header line of perf stat output for '--metric-only --per-socket'

    - Fix the python build with clang

    - The usual tools UAPI header synchronization

    * tag 'perf-urgent-2020-04-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    tools headers: Synchronize linux/bits.h with the kernel sources
    tools headers: Adopt verbatim copy of compiletime_assert() from kernel sources
    tools headers: Update x86's syscall_64.tbl with the kernel sources
    tools headers UAPI: Sync drm/i915_drm.h with the kernel sources
    tools headers UAPI: Update tools's copy of drm.h headers
    tools headers kvm: Sync linux/kvm.h with the kernel sources
    tools headers UAPI: Sync linux/fscrypt.h with the kernel sources
    tools include UAPI: Sync linux/vhost.h with the kernel sources
    tools arch x86: Sync asm/cpufeatures.h with the kernel sources
    tools headers UAPI: Sync linux/mman.h with the kernel
    tools headers UAPI: Sync sched.h with the kernel
    tools headers: Update linux/vdso.h and grab a copy of vdso/const.h
    perf stat: Fix no metric header if --per-socket and --metric-only set
    perf python: Check if clang supports -fno-semantic-interposition
    tools arch x86: Sync the msr-index.h copy with the kernel sources

    Linus Torvalds
     
  • Pull irq fixes from Thomas Gleixner:
    "A set of fixes/updates for the interrupt subsystem:

    - Remove setup_irq() and remove_irq(). All users have been converted
    so remove them before new users surface.

    - A set of bugfixes for various interrupt chip drivers

    - Add a few missing static attributes to address sparse warnings"

    * tag 'irq-urgent-2020-04-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    irqchip/irq-bcm7038-l1: Make bcm7038_l1_of_init() static
    irqchip/irq-mvebu-icu: Make legacy_bindings static
    irqchip/meson-gpio: Fix HARDIRQ-safe -> HARDIRQ-unsafe lock order
    irqchip/sifive-plic: Fix maximum priority threshold value
    irqchip/ti-sci-inta: Fix processing of masked irqs
    irqchip/mbigen: Free msi_desc on device teardown
    irqchip/gic-v4.1: Update effective affinity of virtual SGIs
    irqchip/gic-v4.1: Add support for VPENDBASER's Dirty+Valid signaling
    genirq: Remove setup_irq() and remove_irq()

    Linus Torvalds
     
  • Pull scheduler fixes from Thomas Gleixner:
    "Two fixes for the scheduler:

    - Work around an uninitialized variable warning where GCC can't
    figure it out.

    - Allow 'isolcpus=' to skip unknown subparameters so that older
    kernels work with the commandline of a newer kernel. Improve the
    error output while at it"

    * tag 'sched-urgent-2020-04-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    sched/vtime: Work around an unitialized variable warning
    sched/isolation: Allow "isolcpus=" to skip unknown sub-parameters

    Linus Torvalds
     
  • Pull RCU fix from Thomas Gleixner:
    "A single bugfix for RCU to prevent taking a lock in NMI context"

    * tag 'core-urgent-2020-04-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    rcu: Don't acquire lock in NMI handler in rcu_nmi_enter_common()

    Linus Torvalds
     
  • Pull ext4 fixes from Ted Ts'o:
    "Miscellaneous bug fixes and cleanups for ext4, including a fix for
    generic/388 in data=journal mode, removing some BUG_ON's, and cleaning
    up some compiler warnings"

    * tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
    ext4: convert BUG_ON's to WARN_ON's in mballoc.c
    ext4: increase wait time needed before reuse of deleted inode numbers
    ext4: remove set but not used variable 'es' in ext4_jbd2.c
    ext4: remove set but not used variable 'es'
    ext4: do not zeroout extents beyond i_disksize
    ext4: fix return-value types in several function comments
    ext4: use non-movable memory for superblock readahead
    ext4: use matching invalidatepage in ext4_writepage

    Linus Torvalds
     
  • Pull cifs fixes from Steve French:
    "Three small smb3 fixes: two debug related (helping network tracing for
    SMB2 mounts, and the other removing an unintended debug line on
    signing failures), and one fixing a performance problem with 64K
    pages"

    * tag '5.7-rc-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6:
    smb3: remove overly noisy debug line in signing errors
    cifs: improve read performance for page size 64KB & cache=strict & vers=2.1+
    cifs: dump the session id and keys also for SMB2 sessions

    Linus Torvalds
     
  • …kernel/git/gustavoars/linux

    Pull flexible-array member conversion from Gustavo Silva:
    "The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array
    member[1][2], introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof
    operator may not be applied. As a quirk of the original
    implementation of zero-length arrays, sizeof evaluates to zero."[1]

    sizeof(flexible-array-member) triggers a warning because flexible
    array members have incomplete type[1]. There are some instances of
    code in which the sizeof operator is being incorrectly/erroneously
    applied to zero-length arrays and the result is zero. Such instances
    may be hiding some bugs. So, this work (flexible-array member
    convertions) will also help to get completely rid of those sorts of
    issues.

    Notice that all of these patches have been baking in linux-next for
    quite a while now and, 238 more of these patches have already been
    merged into 5.7-rc1.

    There are a couple hundred more of these issues waiting to be
    addressed in the whole codebase"

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    * tag 'flexible-array-member-5.7-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux: (28 commits)
    xattr.h: Replace zero-length array with flexible-array member
    uapi: linux: fiemap.h: Replace zero-length array with flexible-array member
    uapi: linux: dlm_device.h: Replace zero-length array with flexible-array member
    tpm_eventlog.h: Replace zero-length array with flexible-array member
    ti_wilink_st.h: Replace zero-length array with flexible-array member
    swap.h: Replace zero-length array with flexible-array member
    skbuff.h: Replace zero-length array with flexible-array member
    sched: topology.h: Replace zero-length array with flexible-array member
    rslib.h: Replace zero-length array with flexible-array member
    rio.h: Replace zero-length array with flexible-array member
    posix_acl.h: Replace zero-length array with flexible-array member
    platform_data: wilco-ec.h: Replace zero-length array with flexible-array member
    memcontrol.h: Replace zero-length array with flexible-array member
    list_lru.h: Replace zero-length array with flexible-array member
    lib: cpu_rmap: Replace zero-length array with flexible-array member
    irq.h: Replace zero-length array with flexible-array member
    ihex.h: Replace zero-length array with flexible-array member
    igmp.h: Replace zero-length array with flexible-array member
    genalloc.h: Replace zero-length array with flexible-array member
    ethtool.h: Replace zero-length array with flexible-array member
    ...

    Linus Torvalds
     

19 Apr, 2020

14 commits

  • Pull SCSI fixes from James Bottomley:
    "Seven fixes: three in target, one on a sg error leg, two in qla2xxx
    fixing warnings introduced in the last merge window and updating
    MAINTAINERS and one in hisi_sas fixing a problem introduced by libata"

    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
    scsi: sg: add sg_remove_request in sg_common_write
    scsi: target: tcmu: reset_ring should reset TCMU_DEV_BIT_BROKEN
    scsi: target: fix PR IN / READ FULL STATUS for FC
    scsi: target: Write NULL to *port_nexus_ptr if no ISID
    scsi: MAINTAINERS: Update qla2xxx FC-SCSI driver maintainer
    scsi: qla2xxx: Fix regression warnings
    scsi: hisi_sas: Fix build error without SATA_HOST

    Linus Torvalds
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     
  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva