1. Jan 17, 2018
    • Petr Mladek's avatar
      printk: Hide console waiter logic into helpers · c162d5b4
      Petr Mladek authored
      The commit ("printk: Add console owner and waiter logic to load balance
      console writes") made vprintk_emit() and console_unlock() even more
      complicated.
      
      This patch extracts the new code into 3 helper functions. They should
      help to keep it rather self-contained. It will be easier to use and
      maintain.
      
      This patch just shuffles the existing code. It does not change
      the functionality.
      
      Link: http://lkml.kernel.org/r/20180112160837.GD24497@linux.suse
      
      
      Cc: akpm@linux-foundation.org
      Cc: linux-mm@kvack.org
      Cc: Cong Wang <xiyou.wangcong@gmail.com>
      Cc: Dave Hansen <dave.hansen@intel.com>
      Cc: Johannes Weiner <hannes@cmpxchg.org>
      Cc: Mel Gorman <mgorman@suse.de>
      Cc: Michal Hocko <mhocko@kernel.org>
      Cc: Vlastimil Babka <vbabka@suse.cz>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Jan Kara <jack@suse.cz>
      Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: rostedt@home.goodmis.org
      Cc: Byungchul Park <byungchul.park@lge.com>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Pavel Machek <pavel@ucw.cz>
      Cc: linux-kernel@vger.kernel.org
      Reviewed-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      Acked-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
      Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
      c162d5b4
    • Steven Rostedt (VMware)'s avatar
      printk: Add console owner and waiter logic to load balance console writes · dbdda842
      Steven Rostedt (VMware) authored
      This patch implements what I discussed in Kernel Summit. I added
      lockdep annotation (hopefully correctly), and it hasn't had any splats
      (since I fixed some bugs in the first iterations). It did catch
      problems when I had the owner covering too much. But now that the owner
      is only set when actively calling the consoles, lockdep has stayed
      quiet.
      
      Here's the design again:
      
      I added a "console_owner" which is set to a task that is actively
      writing to the consoles. It is *not* the same as the owner of the
      console_lock. It is only set when doing the calls to the console
      functions. It is protected by a console_owner_lock which is a raw spin
      lock.
      
      There is a console_waiter. This is set when there is an active console
      owner that is not current, and waiter is not set. This too is protected
      by console_owner_lock.
      
      In printk() when it tries to write to the consoles, we have:
      
      	if (console_trylock())
      		console_unlock();
      
      Now I added an else, which will check if there is an active owner, and
      no current waiter. If that is the case, then console_waiter is set, and
      the task goes into a spin until it is no longer set.
      
      When the active console owner finishes writing the current message to
      the consoles, it grabs the console_owner_lock and sees if there is a
      waiter, and clears console_owner.
      
      If there is a waiter, then it breaks out of the loop, clears the waiter
      flag (because that will release the waiter from its spin), and exits.
      Note, it does *not* release the console semaphore. Because it is a
      semaphore, there is no owner. Another task may release it. This means
      that the waiter is guaranteed to be the new console owner! Which it
      becomes.
      
      Then the waiter calls console_unlock() and continues to write to the
      consoles.
      
      If another task comes along and does a printk() it too can become the
      new waiter, and we wash rinse and repeat!
      
      By Petr Mladek about possible new deadlocks:
      
      The thing is that we move console_sem only to printk() call
      that normally calls console_unlock() as well. It means that
      the transferred owner should not bring new type of dependencies.
      As Steven said somewhere: "If there is a deadlock, it was
      there even before."
      
      We could look at it from this side. The possible deadlock would
      look like:
      
      CPU0                            CPU1
      
      console_unlock()
      
        console_owner = current;
      
      				spin_lockA()
      				  printk()
      				    spin = true;
      				    while (...)
      
          call_console_drivers()
            spin_lockA()
      
      This would be a deadlock. CPU0 would wait for the lock A.
      While CPU1 would own the lockA and would wait for CPU0
      to finish calling the console drivers and pass the console_sem
      owner.
      
      But if the above is true than the following scenario was
      already possible before:
      
      CPU0
      
      spin_lockA()
        printk()
          console_unlock()
            call_console_drivers()
      	spin_lockA()
      
      By other words, this deadlock was there even before. Such
      deadlocks are prevented by using printk_deferred() in
      the sections guarded by the lock A.
      
      By Steven Rostedt:
      
      To demonstrate the issue, this module has been shown to lock up a
      system with 4 CPUs and a slow console (like a serial console). It is
      also able to lock up a 8 CPU system with only a fast (VGA) console, by
      passing in "loops=100". The changes in this commit prevent this module
      from locking up the system.
      
       #include <linux/module.h>
       #include <linux/delay.h>
       #include <linux/sched.h>
       #include <linux/mutex.h>
       #include <linux/workqueue.h>
       #include <linux/hrtimer.h>
      
       static bool stop_testing;
       static unsigned int loops = 1;
      
       static void preempt_printk_workfn(struct work_struct *work)
       {
       	int i;
      
       	while (!READ_ONCE(stop_testing)) {
       		for (i = 0; i < loops && !READ_ONCE(stop_testing); i++) {
       			preempt_disable();
       			pr_emerg("%5d%-75s\n", smp_processor_id(),
       				 " XXX NOPREEMPT");
       			preempt_enable();
       		}
       		msleep(1);
       	}
       }
      
       static struct work_struct __percpu *works;
      
       static void finish(void)
       {
       	int cpu;
      
       	WRITE_ONCE(stop_testing, true);
       	for_each_online_cpu(cpu)
       		flush_work(per_cpu_ptr(works, cpu));
       	free_percpu(works);
       }
      
       static int __init test_init(void)
       {
       	int cpu;
      
       	works = alloc_percpu(struct work_struct);
       	if (!works)
       		return -ENOMEM;
      
       	/*
       	 * This is just a test module. This will break if you
       	 * do any CPU hot plugging between loading and
       	 * unloading the module.
       	 */
      
       	for_each_online_cpu(cpu) {
       		struct work_struct *work = per_cpu_ptr(works, cpu);
      
       		INIT_WORK(work, &preempt_printk_workfn);
       		schedule_work_on(cpu, work);
       	}
      
       	return 0;
       }
      
       static void __exit test_exit(void)
       {
       	finish();
       }
      
       module_param(loops, uint, 0);
       module_init(test_init);
       module_exit(test_exit);
       MODULE_LICENSE("GPL");
      
      Link: http://lkml.kernel.org/r/20180110132418.7080-2-pmladek@suse.com
      
      
      Cc: akpm@linux-foundation.org
      Cc: linux-mm@kvack.org
      Cc: Cong Wang <xiyou.wangcong@gmail.com>
      Cc: Dave Hansen <dave.hansen@intel.com>
      Cc: Johannes Weiner <hannes@cmpxchg.org>
      Cc: Mel Gorman <mgorman@suse.de>
      Cc: Michal Hocko <mhocko@kernel.org>
      Cc: Vlastimil Babka <vbabka@suse.cz>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Jan Kara <jack@suse.cz>
      Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: Byungchul Park <byungchul.park@lge.com>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Pavel Machek <pavel@ucw.cz>
      Cc: linux-kernel@vger.kernel.org
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      [pmladek@suse.com: Commit message about possible deadlocks]
      Acked-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
      Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
      dbdda842
  2. Nov 21, 2017
  3. Nov 20, 2017
    • Linus Torvalds's avatar
      Merge tag 'ntb-4.15' of git://github.com/jonmason/ntb · c8a0739b
      Linus Torvalds authored
      Pull ntb updates from Jon Mason:
       "Support for the switchtec ntb and related changes. Also, a couple of
        bug fixes"
      
      [ The timing isn't great. I had asked people to send me pull requests
        before my family vacation, and this code has not even been in
        linux-next as far as I can tell. But Logan Gunthorpe pleaded for its
        inclusion because the Switchtec driver has apparently been around for
        a while, just never in linux-next - Linus ]
      
      * tag 'ntb-4.15' of git://github.com/jonmason/ntb:
        ntb: intel: remove b2b memory window workaround for Skylake NTB
        NTB: make idt_89hpes_cfg const
        NTB: switchtec_ntb: Update switchtec documentation with notes for NTB
        NTB: switchtec_ntb: Add memory window support
        NTB: switchtec_ntb: Implement scratchpad registers
        NTB: switchtec_ntb: Implement doorbell registers
        NTB: switchtec_ntb: Add link management
        NTB: switchtec_ntb: Add skeleton NTB driver
        NTB: switchtec_ntb: Initialize hardware for doorbells and messages
        NTB: switchtec_ntb: Initialize hardware for memory windows
        NTB: switchtec_ntb: Introduce initial NTB driver
        NTB: Add check and comment for link up to mw_count() and mw_get_align()
        NTB: Ensure ntb_mw_get_align() is only called when the link is up
        NTB: switchtec: Add link event notifier callback
        NTB: switchtec: Add NTB hardware register definitions
        NTB: switchtec: Export class symbol for use in upper layer driver
        NTB: switchtec: Move structure definitions into a common header
        ntb: update maintainer list for Intel NTB driver
      c8a0739b
    • Roberto Sassu's avatar
      ima: do not update security.ima if appraisal status is not INTEGRITY_PASS · 020aae3e
      Roberto Sassu authored
      Commit b65a9cfc
      
       ("Untangling ima mess, part 2: deal with counters")
      moved the call of ima_file_check() from may_open() to do_filp_open() at a
      point where the file descriptor is already opened.
      
      This breaks the assumption made by IMA that file descriptors being closed
      belong to files whose access was granted by ima_file_check(). The
      consequence is that security.ima and security.evm are updated with good
      values, regardless of the current appraisal status.
      
      For example, if a file does not have security.ima, IMA will create it after
      opening the file for writing, even if access is denied. Access to the file
      will be allowed afterwards.
      
      Avoid this issue by checking the appraisal status before updating
      security.ima.
      
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarRoberto Sassu <roberto.sassu@huawei.com>
      Signed-off-by: default avatarMimi Zohar <zohar@linux.vnet.ibm.com>
      Signed-off-by: default avatarJames Morris <james.l.morris@oracle.com>
      020aae3e
    • Linus Torvalds's avatar
      Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide · ed30b147
      Linus Torvalds authored
      Pull small IDE cleanup from David Miller.
      
      * git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide:
        PNP: ide: constify pnp_device_id
      ed30b147
  4. Nov 19, 2017
  5. Nov 18, 2017
    • Linus Torvalds's avatar
      Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc · 1deab8ce
      Linus Torvalds authored
      Pull sparc updates from David Miller:
      
       1) Add missing cmpxchg64() for 32-bit sparc.
      
       2) Timer conversions from Allen Pais and Kees Cook.
      
       3) vDSO support, from Nagarathnam Muthusamy.
      
       4) Fix sparc64 huge page table walks based upon bug report by Al Viro,
          from Nitin Gupta.
      
       5) Optimized fls() for T4 and above, from Vijay Kumar.
      
      * git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
        sparc64: Fix page table walk for PUD hugepages
        sparc64: Convert timers to user timer_setup()
        sparc64: convert mdesc_handle.refcnt from atomic_t to refcount_t
        sparc/led: Convert timers to use timer_setup()
        sparc64: Use sparc optimized fls and __fls for T4 and above
        sparc64: SPARC optimized __fls function
        sparc64: SPARC optimized fls function
        sparc64: Define SPARC default __fls function
        sparc64: Define SPARC default fls function
        vDSO for sparc
        sparc32: Add cmpxchg64().
        sbus: char: Move D7S_MINOR to include/linux/miscdevice.h
        sparc: time: Remove unneeded linux/miscdevice.h include
        sparc64: mmu_context: Add missing include files
      1deab8ce
    • Linus Torvalds's avatar
      Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net · 81700247
      Linus Torvalds authored
      Pull networking fixes from David Miller:
      
       1) Revert regression inducing change to the IPSEC template resolver,
          from Steffen Klassert.
      
       2) Peeloffs can cause the wrong sk to be waken up in SCTP, fix from Xin
          Long.
      
       3) Min packet MTU size is wrong in cpsw driver, from Grygorii Strashko.
      
       4) Fix build failure in netfilter ctnetlink, from Arnd Bergmann.
      
       5) ISDN hisax driver checks pnp_irq() for errors incorrectly, from
          Arvind Yadav.
      
       6) Fix fealnx driver build failure on MIPS, from Huacai Chen.
      
       7) Fix into leak in SCTP, the scope_id of socket addresses is not
          always filled in. From Eric W. Biederman.
      
       8) MTU inheritance between physical function and representor fix in nfp
          driver, from Dirk van der Merwe.
      
       9) Fix memory leak in rsi driver, from Colin Ian King.
      
      10) Fix expiration and generation ID handling of cached ipv4 redirect
          routes, from Xin Long.
      
      * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (40 commits)
        net: usb: hso.c: remove unneeded DRIVER_LICENSE #define
        ibmvnic: fix dma_mapping_error call
        ipvlan: NULL pointer dereference panic in ipvlan_port_destroy
        route: also update fnhe_genid when updating a route cache
        route: update fnhe_expires for redirect when the fnhe exists
        sctp: set frag_point in sctp_setsockopt_maxseg correctly
        rsi: fix memory leak on buf and usb_reg_buf
        net/netlabel: Add list_next_rcu() in rcu_dereference().
        nfp: remove false positive offloads in flower vxlan
        nfp: register flower reprs for egress dev offload
        nfp: inherit the max_mtu from the PF netdev
        nfp: fix vlan receive MAC statistics typo
        nfp: fix flower offload metadata flag usage
        virto_net: remove empty file 'virtio_net.'
        net/sctp: Always set scope_id in sctp_inet6_skb_msgname
        fealnx: Fix building error on MIPS
        isdn: hisax: Fix pnp_irq's error checking for setup_teles3
        isdn: hisax: Fix pnp_irq's error checking for setup_sedlbauer_isapnp
        isdn: hisax: Fix pnp_irq's error checking for setup_niccy
        isdn: hisax: Fix pnp_irq's error checking for setup_ix1micro
        ...
      81700247
    • Linus Torvalds's avatar
      Merge tag 'hwlock-v4.15' of git://github.com/andersson/remoteproc · 27eabfaa
      Linus Torvalds authored
      Pull hwspinlock update from Bjorn Andersson:
       "This changes the HWSPINLOCK core Kconfig option to bool, to aid when
        other core code depends on it"
      
      * tag 'hwlock-v4.15' of git://github.com/andersson/remoteproc:
        hwspinlock: Change hwspinlock to a bool
      27eabfaa
    • Linus Torvalds's avatar
      Merge tag 'rproc-v4.15' of git://github.com/andersson/remoteproc · 4f88bd23
      Linus Torvalds authored
      Pull remoteproc updates from Bjorn Andersson:
       "This adds an interface for configuring Qualcomm's "secure SMMU" and
        adds support for booting the modem Hexagon on MSM8996.
      
        Two new debugfs entries are added in the remoteproc core to introspect
        the list of memory carveouts and the loaded resource table"
      
      * tag 'rproc-v4.15' of git://github.com/andersson/remoteproc:
        remoteproc: qcom: Fix error handling paths in order to avoid memory leaks
        remoteproc: qcom: Drop pr_err in q6v5_xfer_mem_ownership()
        remoteproc: debug: add carveouts list dump feature
        remoteproc: debug: add resource table dump feature
        remoteproc: qcom: Add support for mss remoteproc on msm8996
        remoteproc: qcom: Make secure world call for mem ownership switch
        remoteproc: qcom: refactor mss fw image loading sequence
        firmware: scm: Add new SCM call API for switching memory ownership
      4f88bd23
    • Linus Torvalds's avatar
      Merge tag 'rpmsg-v4.15' of git://github.com/andersson/remoteproc · bedf5719
      Linus Torvalds authored
      Pull rpmsg updates from Bjorn Andersson:
      
       - turn RPMSG_VIRTIO into a user selectable config
      
       - fix few bugs in GLINK
      
       - provide the support for specifying initial buffer sizes for GLINK
         channels.
      
      * tag 'rpmsg-v4.15' of git://github.com/andersson/remoteproc:
        rpmsg: glink: The mbox client knows_txdone
        rpmsg: glink: Add missing MODULE_LICENSE
        rpmsg: glink: Use best fit intent during tx
        rpmsg: glink: Add support to preallocate intents
        dt-bindings: soc: qcom: Support GLINK intents
        rpmsg: glink: Initialize the "intent_req_comp" completion variable
        rpmsg: Allow RPMSG_VIRTIO to be enabled via menuconfig or defconfig
      bedf5719
    • Linus Torvalds's avatar
      Merge tag 'hwmon-for-linus-v4.15-take2' of... · d9ef1ccf
      Linus Torvalds authored
      Merge tag 'hwmon-for-linus-v4.15-take2' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
      
      Pull more hwmon updates/fixes from Guenter Roeck:
      
       - minor bug fix in k10temp driver
      
       - take advantage of added NULL check in i2c_unregister_device()
      
      * tag 'hwmon-for-linus-v4.15-take2' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
        hwmon: (w83793) Remove duplicate NULL check
        hwmon: (w83792d) Remove duplicate NULL check
        hwmon: (w83791d) Remove duplicate NULL check
        hwmon: (w83781d) Remove duplicate NULL check
        hwmon: (k10temp) Correct model name for Ryzen 1600X
      d9ef1ccf