13 Jan, 2012

1 commit


07 Nov, 2011

1 commit

  • * 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux: (230 commits)
    Revert "tracing: Include module.h in define_trace.h"
    irq: don't put module.h into irq.h for tracking irqgen modules.
    bluetooth: macroize two small inlines to avoid module.h
    ip_vs.h: fix implicit use of module_get/module_put from module.h
    nf_conntrack.h: fix up fallout from implicit moduleparam.h presence
    include: replace linux/module.h with "struct module" wherever possible
    include: convert various register fcns to macros to avoid include chaining
    crypto.h: remove unused crypto_tfm_alg_modname() inline
    uwb.h: fix implicit use of asm/page.h for PAGE_SIZE
    pm_runtime.h: explicitly requires notifier.h
    linux/dmaengine.h: fix implicit use of bitmap.h and asm/page.h
    miscdevice.h: fix up implicit use of lists and types
    stop_machine.h: fix implicit use of smp.h for smp_processor_id
    of: fix implicit use of errno.h in include/linux/of.h
    of_platform.h: delete needless include
    acpi: remove module.h include from platform/aclinux.h
    miscdevice.h: delete unnecessary inclusion of module.h
    device_cgroup.h: delete needless include
    net: sch_generic remove redundant use of
    net: inet_timewait_sock doesnt need
    ...

    Fix up trivial conflicts (other header files, and removal of the ab3550 mfd driver) in
    - drivers/media/dvb/frontends/dibx000_common.c
    - drivers/media/video/{mt9m111.c,ov6650.c}
    - drivers/mfd/ab3550-core.c
    - include/linux/dmaengine.h

    Linus Torvalds
     

01 Nov, 2011

1 commit


18 Oct, 2011

2 commits

  • Add the dma_sync_single_* calls necessary to ensure proper cache
    synchronization for isochronous data buffers on non-coherent
    architectures.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • If a device's firmware initiates a bus reset by setting the IBR bit in
    PHY register 1 without resetting the gap count field to 63 (and without
    having sent a PHY configuration packet beforehand), the gap count of
    this node will remain at the old value after the bus reset and thus be
    inconsistent with the gap count on all other nodes.

    The bus manager is supposed to detect the inconsistent gap count values
    in the self ID packets and correct them by issuing another bus reset.

    However, if the buggy device happens to be the cycle master, and if it
    sends a cycle start packet immediately after the bus reset (which is
    likely after a long bus reset), then the time between the end of the
    selfID phase and the start of the cycle start packet will be based on
    the too-small gap count value, so this gap will be too short to be
    detected as a subaction gap by the other nodes. This means that the
    cycle start packet will be assumed to be self ID data, and will be
    stored after the actual self ID quadlets in the self ID buffer.

    This garbage in the self ID buffer made firewire-core ignore all of the
    self ID data, and thus prevented the Linux bus manager from correcting
    the problem. Furthermore, because the bus reset handling was aborted
    completely, asynchronous transfers would be no longer handled correctly,
    and fw_run_transaction() would hang until the next bus reset.

    To fix this, make the detection of inconsistent self IDs more
    discriminating: If the invalid data in the self ID buffer looks like
    a cycle start packet, we can assume that the previous data in the buffer
    is correctly received self ID information, and process it normally.

    (We inspect only the first quadlet of the cycle start packet, because
    this value is different enough from any valid self ID quadlet, and many
    controllers do not store the cycle start packet in five quadlets because
    they expect self ID data to have an even number of quadlets.)

    This bug has been observed when a bus-powered DesktopKonnekt6 is
    switched off with its power button.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     

09 Oct, 2011

