1. 05 1月, 2009 9 次提交
  2. 14 12月, 2008 1 次提交
  3. 10 12月, 2008 1 次提交
    • N
      ieee1394: node manager causes up to ~3.25s delay in freezing tasks · ec9a13cd
      Nigel Cunningham 提交于
      The firewire nodemanager function "nodemgr_host_thread" contains a loop
      that calls try_to_freeze near the top of the loop, but then delays for
      up to 3.25 seconds (plus time to do work) before getting back to the top
      of the loop. When starting a cycle post-boot, this doesn't seem to bite,
      but it is causing a noticeable delay at boot time, when freezing
      processes prior to starting to read the image.
      
      The following patch adds invocation of try_to_freeze to the subloops
      that are used in the body of this function. With these additions, the
      time to freeze when starting to resume at boot time is virtually zero.
      I'm no expert on firewire, and so don't know that we shouldn't check
      the return value and jump back to the top of the loop or such like after
      being frozen, but I submit it for your consideration.
      Signed-off-by: NNigel Cunningham <nigel@tuxonice.net>
      
      The delay until nodemgr freezes was up to 0.25s (plus time for node
      probes) in Linux 2.6.27 and older and up to 3.25s (plus ~) since Linux
      2.6.28-rc1, hence much more noticeable.
      
      try_to_freeze() without any jump is correct.  The surrounding code in
      the respective loops will catch whether another bus reset happens during
      the freeze and handle it.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      ec9a13cd
  4. 30 11月, 2008 2 次提交
  5. 26 11月, 2008 1 次提交
  6. 02 11月, 2008 1 次提交
    • A
      saner FASYNC handling on file close · 233e70f4
      Al Viro 提交于
      As it is, all instances of ->release() for files that have ->fasync()
      need to remember to evict file from fasync lists; forgetting that
      creates a hole and we actually have a bunch that *does* forget.
      
      So let's keep our lives simple - let __fput() check FASYNC in
      file->f_flags and call ->fasync() there if it's been set.  And lose that
      crap in ->release() instances - leaving it there is still valid, but we
      don't have to bother anymore.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      233e70f4
  7. 31 10月, 2008 3 次提交
  8. 17 10月, 2008 1 次提交
  9. 16 10月, 2008 10 次提交
    • S
      ieee1394: survive a few seconds connection loss · fc392fe8
      Stefan Richter 提交于
      There are situations when nodes vanish from the bus and come back in
      quickly thereafter:
        - When certain bus-powered hubs are plugged in,
        - when certain disk enclosures are switched from self-power to bus
          power or vice versa and break the daisy chain during the transition,
        - when the user plugs a cable out and quickly plugs it back in, e.g.
          to reorder a daisy chain (works on Mac OS X if done quickly enough),
        - when certain hubs temporarily malfunction during high bus traffic.
      
      The ieee1394 driver's nodemgr already contained a function to set
      vanished nodes aside into "limbo"; i.e. they wouldn't actually be
      deleted right away.  (In fact, only unloading the driver or writing into
      an obscure sysfs attribute would delete them eventually.)  If nodes
      reappeared later, they would be resurrected out of limbo.
      
      Moving nodes into and out of limbo was accompanied with calling the
      .suspend() and .resume() driver methods of the drivers which were bound
      to a respective node's unit directories.  Not only is this somewhat
      strange due to the intended use of these driver methods for power
      management, also the sbp2 driver in particular does not implement
      .suspend() and .resume().  Hence sbp2 would be disconnected from devices
      in situations as listed above.
      
      We now:
        - leave drivers bound when nodes go into limbo,
        - call the drivers' .update() when nodes come out of limbo,
        - automatically delete in-limbo nodes 3 seconds after the last
          bus reset and bus rescan.
        - Because of the automatic removal, the now obsolete bus attribute
          /sys/bus/ieee1394/destroy_node is removed.
      
      This especially lets sbp2 survive brief disconnections.  You can for
      example yank a disk's cable and plug it back in while reading the
      respective disk with dd, but dd will happily continue as if nothing
      happened.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      fc392fe8
    • S
      ieee1394: nodemgr clean up class iterators · 11305c3e
      Stefan Richter 提交于
      Remove useless pointer type casts.
      Remove unnecessary hi->host indirection where only host is used.
      Remove an unnecessary WARN_ON.
      Change a few names.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      11305c3e
    • S
      ieee1394: dv1394, video1394: remove unnecessary expressions · d98562d1
      Stefan Richter 提交于
      init->channel and v.buffer are unsigned and tests for < 0 therefore
      always false.  gcc knows this and eliminates the code, but anyway...
      Reported by Roel Kluin.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      d98562d1
    • S
      ieee1394: raw1394: make write() thread-safe · f22e52b8
      Stefan Richter 提交于
      Application programs should use a libraw1394 handle only in a single
      thread.  The raw1394 driver was apparently relying on this, because it
      did nothing to protect its fi->state variable from corruption due to
      concurrent accesses.
      
      We now serialize the fi->state accesses.  This affects the write() path.
      We re-use the state_mutex which was introduced to protect fi->iso_state
      accesses in the ioctl() path.  These paths and accesses are independent
      of each other, hence separate mutexes could be used.  But I don't see
      much benefit in that.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      f22e52b8
    • S
      ieee1394: raw1394: narrow down the state_mutex protected region · ddfb908d
      Stefan Richter 提交于
      Refactor the ioctl dispatcher in order to move a fraction of it out of
      the section which is serialized by fi->state_mutex.  This is not so much
      about performance but more about self-documentation:  The mutex_lock()/
      mutex_unlock() calls are now closer to the data accesses which the mutex
      protects, i.e. to the iso_state switch.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      ddfb908d
    • S
      ieee1394: raw1394: replace BKL by local mutex, make ioctl() and mmap() thread-safe · 10963ea1
      Stefan Richter 提交于
      This removes the last usage of the Big Kernel Lock from the ieee1394
      stack, i.e. from raw1394's (unlocked_)ioctl and compat_ioctl.
      
      The ioctl()s don't need to take the BKL, but they need to be serialized
      per struct file *.  In particular, accesses to ->iso_state need to be
      serial.  We simply use a blocking mutex for this purpose because
      libraw1394 does not use O_NONBLOCK.  In practice, there is no lock
      contention anyway because most if not all libraw1394 clients use a
      libraw1394 handle only in a single thread.
      
      mmap() also accesses ->iso_state.  Until now this was unprotected
      against concurrent changes by ioctls.  Fix this bug while we are at it.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      10963ea1
    • S
      ieee1394: sbp2: enforce s/g segment size limit · ed6ffd08
      Stefan Richter 提交于
      1. We don't need to round the SBP-2 segment size limit down to a
         multiple of 4 kB (0xffff -> 0xf000).  It is only necessary to
         ensure quadlet alignment (0xffff -> 0xfffc).
      
      2. Use dma_set_max_seg_size() to tell the DMA mapping infrastructure
         and the block IO layer about the restriction.  This way we can
         remove the size checks and segment splitting in the queuecommand
         path.
      
         This assumes that no other code in the ieee1394 stack uses
         dma_map_sg() with conflicting requirements.  It furthermore assumes
         that the controller device's platform actually allows us to set the
         segment size to our liking.  Assert the latter with a BUG_ON().
      
      3. Also use blk_queue_max_segment_size() to tell the block IO layer
         about it.  It cannot know it because our scsi_add_host() does not
         point to the FireWire controller's device.
      
      We can also uniformly use dma_map_sg() for the single segment case just
      like for the multi segment case, to further simplify the code.
      
      Also clean up how the page table is converted to big endian.
      
      Thanks to Grant Grundler and FUJITA Tomonori for advice.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      ed6ffd08
    • S
      cd8c79f1
    • S
      ieee1394: sbp2: stricter dma_sync · 0a77b17c
      Stefan Richter 提交于
      Two dma_sync_single_for_cpu() were called in the wrong place.
      Luckily they were merely for DMA_TO_DEVICE, hence nobody noticed.
      
      Also reorder the matching dma_sync_single_for_device() a little bit
      so that they reside in the same functions as their counterparts.
      This also avoids syncing the s/g table for requests which don't use it.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      0a77b17c
    • J
      ieee1394: Use DIV_ROUND_UP · 68e2aa79
      Julia Lawall 提交于
      Signed-off-by: NJulia Lawall <julia@diku.dk>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      68e2aa79
  10. 20 8月, 2008 3 次提交
  11. 25 7月, 2008 1 次提交
    • A
      PAGE_ALIGN(): correctly handle 64-bit values on 32-bit architectures · 27ac792c
      Andrea Righi 提交于
      On 32-bit architectures PAGE_ALIGN() truncates 64-bit values to the 32-bit
      boundary. For example:
      
      	u64 val = PAGE_ALIGN(size);
      
      always returns a value < 4GB even if size is greater than 4GB.
      
      The problem resides in PAGE_MASK definition (from include/asm-x86/page.h for
      example):
      
      #define PAGE_SHIFT      12
      #define PAGE_SIZE       (_AC(1,UL) << PAGE_SHIFT)
      #define PAGE_MASK       (~(PAGE_SIZE-1))
      ...
      #define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
      
      The "~" is performed on a 32-bit value, so everything in "and" with
      PAGE_MASK greater than 4GB will be truncated to the 32-bit boundary.
      Using the ALIGN() macro seems to be the right way, because it uses
      typeof(addr) for the mask.
      
      Also move the PAGE_ALIGN() definitions out of include/asm-*/page.h in
      include/linux/mm.h.
      
      See also lkml discussion: http://lkml.org/lkml/2008/6/11/237
      
      [akpm@linux-foundation.org: fix drivers/media/video/uvc/uvc_queue.c]
      [akpm@linux-foundation.org: fix v850]
      [akpm@linux-foundation.org: fix powerpc]
      [akpm@linux-foundation.org: fix arm]
      [akpm@linux-foundation.org: fix mips]
      [akpm@linux-foundation.org: fix drivers/media/video/pvrusb2/pvrusb2-dvb.c]
      [akpm@linux-foundation.org: fix drivers/mtd/maps/uclinux.c]
      [akpm@linux-foundation.org: fix powerpc]
      Signed-off-by: NAndrea Righi <righi.andrea@gmail.com>
      Cc: <linux-arch@vger.kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      27ac792c
  12. 22 7月, 2008 3 次提交
  13. 14 7月, 2008 4 次提交