1. 02 Oct, 2012 40 commits
    • Greg Kroah-Hartman's avatar
      Revert: drm/i915: correctly order the ring init sequence · 446d14d4
      Greg Kroah-Hartman authored
      This reverts commit 57ecc93c which
      really is commit 0d8957c8 upstream as it
      has been reported to cause problems in the 3.4.y kernel series.
      Reported-by: default avatarHerton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
      Cc: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
      Cc: Jani Nikula <jani.nikula@intel.com>
      Cc: Yang Guang <guang.a.yang@intel.com>
      Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      446d14d4
    • Dan Carpenter's avatar
      vmwgfx: corruption in vmw_event_fence_action_create() · 9a266f61
      Dan Carpenter authored
      commit 68c4fce7 upstream.
      
      We don't allocate enough data for this struct.  As soon as we start
      modifying event->event on the next lines, then we're going beyond the
      end of the memory we allocated.
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarDave Airlie <airlied@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9a266f61
    • Jani Nikula's avatar
      drm/i915: fall back to bit-banging if GMBUS fails in CRT EDID reads · 03c4c80e
      Jani Nikula authored
      commit f1a2f5b7 upstream.
      
      GMBUS was enabled over bit-banging as the default in commits:
      
      commit c3dfefa0
      Author: Daniel Vetter <daniel.vetter@ffwll.ch>
      Date:   Tue Feb 14 22:37:25 2012 +0100
      
          drm/i915: reenable gmbus on gen3+ again
      
      and
      
      commit 0fb3f969
      Author: Daniel Vetter <daniel.vetter@ffwll.ch>
      Date:   Fri Mar 2 19:38:30 2012 +0100
      
          drm/i915: enable gmbus on gen2
      
      Unfortunately, GMBUS seems to fail on some CRT displays. Add a bit-banging
      fallback to CRT EDID reads.
      
      LKML-Reference: <201207251020.47637.maciej.rutecki@gmail.com>
      Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=45881Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
      Tested-by: default avatarAlex Ferrando <alferpal@gmail.com>
      Cc: stable@vger.kernel.org (for 3.4+3.5)
      Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      
      03c4c80e
    • Dave Airlie's avatar
      drm/udl: limit modes to the sku pixel limits. · bd1d3d83
      Dave Airlie authored
      commit 3a758858 upstream.
      
      Otherwise when X starts we commonly get a black screen scanning
      out nothing, its wierd dpms on/off from userspace brings it back,
      
      With this on F18, multi-seat works again with my 1920x1200 monitor
      which is above the sku limit for the device I have.
      Reviewed-by: default avatarAlex Deucher <alexander.deucher@gmail.com>
      Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bd1d3d83
    • Roland Stigge's avatar
      gpio-lpc32xx: Fix value handling of gpio_direction_output() · 66801463
      Roland Stigge authored
      commit b1268d37 upstream.
      
      For GPIOs of gpio-lpc32xx, gpio_direction_output() ignores the value argument
      (initial value of output). This patch fixes this by setting the level
      accordingly.
      Signed-off-by: default avatarRoland Stigge <stigge@antcom.de>
      Acked-by: default avatarAlexandre Pereira da Silva <aletes.xgr@gmail.com>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      66801463
    • Mark Brown's avatar
      d20ff72c
    • Alan Stern's avatar
      USB: Fix race condition when removing host controllers · 1437cb57
      Alan Stern authored
      commit 0d00dc26 upstream.
      
      This patch (as1607) fixes a race that can occur if a USB host
      controller is removed while a process is reading the
      /sys/kernel/debug/usb/devices file.
      
      The usb_device_read() routine uses the bus->root_hub pointer to
      determine whether or not the root hub is registered.  The is not a
      valid test, because the pointer is set before the root hub gets
      registered and remains set even after the root hub is unregistered and
      deallocated.  As a result, usb_device_read() or usb_device_dump() can
      access freed memory, causing an oops.
      
      The patch changes the test to use the hcd->rh_registered flag, which
      does get set and cleared at the appropriate times.  It also makes sure
      to hold the usb_bus_list_lock mutex while setting the flag, so that
      usb_device_read() will become aware of new root hubs as soon as they
      are registered.
      Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
      Reported-by: default avatarDon Zickus <dzickus@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      1437cb57
    • Joachim Eastwood's avatar
      USB: ohci-at91: fix null pointer in ohci_hcd_at91_overcurrent_irq · 0f36cbb3
      Joachim Eastwood authored
      commit 01bb6501 upstream.
      
      Fixes the following NULL pointer dereference:
      [    7.740000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
      [    7.810000] Unable to handle kernel NULL pointer dereference at virtual address 00000028
      [    7.810000] pgd = c3a38000
      [    7.810000] [00000028] *pgd=23a8c831, *pte=00000000, *ppte=00000000
      [    7.810000] Internal error: Oops: 17 [#1] PREEMPT ARM
      [    7.810000] Modules linked in: ohci_hcd(+) regmap_i2c snd_pcm usbcore snd_page_alloc at91_cf snd_timer pcmcia_rsrc snd soundcore gpio_keys regmap_spi pcmcia_core usb_common nls_base
      [    7.810000] CPU: 0    Not tainted  (3.6.0-rc6-mpa+ #264)
      [    7.810000] PC is at __gpio_to_irq+0x18/0x40
      [    7.810000] LR is at ohci_hcd_at91_overcurrent_irq+0x24/0xb4 [ohci_hcd]
      [    7.810000] pc : [<c01392d4>]    lr : [<bf08f694>]    psr: 40000093
      [    7.810000] sp : c3a11c40  ip : c3a11c50  fp : c3a11c4c
      [    7.810000] r10: 00000000  r9 : c02dcd6e  r8 : fefff400
      [    7.810000] r7 : 00000000  r6 : c02cc928  r5 : 00000030  r4 : c02dd168
      [    7.810000] r3 : c02e7350  r2 : ffffffea  r1 : c02cc928  r0 : 00000000
      [    7.810000] Flags: nZcv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
      [    7.810000] Control: c000717f  Table: 23a38000  DAC: 00000015
      [    7.810000] Process modprobe (pid: 285, stack limit = 0xc3a10270)
      [    7.810000] Stack: (0xc3a11c40 to 0xc3a12000)
      [    7.810000] 1c40: c3a11c6c c3a11c50 bf08f694 c01392cc c3a11c84 c2c38b00 c3806900 00000030
      [    7.810000] 1c60: c3a11ca4 c3a11c70 c0051264 bf08f680 c3a11cac c3a11c80 c003e764 c3806900
      [    7.810000] 1c80: c2c38b00 c02cb05c c02cb000 fefff400 c3806930 c3a11cf4 c3a11cbc c3a11ca8
      [    7.810000] 1ca0: c005142c c005123c c3806900 c3805a00 c3a11cd4 c3a11cc0 c0053f24 c00513e4
      [    7.810000] 1cc0: c3a11cf4 00000030 c3a11cec c3a11cd8 c005120c c0053e88 00000000 00000000
      [    7.810000] 1ce0: c3a11d1c c3a11cf0 c00124d0 c00511e0 01400000 00000001 00000012 00000000
      [    7.810000] 1d00: ffffffff c3a11d94 00000030 00000000 c3a11d34 c3a11d20 c005120c c0012438
      [    7.810000] 1d20: c001dac4 00000012 c3a11d4c c3a11d38 c0009b08 c00511e0 c00523fc 60000013
      [    7.810000] 1d40: c3a11d5c c3a11d50 c0008510 c0009ab4 c3a11ddc c3a11d60 c0008eb4 c00084f0
      [    7.810000] 1d60: 00000000 00000030 00000000 00000080 60000013 bf08f670 c3806900 c2c38b00
      [    7.810000] 1d80: 00000030 c3806930 00000000 c3a11ddc c3a11d88 c3a11da8 c0054190 c00523fc
      [    7.810000] 1da0: 60000013 ffffffff c3a11dec c3a11db8 00000000 c2c38b00 bf08f670 c3806900
      [    7.810000] 1dc0: 00000000 00000080 c02cc928 00000030 c3a11e0c c3a11de0 c0052764 c00520d8
      [    7.810000] 1de0: c3a11dfc 00000000 00000000 00000002 bf090f61 00000004 c02cc930 c02cc928
      [    7.810000] 1e00: c3a11e4c c3a11e10 bf090978 c005269c bf090f61 c02cc928 bf093000 c02dd170
      [    7.810000] 1e20: c3a11e3c c02cc930 c02cc930 bf0911d0 bf0911d0 bf093000 c3a10000 00000000
      [    7.810000] 1e40: c3a11e5c c3a11e50 c0155b7c bf090808 c3a11e7c c3a11e60 c0154690 c0155b6c
      [    7.810000] 1e60: c02cc930 c02cc964 bf0911d0 c3a11ea0 c3a11e9c c3a11e80 c015484c c01545e8
      [    7.810000] 1e80: 00000000 00000000 c01547e4 bf0911d0 c3a11ec4 c3a11ea0 c0152e58 c01547f4
      [    7.810000] 1ea0: c381b88c c384ab10 c2c10540 bf0911d0 00000000 c02d7518 c3a11ed4 c3a11ec8
      [    7.810000] 1ec0: c01544c0 c0152e0c c3a11efc c3a11ed8 c01536cc c01544b0 bf091075 c3a11ee8
      [    7.810000] 1ee0: bf049af0 bf09120c bf0911d0 00000000 c3a11f1c c3a11f00 c0154e9c c0153628
      [    7.810000] 1f00: bf049af0 bf09120c 000ae190 00000000 c3a11f2c c3a11f20 c0155f58 c0154e04
      [    7.810000] 1f20: c3a11f44 c3a11f30 bf093054 c0155f1c 00000000 00006a4f c3a11f7c c3a11f48
      [    7.810000] 1f40: c0008638 bf093010 bf09120c 000ae190 00000000 c00093c4 00006a4f bf09120c
      [    7.810000] 1f60: 000ae190 00000000 c00093c4 00000000 c3a11fa4 c3a11f80 c004fdc4 c000859c
      [    7.810000] 1f80: c3a11fa4 000ae190 00006a4f 00016eb8 000ad018 00000080 00000000 c3a11fa8
      [    7.810000] 1fa0: c0009260 c004fd58 00006a4f 00016eb8 000ae190 00006a4f 000ae100 00000000
      [    7.810000] 1fc0: 00006a4f 00016eb8 000ad018 00000080 000adba0 000ad208 00000000 000ad3d8
      [    7.810000] 1fe0: beaf7ae8 beaf7ad8 000172b8 b6e4e940 20000010 000ae190 00000000 00000000
      [    7.810000] Backtrace:
      [    7.810000] [<c01392bc>] (__gpio_to_irq+0x0/0x40) from [<bf08f694>] (ohci_hcd_at91_overcurrent_irq+0x24/0xb4 [ohci_hcd])
      [    7.810000] [<bf08f670>] (ohci_hcd_at91_overcurrent_irq+0x0/0xb4 [ohci_hcd]) from [<c0051264>] (handle_irq_event_percpu+0x38/0x1a8)
      [    7.810000]  r6:00000030 r5:c3806900 r4:c2c38b00
      [    7.810000] [<c005122c>] (handle_irq_event_percpu+0x0/0x1a8) from [<c005142c>] (handle_irq_event+0x58/0x7c)
      [    7.810000] [<c00513d4>] (handle_irq_event+0x0/0x7c) from [<c0053f24>] (handle_simple_irq+0xac/0xd8)
      [    7.810000]  r5:c3805a00 r4:c3806900
      [    7.810000] [<c0053e78>] (handle_simple_irq+0x0/0xd8) from [<c005120c>] (generic_handle_irq+0x3c/0x48)
      [    7.810000]  r4:00000030
      [    7.810000] [<c00511d0>] (generic_handle_irq+0x0/0x48) from [<c00124d0>] (gpio_irq_handler+0xa8/0xfc)
      [    7.810000]  r4:00000000
      [    7.810000] [<c0012428>] (gpio_irq_handler+0x0/0xfc) from [<c005120c>] (generic_handle_irq+0x3c/0x48)
      [    7.810000] [<c00511d0>] (generic_handle_irq+0x0/0x48) from [<c0009b08>] (handle_IRQ+0x64/0x88)
      [    7.810000]  r4:00000012
      [    7.810000] [<c0009aa4>] (handle_IRQ+0x0/0x88) from [<c0008510>] (at91_aic_handle_irq+0x30/0x38)
      [    7.810000]  r5:60000013 r4:c00523fc
      [    7.810000] [<c00084e0>] (at91_aic_handle_irq+0x0/0x38) from [<c0008eb4>] (__irq_svc+0x34/0x60)
      [    7.810000] Exception stack(0xc3a11d60 to 0xc3a11da8)
      [    7.810000] 1d60: 00000000 00000030 00000000 00000080 60000013 bf08f670 c3806900 c2c38b00
      [    7.810000] 1d80: 00000030 c3806930 00000000 c3a11ddc c3a11d88 c3a11da8 c0054190 c00523fc
      [    7.810000] 1da0: 60000013 ffffffff
      [    7.810000] [<c00520c8>] (__setup_irq+0x0/0x458) from [<c0052764>] (request_threaded_irq+0xd8/0x134)
      [    7.810000] [<c005268c>] (request_threaded_irq+0x0/0x134) from [<bf090978>] (ohci_hcd_at91_drv_probe+0x180/0x41c [ohci_hcd])
      [    7.810000] [<bf0907f8>] (ohci_hcd_at91_drv_probe+0x0/0x41c [ohci_hcd]) from [<c0155b7c>] (platform_drv_probe+0x20/0x24)
      [    7.810000] [<c0155b5c>] (platform_drv_probe+0x0/0x24) from [<c0154690>] (driver_probe_device+0xb8/0x20c)
      [    7.810000] [<c01545d8>] (driver_probe_device+0x0/0x20c) from [<c015484c>] (__driver_attach+0x68/0x88)
      [    7.810000]  r7:c3a11ea0 r6:bf0911d0 r5:c02cc964 r4:c02cc930
      [    7.810000] [<c01547e4>] (__driver_attach+0x0/0x88) from [<c0152e58>] (bus_for_each_dev+0x5c/0x9c)
      [    7.810000]  r6:bf0911d0 r5:c01547e4 r4:00000000
      [    7.810000] [<c0152dfc>] (bus_for_each_dev+0x0/0x9c) from [<c01544c0>] (driver_attach+0x20/0x28)
      [    7.810000]  r7:c02d7518 r6:00000000 r5:bf0911d0 r4:c2c10540
      [    7.810000] [<c01544a0>] (driver_attach+0x0/0x28) from [<c01536cc>] (bus_add_driver+0xb4/0x22c)
      [    7.810000] [<c0153618>] (bus_add_driver+0x0/0x22c) from [<c0154e9c>] (driver_register+0xa8/0x144)
      [    7.810000]  r7:00000000 r6:bf0911d0 r5:bf09120c r4:bf049af0
      [    7.810000] [<c0154df4>] (driver_register+0x0/0x144) from [<c0155f58>] (platform_driver_register+0x4c/0x60)
      [    7.810000]  r7:00000000 r6:000ae190 r5:bf09120c r4:bf049af0
      [    7.810000] [<c0155f0c>] (platform_driver_register+0x0/0x60) from [<bf093054>] (ohci_hcd_mod_init+0x54/0x8c [ohci_hcd])
      [    7.810000] [<bf093000>] (ohci_hcd_mod_init+0x0/0x8c [ohci_hcd]) from [<c0008638>] (do_one_initcall+0xac/0x174)
      [    7.810000]  r4:00006a4f
      [    7.810000] [<c000858c>] (do_one_initcall+0x0/0x174) from [<c004fdc4>] (sys_init_module+0x7c/0x1a0)
      [    7.810000] [<c004fd48>] (sys_init_module+0x0/0x1a0) from [<c0009260>] (ret_fast_syscall+0x0/0x2c)
      [    7.810000]  r7:00000080 r6:000ad018 r5:00016eb8 r4:00006a4f
      [    7.810000] Code: e24cb004 e59f3028 e1a02000 e7930180 (e5903028)
      [    7.810000] ---[ end trace 85aa37ed128143b5 ]---
      [    7.810000] Kernel panic - not syncing: Fatal exception in interrupt
      
      Commit 6fffb77c (USB: ohci-at91: fix PIO handling in relation with number of
      ports) started setting unused pins to EINVAL. But this exposed a bug in the
      ohci_hcd_at91_overcurrent_irq function where the gpio was used without being
      checked to see if it is valid.
      
      This patches fixed the issue by adding the gpio valid check.
      Signed-off-by: default avatarJoachim Eastwood <joachim.eastwood@jotron.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0f36cbb3
    • Stanislav Kinsbursky's avatar
      LockD: pass service to per-net up and down functions · feab18eb
      Stanislav Kinsbursky authored
      commit 4db77695 upstream.
      Signed-off-by: default avatarStanislav Kinsbursky <skinsbursky@parallels.com>
      Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
      Cc: Jason Wessel <jason.wessel@windriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      
      feab18eb
    • Tejun Heo's avatar
      kthread_worker: reimplement flush_kthread_work() to allow freeing the work item being executed · 97ed537e
      Tejun Heo authored
      commit 46f3d976 upstream.
      
      kthread_worker provides minimalistic workqueue-like interface for
      users which need a dedicated worker thread (e.g. for realtime
      priority).  It has basic queue, flush_work, flush_worker operations
      which mostly match the workqueue counterparts; however, due to the way
      flush_work() is implemented, it has a noticeable difference of not
      allowing work items to be freed while being executed.
      
      While the current users of kthread_worker are okay with the current
      behavior, the restriction does impede some valid use cases.  Also,
      removing this difference isn't difficult and actually makes the code
      easier to understand.
      
      This patch reimplements flush_kthread_work() such that it uses a
      flush_work item instead of queue/done sequence numbers.
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      Cc: Colin Cross <ccross@google.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      97ed537e
    • Tejun Heo's avatar
      kthread_worker: reorganize to prepare for flush_kthread_work() reimplementation · 34b6567e
      Tejun Heo authored
      commit 9a2e03d8 upstream.
      
      Make the following two non-functional changes.
      
      * Separate out insert_kthread_work() from queue_kthread_work().
      
      * Relocate struct kthread_flush_work and kthread_flush_work_fn()
        definitions above flush_kthread_work().
      
      v2: Added lockdep_assert_held() in insert_kthread_work() as suggested
          by Andy Walls.
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      Acked-by: default avatarAndy Walls <awalls@md.metrocast.net>
      Cc: Colin Cross <ccross@google.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      34b6567e
    • Stanislav Kinsbursky's avatar
      NFSd: set nfsd_serv to NULL after service destruction · c717dcaf
      Stanislav Kinsbursky authored
      commit 57c8b13e upstream.
      
      In nfsd_destroy():
      
      	if (destroy)
      		svc_shutdown_net(nfsd_serv, net);
      	svc_destroy(nfsd_server);
      
      svc_shutdown_net(nfsd_serv, net) calls nfsd_last_thread(), which sets
      nfsd_serv to NULL, causing a NULL dereference on the following line.
      Signed-off-by: default avatarStanislav Kinsbursky <skinsbursky@parallels.com>
      Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c717dcaf
    • Stanislav Kinsbursky's avatar
    • Artem Bityutskiy's avatar
      UBI: fix a horrible memory deallocation bug · 1d22d566
      Artem Bityutskiy authored
      commit 78b495c3 upstream
      
      UBI was mistakingly using 'kfree()' instead of 'kmem_cache_free()' when
      freeing "attach eraseblock" structures in vtbl.c. Thankfully, this happened
      only when we were doing auto-format, so many systems were unaffected. However,
      there are still many users affected.
      
      It is strange, but the system did not crash and nothing bad happened when
      the SLUB memory allocator was used. However, in case of SLOB we observed an
      crash right away.
      
      This problem was introduced in 2.6.39 by commit
      "6c1e875c UBI: add slab cache for ubi_scan_leb objects"
      Reported-by: default avatarRichard Genoud <richard.genoud@gmail.com>
      Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
      Signed-off-by: default avatarRichard Genoud <richard.genoud@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      1d22d566
    • Seth Forshee's avatar
      irq_remap: disable IRQ remapping if any IOAPIC lacks an IOMMU · 77d13a08
      Seth Forshee authored
      commit 32ab31e0 upstream.
      
      The ACPI tables in the Macbook Air 5,1 define a single IOAPIC with id 2,
      but the only remapping unit described in the DMAR table matches id 0.
      Interrupt remapping fails as a result, and the kernel panics with the
      message "timer doesn't work through Interrupt-remapped IO-APIC."
      
      To fix this, check each IOAPIC for a corresponding IOMMU. If an IOMMU is
      not found, do not allow IRQ remapping to be enabled.
      
      v2: Move check to parse_ioapics_under_ir(), raise log level to KERN_ERR,
          and add FW_BUG to the log message
      v3: Skip check if IOMMU doesn't support interrupt remapping and remove
          existing check that the IOMMU count equals the IOAPIC count
      Acked-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
      Signed-off-by: default avatarSeth Forshee <seth.forshee@canonical.com>
      Acked-by: default avatarYinghai Lu <yinghai@kernel.org>
      Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
      Acked-by: default avatarCho, Yu-Chen <acho@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      77d13a08
    • Satoru Moriya's avatar
      mm: avoid swapping out with swappiness==0 · 49194d4e
      Satoru Moriya authored
      commit fe35004f upstream.
      
      Sometimes we'd like to avoid swapping out anonymous memory.  In
      particular, avoid swapping out pages of important process or process
      groups while there is a reasonable amount of pagecache on RAM so that we
      can satisfy our customers' requirements.
      
      OTOH, we can control how aggressive the kernel will swap memory pages with
      /proc/sys/vm/swappiness for global and
      /sys/fs/cgroup/memory/memory.swappiness for each memcg.
      
      But with current reclaim implementation, the kernel may swap out even if
      we set swappiness=0 and there is pagecache in RAM.
      
      This patch changes the behavior with swappiness==0.  If we set
      swappiness==0, the kernel does not swap out completely (for global reclaim
      until the amount of free pages and filebacked pages in a zone has been
      reduced to something very very small (nr_free + nr_filebacked < high
      watermark)).
      Signed-off-by: default avatarSatoru Moriya <satoru.moriya@hds.com>
      Acked-by: default avatarMinchan Kim <minchan@kernel.org>
      Reviewed-by: default avatarRik van Riel <riel@redhat.com>
      Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      49194d4e
    • Bjørn Mork's avatar
      net: qmi_wwan: new devices: UML290 and K5006-Z · 64255043
      Bjørn Mork authored
      commit 10cbc1d9 upstream.
      
      Newer firmware versions for the Pantech UML290 use a different
      subclass ID.  The Windows driver match on both IDs, so we do
      that as well.
      
      The ZTE (Vodafone) K5006-Z is a new device.
      Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
      Cc: Dan Williams <dcbw@redhat.com>
      Cc: Thomas Schäfer <tschaefer@t-online.de>
      [bmork: backported to 3.4: use driver whitelisting]
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      64255043
    • Bjørn Mork's avatar
      net: qmi_wwan: add Sierra Wireless devices · 8d336271
      Bjørn Mork authored
      commit 9b469a60 upstream.
      
      Add 6 new devices and one modified device, based on
      information from laptop vendor Windows drivers.
      
      Sony provides a driver with two new devices using
      a Gobi 2k+ layout (1199:68a5 and 1199:68a9).  The
      Sony driver also adds a non-standard QMI/net
      interface to the already supported 1199:9011
      Gobi device. We do not know whether this is an
      alternate interface number or an additional
      interface which might be present, but that doesn't
      really matter.
      
      Lenovo provides a driver supporting 4 new devices:
       - MC7770 (1199:901b) with standard Gobi 2k+ layout
       - MC7700 (0f3d:68a2) with layout similar to MC7710
       - MC7750 (114f:68a2) with layout similar to MC7710
       - EM7700 (1199:901c) with layout similar to MC7710
      
      Note regaring the three devices similar to MC7710:
      
      The Windows drivers only support interface #8 on these
      devices.  The MC7710 can support QMI/net functions on
      interface #19 and #20 as well, and this driver is
      verified to work on interface #19 (a firmware bug is
      suspected to prevent #20 from working).
      
      We do not enable these additional interfaces until they
      either show up in a Windows driver or are verified to
      work in some other way.  Therefore limiting the new
      devices to interface #8 for now.
      
      [bmork: backported to 3.4: use driver whitelisting]
      Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      8d336271
    • Bjørn Mork's avatar
      net: qmi_wwan: add ZTE MF821D · e7861ce7
      Bjørn Mork authored
      commit db8dacf9 upstream.
      
      Sold by O2 (telefonica germany) under the name "LTE4G"
      Tested-by: default avatarThomas Schäfer <tschaefer@t-online.de>
      Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e7861ce7
    • Bjørn Mork's avatar
      net: qmi_wwan: add ZTE MF60 · e7f558cc
      Bjørn Mork authored
      commit 6fecd35d upstream.
      
      Adding a device with limited QMI support. It does not support
      normal QMI_WDS commands for connection management. Instead,
      sending a QMI_CTL SET_INSTANCE_ID command is required to
      enable the network interface:
      
        01 0f 00 00 00 00 00 00  20 00 04 00 01 01 00 00
      
      A number of QMI_DMS and QMI_NAS commands are also supported
      for optional device management.
      Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e7f558cc
    • Bjørn Mork's avatar
      net: qmi_wwan: Add Sierra Wireless device IDs · bf5ebae6
      Bjørn Mork authored
      commit 5e071b5d upstream.
      
      Some additional Gobi3K IDs found in the BSD/GPL licensed
      out-of-tree GobiNet driver from Sierra Wireless.
      Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bf5ebae6
    • Andrew Bird (Sphere Systems)'s avatar
      USB: qmi_wwan: Add ZTE (Vodafone) K3765-Z · 4bf00385
      Andrew Bird (Sphere Systems) authored
      commit 8965c98f upstream.
      
      Add the ZTE (Vodafone) K3765-Z to the whitelist. This requires the
      previous patch to make the whitelist with forced interface 4 generic
      or the device fails to initialise. After applying this patch and
      loading the Option driver without usb-modeswitch's bind all
      interfaces trick, a wwan0 net interface and /dev/cdc-wdm0 device
      file were created. Using Bjorn Mork's perl connection script a
      connection was made to a mobile network using QMI and the network
      interface's IPv4 address was configured OK.
      Signed-off-by: default avatarAndrew Bird <ajb@spheresystems.co.uk>
      Acked-by: default avatarBjørn Mork <bjorn@mork.no>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4bf00385
    • Bjørn Mork's avatar
    • Darren Hart's avatar
      pch_uart: Add eg20t_port lock field, avoid recursive spinlocks · 61df4452
      Darren Hart authored
      commit 2588aba0 upstream.
      
      pch_uart_interrupt() takes priv->port.lock which leads to two recursive
      spinlock calls if low_latency==1 or CONFIG_PREEMPT_RT_FULL=y (one
      otherwise):
      
      pch_uart_interrupt
        spin_lock_irqsave(priv->port.lock, flags)
        case PCH_UART_IID_RDR_TO (data ready)
        handle_rx_to
          push_rx
            tty_port_tty_get
              spin_lock_irqsave(&port->lock, flags) <--- already hold this lock
              ...
            tty_flip_buffer_push
              ...
              flush_to_ldisc
                spin_lock_irqsave(&tty->buf.lock)
                  spin_lock_irqsave(&tty->buf.lock)
                  disc->ops->receive_buf(tty, char_buf)
                    n_tty_receive_buf
                      tty->ops->flush_chars()
                      uart_flush_chars
                        uart_start
                          spin_lock_irqsave(&port->lock) <--- already hold this lock
      
      Avoid this by using a dedicated lock to protect the eg20t_port structure
      and IO access to its membase. This is more consistent with the 8250
      driver.  Ensure priv->lock is always take prior to priv->port.lock when
      taken at the same time.
      
      V2: Remove inadvertent whitespace change.
      V3: Account for oops_in_progress for the private lock in
          pch_console_write().
      
      Note: Like the 8250 driver, if a printk is introduced anywhere inside
            the pch_console_write() critical section, the kernel will hang
            on a recursive spinlock on the private lock. The oops case is
            handled by using a trylock in the oops_in_progress case.
      Signed-off-by: default avatarDarren Hart <dvhart@linux.intel.com>
      CC: Tomoya MORINAGA <tomoya.rohm@gmail.com>
      CC: Feng Tang <feng.tang@intel.com>
      CC: Alexander Stein <alexander.stein@systec-electronic.com>
      Acked-by: default avatarAlan Cox <alan@linux.intel.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      61df4452
    • Timur Tabi's avatar
      powerpc/85xx: p1022ds: fix DIU/LBC switching with NAND enabled · cb218409
      Timur Tabi authored
      commit 896c01cb upstream.
      
      In order for indirect mode on the PIXIS to work properly, both chip selects
      need to be set to GPCM mode, otherwise writes to the chip select base
      addresses will not actually post to the local bus -- they'll go to the
      NAND controller instead.  Therefore, we need to set BR0 and BR1 to GPCM
      mode before switching to indirect mode.
      Signed-off-by: default avatarTimur Tabi <timur@freescale.com>
      Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      cb218409
    • Timur Tabi's avatar
      powerpc/85xx: p1022ds: disable the NAND flash node if video is enabled · e85f60c9
      Timur Tabi authored
      commit 6269f258 upstream.
      
      The Freescale P1022 has a unique pin muxing "feature" where the DIU video
      controller's video signals are muxed with 24 of the local bus address signals.
      When the DIU is enabled, the bulk of the local bus is disabled, preventing
      access to memory-mapped devices like NAND flash and the pixis FPGA.
      
      Therefore, if the DIU is going to be enabled, then memory-mapped devices on
      the localbus, like NAND flash, need to be disabled.
      
      This patch is similar to "powerpc/85xx: p1022ds: disable the NOR flash node
      if video is enabled", except that it disables the NAND flash node instead.
      This PIXIS node needs to remain enabled because it is used by platform code
      to switch into indirect mode.
      Signed-off-by: default avatarTimur Tabi <timur@freescale.com>
      Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      
      e85f60c9
    • Tomoya MORINAGA's avatar
      pch_uart: Fix parity setting issue · 3dcb5363
      Tomoya MORINAGA authored
      commit 38bd2a1a upstream.
      
      Parity Setting value is reverse.
      E.G. In case of setting ODD parity, EVEN value is set.
      This patch inverts "if" condition.
      Signed-off-by: default avatarTomoya MORINAGA <tomoya.rohm@gmail.com>
      Acked-by: default avatarAlan Cox <alan@linux.intel.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3dcb5363
    • Tomoya MORINAGA's avatar
      pch_uart: Fix rx error interrupt setting issue · 439ec7b9
      Tomoya MORINAGA authored
      commit 9539dfb7 upstream.
      
      Rx Error interrupt(E.G. parity error) is not enabled.
      So, when parity error occurs, error interrupt is not occurred.
      As a result, the received data is not dropped.
      
      This patch adds enable/disable rx error interrupt code.
      Signed-off-by: default avatarTomoya MORINAGA <tomoya.rohm@gmail.com>
      Acked-by: default avatarAlan Cox <alan@linux.intel.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      439ec7b9
    • Alan Cox's avatar
      pch_uart: Fix missing break for 16 byte fifo · 17361b3e
      Alan Cox authored
      commit 9bc03743 upstream.
      
      Otherwise we fall back to the wrong value.
      
      Reported-by: <dcb314@hotmail.com>
      Resolves-bug: https://bugzilla.kernel.org/show_bug.cgi?id=44091Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
      Signed-off-by: default avatarTomoya MORINAGA <tomoya.rohm@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      17361b3e
    • Douglas Bagnall's avatar
      media: Avoid sysfs oops when an rc_dev's raw device is absent · a31c9971
      Douglas Bagnall authored
      commit 720bb643 upstream.
      
      For some reason, when the lirc daemon learns that a usb remote control
      has been unplugged, it wants to read the sysfs attributes of the
      disappearing device. This is useful for uncovering transient
      inconsistencies, but less so for keeping the system running when such
      inconsistencies exist.
      
      Under some circumstances (like every time I unplug my dvb stick from
      my laptop), lirc catches an rc_dev whose raw event handler has been
      removed (presumably by ir_raw_event_unregister), and proceeds to
      interrogate the raw protocols supported by the NULL pointer.
      
      This patch avoids the NULL dereference, and ignores the issue of how
      this state of affairs came about in the first place.
      
      Version 2 incorporates changes recommended by Mauro Carvalho Chehab
      (-ENODEV instead of -EINVAL, and a signed-off-by).
      Signed-off-by: default avatarDouglas Bagnall <douglas@paradise.net.nz>
      Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
      Cc: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a31c9971
    • John Stultz's avatar
      time: Move ktime_t overflow checking into timespec_valid_strict · 9a227fcb
      John Stultz authored
      commit cee58483 upstream
      
      Andreas Bombe reported that the added ktime_t overflow checking added to
      timespec_valid in commit 4e8b1452 ("time: Improve sanity checking of
      timekeeping inputs") was causing problems with X.org because it caused
      timeouts larger then KTIME_T to be invalid.
      
      Previously, these large timeouts would be clamped to KTIME_MAX and would
      never expire, which is valid.
      
      This patch splits the ktime_t overflow checking into a new
      timespec_valid_strict function, and converts the timekeeping codes
      internal checking to use this more strict function.
      Reported-and-tested-by: default avatarAndreas Bombe <aeb@debian.org>
      Cc: Zhouping Liu <zliu@redhat.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Prarit Bhargava <prarit@redhat.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9a227fcb
    • John Stultz's avatar
      time: Avoid making adjustments if we haven't accumulated anything · 80257cbe
      John Stultz authored
      commit bf2ac312 upstream.
      
      If update_wall_time() is called and the current offset isn't large
      enough to accumulate, avoid re-calling timekeeping_adjust which may
      change the clock freq and can cause 1ns inconsistencies with
      CLOCK_REALTIME_COARSE/CLOCK_MONOTONIC_COARSE.
      Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
      Cc: Prarit Bhargava <prarit@redhat.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Link: http://lkml.kernel.org/r/1345595449-34965-5-git-send-email-john.stultz@linaro.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      80257cbe
    • John Stultz's avatar
      time: Improve sanity checking of timekeeping inputs · 8e878154
      John Stultz authored
      commit 4e8b1452 upstream.
      
      Unexpected behavior could occur if the time is set to a value large
      enough to overflow a 64bit ktime_t (which is something larger then the
      year 2262).
      
      Also unexpected behavior could occur if large negative offsets are
      injected via adjtimex.
      
      So this patch improves the sanity check timekeeping inputs by
      improving the timespec_valid() check, and then makes better use of
      timespec_valid() to make sure we don't set the time to an invalid
      negative value or one that overflows ktime_t.
      
      Note: This does not protect from setting the time close to overflowing
      ktime_t and then letting natural accumulation cause the overflow.
      Reported-by: default avatarCAI Qian <caiqian@redhat.com>
      Reported-by: default avatarSasha Levin <levinsasha928@gmail.com>
      Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Prarit Bhargava <prarit@redhat.com>
      Cc: Zhouping Liu <zliu@redhat.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Link: http://lkml.kernel.org/r/1344454580-17031-1-git-send-email-john.stultz@linaro.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      8e878154
    • Jarod Wilson's avatar
      media: lirc_sir: make device registration work · 504471eb
      Jarod Wilson authored
      commit 4b71ca6b upstream.
      
      For one, the driver device pointer needs to be filled in, or the lirc core
      will refuse to load the driver. And we really need to wire up all the
      platform_device bits. This has been tested via the lirc sourceforge tree
      and verified to work, been sitting there for months, finally getting
      around to sending it. :\
      Signed-off-by: default avatarJarod Wilson <jarod@redhat.com>
      Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
      CC: Josh Boyer <jwboyer@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      504471eb
    • Yinghai Lu's avatar
      mm: sparse: fix usemap allocation above node descriptor section · 391c3149
      Yinghai Lu authored
      commit 99ab7b19 upstream.
      
      After commit f5bf18fa ("bootmem/sparsemem: remove limit constraint
      in alloc_bootmem_section"), usemap allocations may easily be placed
      outside the optimal section that holds the node descriptor, even if
      there is space available in that section.  This results in unnecessary
      hotplug dependencies that need to have the node unplugged before the
      section holding the usemap.
      
      The reason is that the bootmem allocator doesn't guarantee a linear
      search starting from the passed allocation goal but may start out at a
      much higher address absent an upper limit.
      
      Fix this by trying the allocation with the limit at the section end,
      then retry without if that fails.  This keeps the fix from f5bf18fa
      of not panicking if the allocation does not fit in the section, but
      still makes sure to try to stay within the section at first.
      
      [rewritten massively by Johannes to apply to 3.4]
      Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
      Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      391c3149
    • Peter Zijlstra's avatar
      sched: Fix race in task_group() · e194fab8
      Peter Zijlstra authored
      commit 8323f26c upstream.
      
      Stefan reported a crash on a kernel before a3e5d109 ("sched:
      Don't call task_group() too many times in set_task_rq()"), he
      found the reason to be that the multiple task_group()
      invocations in set_task_rq() returned different values.
      
      Looking at all that I found a lack of serialization and plain
      wrong comments.
      
      The below tries to fix it using an extra pointer which is
      updated under the appropriate scheduler locks. Its not pretty,
      but I can't really see another way given how all the cgroup
      stuff works.
      Reported-and-tested-by: default avatarStefan Bader <stefan.bader@canonical.com>
      Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
      Link: http://lkml.kernel.org/r/1340364965.18025.71.camel@twinsSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e194fab8
    • Francois Romieu's avatar
      r8169: RxConfig hack for the 8168evl. · 6418cc47
      Francois Romieu authored
      commit eb2dc35d upstream.
      
      The 8168evl (RTL_GIGA_MAC_VER_34) based Gigabyte GA-990FXA motherboards
      are very prone to NETDEV watchdog problems without this change. See
      https://bugzilla.kernel.org/show_bug.cgi?id=42899 for instance.
      
      I don't know why it *works*. It's depressingly effective though.
      
      For the record:
      - the problem may go along IOMMU (AMD-Vi) errors but it really looks
        like a red herring.
      - the patch sets the RX_MULTI_EN bit. If the 8168c doc is any guide,
        the chipset now fetches several Rx descriptors at a time.
      - long ago the driver ignored the RX_MULTI_EN bit.
        e542a226 changed the RxConfig
        settings. Whatever the problem it's now labeled a regression.
      - Realtek's own driver can identify two different 8168evl devices
        (CFG_METHOD_16 and CFG_METHOD_17) where the r8169 driver only
        sees one. It sucks.
      Signed-off-by: default avatarFrancois Romieu <romieu@fr.zoreil.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6418cc47
    • Daniel J Blueman's avatar
      libata: Prevent interface errors with Seagate FreeAgent GoFlex · 9dd30d19
      Daniel J Blueman authored
      commit c531077f upstream.
      
      When using my Seagate FreeAgent GoFlex eSATAp external disk enclosure,
      interface errors are always seen until 1.5Gbps is negotiated [1]. This
      occurs using any disk in the enclosure, and when the disk is connected
      directly with a generic passive eSATAp cable, we see stable 3Gbps
      operation as expected.
      
      Blacklist 3Gbps mode to avoid dataloss and the ~30s delay bus reset
      and renegotiation incurs.
      Signed-off-by: default avatarDaniel J Blueman <daniel@quora.org>
      Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9dd30d19
    • Weiping Pan's avatar
      rds: set correct msg_namelen · b2c1fcae
      Weiping Pan authored
      commit 06b6a1cf upstream.
      
      Jay Fenlason (fenlason@redhat.com) found a bug,
      that recvfrom() on an RDS socket can return the contents of random kernel
      memory to userspace if it was called with a address length larger than
      sizeof(struct sockaddr_in).
      rds_recvmsg() also fails to set the addr_len paramater properly before
      returning, but that's just a bug.
      There are also a number of cases wher recvfrom() can return an entirely bogus
      address. Anything in rds_recvmsg() that returns a non-negative value but does
      not go through the "sin = (struct sockaddr_in *)msg->msg_name;" code path
      at the end of the while(1) loop will return up to 128 bytes of kernel memory
      to userspace.
      
      And I write two test programs to reproduce this bug, you will see that in
      rds_server, fromAddr will be overwritten and the following sock_fd will be
      destroyed.
      Yes, it is the programmer's fault to set msg_namelen incorrectly, but it is
      better to make the kernel copy the real length of address to user space in
      such case.
      
      How to run the test programs ?
      I test them on 32bit x86 system, 3.5.0-rc7.
      
      1 compile
      gcc -o rds_client rds_client.c
      gcc -o rds_server rds_server.c
      
      2 run ./rds_server on one console
      
      3 run ./rds_client on another console
      
      4 you will see something like:
      server is waiting to receive data...
      old socket fd=3
      server received data from client:data from client
      msg.msg_namelen=32
      new socket fd=-1067277685
      sendmsg()
      : Bad file descriptor
      
      /***************** rds_client.c ********************/
      
      int main(void)
      {
      	int sock_fd;
      	struct sockaddr_in serverAddr;
      	struct sockaddr_in toAddr;
      	char recvBuffer[128] = "data from client";
      	struct msghdr msg;
      	struct iovec iov;
      
      	sock_fd = socket(AF_RDS, SOCK_SEQPACKET, 0);
      	if (sock_fd < 0) {
      		perror("create socket error\n");
      		exit(1);
      	}
      
      	memset(&serverAddr, 0, sizeof(serverAddr));
      	serverAddr.sin_family = AF_INET;
      	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
      	serverAddr.sin_port = htons(4001);
      
      	if (bind(sock_fd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
      		perror("bind() error\n");
      		close(sock_fd);
      		exit(1);
      	}
      
      	memset(&toAddr, 0, sizeof(toAddr));
      	toAddr.sin_family = AF_INET;
      	toAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
      	toAddr.sin_port = htons(4000);
      	msg.msg_name = &toAddr;
      	msg.msg_namelen = sizeof(toAddr);
      	msg.msg_iov = &iov;
      	msg.msg_iovlen = 1;
      	msg.msg_iov->iov_base = recvBuffer;
      	msg.msg_iov->iov_len = strlen(recvBuffer) + 1;
      	msg.msg_control = 0;
      	msg.msg_controllen = 0;
      	msg.msg_flags = 0;
      
      	if (sendmsg(sock_fd, &msg, 0) == -1) {
      		perror("sendto() error\n");
      		close(sock_fd);
      		exit(1);
      	}
      
      	printf("client send data:%s\n", recvBuffer);
      
      	memset(recvBuffer, '\0', 128);
      
      	msg.msg_name = &toAddr;
      	msg.msg_namelen = sizeof(toAddr);
      	msg.msg_iov = &iov;
      	msg.msg_iovlen = 1;
      	msg.msg_iov->iov_base = recvBuffer;
      	msg.msg_iov->iov_len = 128;
      	msg.msg_control = 0;
      	msg.msg_controllen = 0;
      	msg.msg_flags = 0;
      	if (recvmsg(sock_fd, &msg, 0) == -1) {
      		perror("recvmsg() error\n");
      		close(sock_fd);
      		exit(1);
      	}
      
      	printf("receive data from server:%s\n", recvBuffer);
      
      	close(sock_fd);
      
      	return 0;
      }
      
      /***************** rds_server.c ********************/
      
      int main(void)
      {
      	struct sockaddr_in fromAddr;
      	int sock_fd;
      	struct sockaddr_in serverAddr;
      	unsigned int addrLen;
      	char recvBuffer[128];
      	struct msghdr msg;
      	struct iovec iov;
      
      	sock_fd = socket(AF_RDS, SOCK_SEQPACKET, 0);
      	if(sock_fd < 0) {
      		perror("create socket error\n");
      		exit(0);
      	}
      
      	memset(&serverAddr, 0, sizeof(serverAddr));
      	serverAddr.sin_family = AF_INET;
      	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
      	serverAddr.sin_port = htons(4000);
      	if (bind(sock_fd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
      		perror("bind error\n");
      		close(sock_fd);
      		exit(1);
      	}
      
      	printf("server is waiting to receive data...\n");
      	msg.msg_name = &fromAddr;
      
      	/*
      	 * I add 16 to sizeof(fromAddr), ie 32,
      	 * and pay attention to the definition of fromAddr,
      	 * recvmsg() will overwrite sock_fd,
      	 * since kernel will copy 32 bytes to userspace.
      	 *
      	 * If you just use sizeof(fromAddr), it works fine.
      	 * */
      	msg.msg_namelen = sizeof(fromAddr) + 16;
      	/* msg.msg_namelen = sizeof(fromAddr); */
      	msg.msg_iov = &iov;
      	msg.msg_iovlen = 1;
      	msg.msg_iov->iov_base = recvBuffer;
      	msg.msg_iov->iov_len = 128;
      	msg.msg_control = 0;
      	msg.msg_controllen = 0;
      	msg.msg_flags = 0;
      
      	while (1) {
      		printf("old socket fd=%d\n", sock_fd);
      		if (recvmsg(sock_fd, &msg, 0) == -1) {
      			perror("recvmsg() error\n");
      			close(sock_fd);
      			exit(1);
      		}
      		printf("server received data from client:%s\n", recvBuffer);
      		printf("msg.msg_namelen=%d\n", msg.msg_namelen);
      		printf("new socket fd=%d\n", sock_fd);
      		strcat(recvBuffer, "--data from server");
      		if (sendmsg(sock_fd, &msg, 0) == -1) {
      			perror("sendmsg()\n");
      			close(sock_fd);
      			exit(1);
      		}
      	}
      
      	close(sock_fd);
      	return 0;
      }
      Signed-off-by: default avatarWeiping Pan <wpan@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b2c1fcae
    • Li Zhong's avatar
      Fix a dead loop in async_synchronize_full() · 11266a8e
      Li Zhong authored
      [Fixed upstream by commits 2955b47d and
      a4683487 from Dan Williams, but they are much
      more intrusive than this tiny fix, according to Andrew - gregkh]
      
      This patch tries to fix a dead loop in  async_synchronize_full(), which
      could be seen when preemption is disabled on a single cpu machine. 
      
      void async_synchronize_full(void)
      {
              do {
                      async_synchronize_cookie(next_cookie);
              } while (!list_empty(&async_running) || !
      list_empty(&async_pending));
      }
      
      async_synchronize_cookie() calls async_synchronize_cookie_domain() with
      &async_running as the default domain to synchronize. 
      
      However, there might be some works in the async_pending list from other
      domains. On a single cpu system, without preemption, there is no chance
      for the other works to finish, so async_synchronize_full() enters a dead
      loop. 
      
      It seems async_synchronize_full() wants to synchronize all entries in
      all running lists(domains), so maybe we could just check the entry_count
      to know whether all works are finished. 
      
      Currently, async_synchronize_cookie_domain() expects a non-NULL running
      list ( if NULL, there would be NULL pointer dereference ), so maybe a
      NULL pointer could be used as an indication for the functions to
      synchronize all works in all domains. 
      Reported-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Signed-off-by: default avatarLi Zhong <zhong@linux.vnet.ibm.com>
      Tested-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Tested-by: default avatarChristian Kujau <lists@nerdbynature.de>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Dan Williams <dan.j.williams@gmail.com>
      Cc: Christian Kujau <lists@nerdbynature.de>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Cong Wang <xiyou.wangcong@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      11266a8e