4 commits

  • Change memory region to ohci "middle address space". This effectively
    reduces the number of packets by 50%.

    [Stefan R.:] This eliminates 1394 ack packets and improved throughput
    by a few percent in some tests with an S400a connection with and without
    gap count optimization. Since firewire-net taxes the AR-req DMA unit of
    a FireWire controller much more than firewire-sbp2 (which uses the
    middle address space with PCI posted writes too), this commit also
    changes a related error printk into a ratelimited one as a precaution.

    Side note: The IPv4-over-1394 drivers of Mac OS X 10.4, Windows XP SP3,
    and the Thesycon 1394 bus driver for Windows all use the middle address
    space too.

    Signed-off-by: Stephan Gatzka
    Signed-off-by: Stefan Richter

    Stephan Gatzka
     
  • Use kernel.h's convenience macros. Also omit a printk that should never
    happen and won't matter much if it ever happened.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Takes less source code and machine code, and less runtime with PHYs
    other than TSB41BA3D (e.g. TSB81BA3 with device ID 0x831304 which takes
    one instead of six read_paged_phy_reg now).

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Fix: phy_reg_mutex must be held over the write/read_phy_reg pair which
    gets PHY port status.

    Only print to the log when a TSB41BA3D was found. By far most TSB82AA2
    cards have a TSB81BA3, and firewire-ohci can keep quiet about that.

    Shorten some strings and comments. Change some whitespace.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

17 Sep, 2011

6 commits

  • This patch implements a work around for the Texas Instruments PHY
    TSB41BA3D. This phy has a bug at least in combination with the TI LLCs
    TSB82AA2B and TSB12LV26. The selfid coming from the locally connected
    phy is not propagated into the selfid buffer of the OHCI (see
    http://www.ti.com/litv/pdf/sllz059 for details). The main idea is to
    construct the selfid ourselves.

    Signed-off-by: Stephan Gatzka
    Signed-off-by: Stefan Richter

    Stephan Gatzka
     
  • Code inside bus_reset_work may now sleep. This is a prerequisite to
    support a phy from Texas Instruments cleanly. The patch to support this
    phy will be submitted later.

    Signed-off-by: Stephan Gatzka
    Signed-off-by: Stefan Richter

    Stephan Gatzka
     
  • sbp2_release_target() is folded into its primary user, sbp2_remove().
    The only other caller, a failure path in sbp2_probe(), now uses
    sbp2_remove(). This adds unnecessary cancel_delayed_work_sync() calls
    to that failure path but results in less code and text.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Implement sbp2_queue_work(), which is now a very simple accessor to one
    of the struct sbp2_logical_unit members, right after the definition of
    struct sbp2_logical_unit.

    Put the sbp2_reconnect() implementation right after the sbp2_login()
    implementation. They are both part of the SBP-2 access protocol.

    Implement the driver methods sbp2_probe(), spp2_update(), sbp2_remove()
    in this order, reflecting the lifetime of an SBP-2 target.

    Place the sbp2_release_target() implementation right next to
    sbp2_remove() which is its primary user, and after sbp2_probe() which is
    the counterpart to sbp2_release_target().

    There are no changes to the implementations here, or at least not meant
    to be.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Since commit 0278ccd9d53e07c4e699432b2fed9de6c56f506c "firewire: sbp2:
    fix panic after rmmod with slow targets", the lifetime of an sbp2_target
    instance does no longer extent past the return of sbp2_remove().
    Therefore it is no longer necessary to call fw_unit_get/put() and
    fw_device_get/put() in sbp2_probe/remove().

    Furthermore, said commit also ensures that lu->work is not going to be
    executed or requeued at a time when the sbp2_target is no longer in use.
    Hence there is no need for sbp2_target reference counting for lu->work.

    Other concurrent contexts:

    - Processes which access the sysfs of the SCSI host device or of one
    of its subdevices are safe because these interfaces are all removed
    by scsi_remove_device/host() in sbp2_release_target().

    - SBP-2 command block ORB transactions are finished when
    scsi_remove_device() in sbp2_release_target() returns.

    - SBP-2 management ORB transactions are finished when
    cancel_delayed_work_sync(&lu->work) before sbp2_release_target()
    returns.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • This fixes https://bugs.launchpad.net/ubuntu/+source/linux/+bug/801719 .

    An O2Micro PCI Express FireWire controller,
    "FireWire (IEEE 1394) [0c00]: O2 Micro, Inc. Device [1217:11f7] (rev 05)"
    which is a combination device together with an SDHCI controller and some
    sort of storage controller, misses SBP-2 status writes from an attached
    FireWire HDD. This problem goes away if MSI is disabled for this
    FireWire controller.

    The device reportedly does not require QUIRK_CYCLE_TIMER.

    Signed-off-by: Ming Lei
    Signed-off-by: Stefan Richter (amended changelog)
    Cc:

    Ming Lei
     

28 Aug, 2011

1 commit


23 Aug, 2011

1 commit

  • If firewire-sbp2 starts a login to a target that doesn't complete ORBs
    in a timely manner (and has to retry the login), and the module is
    removed before the operation times out, you end up with a null-pointer
    dereference and a kernel panic.

    [SR: This happens because sbp2_target_get/put() do not maintain
    module references. scsi_device_get/put() do, but at occasions like
    Chris describes one, nobody holds a reference to an SBP-2 sdev.]

    This patch cancels pending work for each unit in sbp2_remove(), which
    hopefully means there are no extra references around that prevent us
    from unloading. This fixes my crash.

    Signed-off-by: Chris Boot
    Signed-off-by: Stefan Richter

    Chris Boot
     

22 Aug, 2011

1 commit


15 Aug, 2011

1 commit


13 Aug, 2011

1 commit

  • Some older Panasonic made camcorders (Panasonic AG-EZ30 and NV-DX110,
    Grundig Scenos DLC 2000) reject requests with ack_busy_X if a request is
    sent immediately after they sent a response to a prior transaction.
    This causes firewire-core to fail probing of the camcorder with "giving
    up on config rom for node id ...". Consequently, programs like kino or
    dvgrab are unaware of the presence of a camcorder.

    Such transaction failures happen also with the ieee1394 driver stack
    (of the 2.4...2.6 kernel series until 2.6.36 inclusive) but with a lower
    likelihood, such that kino or dvgrab are generally able to use these
    camcorders via the older driver stack. The cause for firewire-ohci's or
    firewire-core's worse behavior is not yet known. Gap count optimization
    in firewire-core is not the cause. Perhaps the slightly higher latency
    of transaction completion in the older stack plays a role. (ieee1394:
    AR-resp DMA context tasklet -> packet completion ktread -> user process;
    firewire-core: tasklet -> user process.)

    This change introduces retries and delays after ack_busy_X into
    firewire-core's Config ROM reader, such that at least firewire-core's
    probing and /dev/fw* creation are successful. This still leaves the
    problem that userland processes are facing transaction failures.
    gscanbus's built-in retry routines deal with them successfully, but
    neither kino's nor dvgrab's do ever succeed.

    But at least DV capture with "dvgrab -noavc -card 0" works now. Live
    video preview in kino works too, but not actual capture.

    One way to prevent Configuration ROM reading failures in application
    programs is to modify libraw1394 to synthesize read responses by means
    of firewire-core's Configuration ROM cache. This would only leave
    CMP and FCP transaction failures as a potential problem source for
    applications.

    Reported-and-tested-by: Thomas Seilund
    Reported-and-tested-by: René Fritz
    Signed-off-by: Stefan Richter

    Stefan Richter
     

12 Aug, 2011

2 commits

  • If request_irq failed, we would pass wrong arguments to
    dma_free_coherent. https://bugzilla.redhat.com/show_bug.cgi?id=728185

    Reported-by: Mads Kiilerich
    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Clemens points out that we need to use compat_ptr() in order to safely
    cast from u64 to addresses of a 32-bit usermode client.

    Before, our conversion went wrong
    - in practice if the client cast from pointer to integer such that
    sign-extension happened, (libraw1394 and libdc1394 at least were not
    doing that, IOW were not affected)
    or
    - in theory on s390 (which doesn't have FireWire though) and on the
    tile architecture, regardless of what the client does.
    The bug would usually be observed as the initial get_info ioctl failing
    with "Bad address" (EFAULT).

    Reported-by: Carl Karsten
    Reported-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Stefan Richter
     

27 Jul, 2011

1 commit

  • This allows us to move duplicated code in
    (atomic_inc_not_zero() for now) to

    Signed-off-by: Arun Sharma
    Reviewed-by: Eric Dumazet
    Cc: Ingo Molnar
    Cc: David Miller
    Cc: Eric Dumazet
    Acked-by: Mike Frysinger
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Arun Sharma
     

23 Jul, 2011

1 commit

  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
    firewire: document the sysfs ABIs
    firewire: cdev: ABI documentation enhancements
    firewire: cdev: prevent race between first get_info ioctl and bus reset event queuing
    firewire: cdev: return -ENOTTY for unimplemented ioctls, not -EINVAL
    firewire: ohci: skip soft reset retries after card ejection
    firewire: ohci: fix PHY reg access after card ejection
    firewire: ohci: add a comment on PHY reg access serialization
    firewire: ohci: reduce potential context_stop latency
    firewire: ohci: remove superfluous posted write flushes
    firewire: net: replacing deprecated __attribute__((packed)) with __packed

    Linus Torvalds
     

16 Jul, 2011

2 commits

  • Between open(2) of a /dev/fw* and the first FW_CDEV_IOC_GET_INFO
    ioctl(2) on it, the kernel already queues FW_CDEV_EVENT_BUS_RESET events
    to be read(2) by the client. The get_info ioctl is practically always
    issued right away after open, hence this condition only occurs if the
    client opens during a bus reset, especially during a rapid series of bus
    resets.

    The problem with this condition is twofold:

    - These bus reset events carry the (as yet undocumented) @closure
    value of 0. But it is not the kernel's place to choose closures;
    they are privat to the client. E.g., this 0 value forced from the
    kernel makes it unsafe for clients to dereference it as a pointer to
    a closure object without NULL pointer check.

    - It is impossible for clients to determine the relative order of bus
    reset events from get_info ioctl(2) versus those from read(2),
    except in one way: By comparison of closure values. Again, such a
    procedure imposes complexity on clients and reduces freedom in use
    of the bus reset closure.

    So, change the ABI to suppress queuing of bus reset events before the
    first FW_CDEV_IOC_GET_INFO ioctl was issued by the client.

    Note, this ABI change cannot be version-controlled. The kernel cannot
    distinguish old from new clients before the first FW_CDEV_IOC_GET_INFO
    ioctl.

    We will try to back-merge this change into currently maintained stable/
    longterm series, and we only document the new behaviour. The old
    behavior is now considered a kernel bug, which it basically is.

    Signed-off-by: Stefan Richter
    Cc:

    Stefan Richter
     
  • On Jun 27 Linus Torvalds wrote:
    > The correct error code for "I don't understand this ioctl" is ENOTTY.
    > The naming may be odd, but you should think of that error value as a
    > "unrecognized ioctl number, you're feeding me random numbers that I
    > don't understand and I assume for historical reasons that you tried to
    > do some tty operation on me".
    [...]
    > The EINVAL thing goes way back, and is a disaster. It predates Linux
    > itself, as far as I can tell. You'll find lots of man-pages that have
    > this line in it:
    >
    > EINVAL Request or argp is not valid.
    >
    > and it shows up in POSIX etc. And sadly, it generally shows up
    > _before_ the line that says
    >
    > ENOTTY The specified request does not apply to the kind of object
    > that the descriptor d references.
    >
    > so a lot of people get to the EINVAL, and never even notice the ENOTTY.
    [...]
    > At least glibc (and hopefully other C libraries) use a _string_ that
    > makes much more sense: strerror(ENOTTY) is "Inappropriate ioctl for
    > device"

    So let's correct this in the ABI while it is
    still young, relative to distributor adoption.

    Side note: We return -ENOTTY not only on _IOC_TYPE or _IOC_NR mismatch,
    but also on _IOC_SIZE mismatch. An ioctl with an unsupported size of
    argument structure can be seen as an unsupported version of that ioctl.

    Signed-off-by: Stefan Richter
    Cc:

    Stefan Richter
     

14 Jul, 2011

1 commit


13 Jul, 2011

1 commit


10 Jul, 2011

1 commit

  • When firewire-ohci is bound to a Pinnacle MovieBoard, eventually a
    "Register access failure" is logged and an interrupt storm or a kernel
    panic happens. https://bugzilla.kernel.org/show_bug.cgi?id=36622

    Until this is sorted out (if that is going to succeed at all), let's
    just prevent firewire-ohci from touching these devices.

    Signed-off-by: Stefan Richter
    Cc:

    Stefan Richter
     

09 Jul, 2011

4 commits

  • The software reset in firewire-ohci's pci_remove does not have a great
    prospect of success if the card was already physically removed at this
    point. So let's skip the 500 ms that were spent in retries here.

    Also, replace a defined constant by its open-coded value. This is not a
    constant from a specification but an arbitrarily chosen retry limit. It
    was only used in this single place.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Detect and handle ejection of FireWire CardBus cards in PHY register
    accesses:

    - The last attempt of firewire-core to reset the bus during shutdown
    caused a spurious "firewire_ohci: failed to write phy reg" error
    message in the log. Skip this message as well as the prior retry
    loop that needlessly took 100 milliseconds.

    - In the unlikely case that a PHY register was read right after card
    ejection, a bogus value was obtained and possibly acted upon.
    Instead, fail the read attempt.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Stopping an isochronous reception DMA context takes two loop iterations
    in context_stop on several controllers (JMicron, NEC, VIA). But there
    is no extra delay necessary between these two reg_read trials; the MMIO
    reads themselves are slow enough. Hence bring back the behavior from
    before commit dd6254e5c0efe01ad255188898cb3dadf98cb56d "firewire: ohci:
    remove superfluous posted write flushes" on these controllers by means
    of an "if (i)" condition.

    Isochronous context stop is performed in preemptible contexts (and only
    rarely), hence this change is of little impact. (Besides, Agere and TI
    controllers always, or almost always, have the context stopped already
    at the first ContextControl read.)

    More important is asynchronous transmit context stop, which is performed
    while local interrupts are disabled (on the two AT DMAs in
    bus_reset_tasklet, i.e. after a self-ID-complete event). In my
    experience with several controllers, tested with a usermode AT-request
    transmitter as well as with FTP transmission over firewire-net, the AT
    contexts were luckily already stopped at the first ContextControl read,
    i.e. never required another MMIO read let alone mdelay. A possible
    explanation for this is that the controllers which I tested perhaps stop
    AT DMA before they perform the self-ID reception DMA.

    But we cannot be sure about that and should keep the interrupts-disabled
    busy loop as short as possible. Hence, query the ContextControl
    register in 1000 udelay(10) intervals instead of 10 udelay(1000)
    intervals. I understand from an estimation by Clemens Ladisch that
    stopping a busy DMA context should take microseconds or at worst tens of
    microseconds, not milliseconds.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

02 Jun, 2011

2 commits

  • The call to flush_writes() in context_stop() is superfluous because
    another register read is done immediately afterwards.

    The call to flush_writes() in ar_context_run() does not need to be done
    individually for each AR context, so move it to ohci_enable(). This
    also makes ohci_enable() clearer because it no longer depends on a side
    effect of ar_context_run() to flush its own register writes.

    Finally, the setting of a context's wake bit does not need to be flushed
    because neither the driver logic nor the API require the CPU to wait for
    this action. This removes the last MMIO reads from the packet queueing
    code paths.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • Fixing a deprecation, replacing __attribute__((packed)) with __packed.
    It was deprecated for portability, specifically to avoid GCC specific
    code. See commit 82ddcb040570411fc2d421d96b3e69711c670328.

    Signed-off-by: August Lilleaas
    Signed-off-by: Stefan Richter (added include compiler.h)

    August Lilleaas
     

11 May, 2011

5 commits

  • The struct sbp2_logical_unit.work items can all be executed in parallel
    but are not reentrant. Furthermore, reconnect or re-login work must be
    executed in a WQ_MEM_RECLAIM workqueue.

    Hence replace the old single-threaded firewire-sbp2 workqueue by a
    concurrency-managed but non-reentrant workqueue with rescuer.
    firewire-core already maintains one, hence use this one.

    In earlier versions of this change, I observed occasional failures of
    parallel INQUIRY to an Initio INIC-2430 FireWire 800 to dual IDE bridge.
    More testing indicates that parallel INQUIRY is not actually a problem,
    but too quick successions of logout and login + INQUIRY, e.g. a quick
    sequence of cable plugout and plugin, can result in failed INQUIRY.
    This does not seem to be something that should or could be addressed by
    serialization.

    Another dual-LU device to which I currently have access to, an
    OXUF924DSB FireWire 800 to dual SATA bridge with firmware from MacPower,
    has been successfully tested with this too.

    This change is beneficial to environments with two or more FireWire
    storage devices, especially if they are located on the same bus.
    Management tasks that should be performed as soon and as quickly as
    possible, especially reconnect, are no longer held up by tasks on other
    devices that may take a long time, especially login with INQUIRY and sd
    or sr driver probe.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • We do not need slab allocations for ORB pointer write transactions
    anymore in order to satisfy streaming DMA mapping constraints, thanks to
    commit da28947e7e36 "firewire: ohci: avoid separate DMA mapping for
    small AT payloads".

    (Besides, the slab-allocated buffers that firewire-sbp2 used to provide
    for 8-byte write requests were still not fully portable since they
    shared a cacheline with unrelated CPU-accessed data.)

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • firewire-sbp2 already takes care for internal serialization where
    required (ORB list accesses), and it does not use cmd->serial_number
    internally. Hence it is safe to not grab the shost lock around
    queuecommand.

    While we are at housekeeping, drop a redundant struct member:
    sbp2_command_orb.done is set once in a hot path and dereferenced once in
    a hot path. We can as well dereference sbp2_command_orb.cmd->scsi_done
    instead.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • firewire-core manages the following types of work items:

    fw_card.br_work:
    - resets the bus on a card and possibly sends a PHY packet before that
    - does not sleep for long or not at all
    - is scheduled via fw_schedule_bus_reset() by
    - firewire-ohci's pci_probe method
    - firewire-ohci's set_config_rom method, called by kernelspace
    protocol drivers and userspace drivers which add/remove
    Configuration ROM descriptors
    - userspace drivers which use the bus reset ioctl
    - itself if the last reset happened less than 2 seconds ago

    fw_card.bm_work:
    - performs bus management duties
    - usually does not (but may in corner cases) sleep for long
    - is scheduled via fw_schedule_bm_work() by
    - firewire-ohci's self-ID-complete IRQ handler tasklet
    - firewire-core's fw_device.work instances whenever the root node
    device was (successfully or unsuccessfully) discovered,
    refreshed, or rediscovered
    - itself in case of resource allocation failures or in order to
    obey the 125ms bus manager arbitration interval

    fw_device.work:
    - performs node probe, update, shutdown, revival, removal; including
    kernel driver probe, update, shutdown and bus reset notification to
    userspace drivers
    - usually sleeps moderately long, in corner cases very long
    - is scheduled by
    - firewire-ohci's self-ID-complete IRQ handler tasklet via the
    core's fw_node_event
    - firewire-ohci's pci_remove method via core's fw_destroy_nodes/
    fw_node_event
    - itself during retries, e.g. while a node is powering up

    iso_resource.work:
    - accesses registers at the Isochronous Resource Manager node
    - usually does not (but may in corner cases) sleep for long
    - is scheduled via schedule_iso_resource() by
    - the owning userspace driver at addition and removal of the
    resource
    - firewire-core's fw_device.work instances after bus reset
    - itself in case of resource allocation if necessary to obey the
    1000ms reallocation period after bus reset

    fw_card.br_work instances should not, and instances of the others must
    not, be executed in parallel by multiple CPUs -- but were not protected
    against that. Hence allocate a non-reentrant workqueue for them.

    fw_device.work may be used in the memory reclaim path in case of SBP-2
    device updates. Hence we need a workqueue with rescuer and cannot use
    system_nrt_wq.

    Signed-off-by: Stefan Richter
    Reviewed-by: Tejun Heo

    Stefan Richter
     
  • When queueing iso packets, the run time is dominated by the two
    MMIO accesses that set the DMA context's wake bit. Because most
    drivers submit packets in batches, we can save much time by
    removing all but the last wakeup.

    The internal kernel API is changed to require a call to
    fw_iso_context_queue_flush() after a batch of queued packets.
    The user space API does not change, so one call to
    FW_CDEV_IOC_QUEUE_ISO must specify multiple packets to take
    advantage of this optimization.

    In my measurements, this patch reduces the time needed to queue
    fifty skip packets from userspace to one sixth on a 2.5 GHz CPU,
    or to one third at 800 MHz.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch