Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c9468e9 authored by Jiri Kosina's avatar Jiri Kosina
Browse files

Merge branch 'master' into for-next

parents 4cb3ca7c c81eddb0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@ Description:
		match the driver to the device.  For example:
		# echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id

What:		/sys/bus/usb/device/.../avoid_reset
What:		/sys/bus/usb/device/.../avoid_reset_quirk
Date:		December 2009
Contact:	Oliver Neukum <oliver@neukum.org>
Description:
+13 −0
Original line number Diff line number Diff line
@@ -16,6 +16,15 @@
     </address>
    </affiliation>
   </author>
   <author>
    <firstname>William</firstname>
    <surname>Cohen</surname>
    <affiliation>
     <address>
      <email>wcohen@redhat.com</email>
     </address>
    </affiliation>
   </author>
  </authorgroup>

  <legalnotice>
@@ -91,4 +100,8 @@
!Iinclude/trace/events/signal.h
  </chapter>

  <chapter id="block">
   <title>Block IO</title>
!Iinclude/trace/events/block.h
  </chapter>
</book>
+22 −17
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ NMI handler.
		cpu = smp_processor_id();
		++nmi_count(cpu);

		if (!rcu_dereference(nmi_callback)(regs, cpu))
		if (!rcu_dereference_sched(nmi_callback)(regs, cpu))
			default_do_nmi(regs);

		nmi_exit();
@@ -47,12 +47,13 @@ function pointer. If this handler returns zero, do_nmi() invokes the
default_do_nmi() function to handle a machine-specific NMI.  Finally,
preemption is restored.

Strictly speaking, rcu_dereference() is not needed, since this code runs
only on i386, which does not need rcu_dereference() anyway.  However,
it is a good documentation aid, particularly for anyone attempting to
do something similar on Alpha.
In theory, rcu_dereference_sched() is not needed, since this code runs
only on i386, which in theory does not need rcu_dereference_sched()
anyway.  However, in practice it is a good documentation aid, particularly
for anyone attempting to do something similar on Alpha or on systems
with aggressive optimizing compilers.

Quick Quiz:  Why might the rcu_dereference() be necessary on Alpha,
Quick Quiz:  Why might the rcu_dereference_sched() be necessary on Alpha,
	     given that the code referenced by the pointer is read-only?


@@ -99,17 +100,21 @@ invoke irq_enter() and irq_exit() on NMI entry and exit, respectively.

Answer to Quick Quiz

	Why might the rcu_dereference() be necessary on Alpha, given
	Why might the rcu_dereference_sched() be necessary on Alpha, given
	that the code referenced by the pointer is read-only?

	Answer: The caller to set_nmi_callback() might well have
		initialized some data that is to be used by the
		new NMI handler.  In this case, the rcu_dereference()
		would be needed, because otherwise a CPU that received
		an NMI just after the new handler was set might see
		the pointer to the new NMI handler, but the old
		pre-initialized version of the handler's data.

		More important, the rcu_dereference() makes it clear
		to someone reading the code that the pointer is being
		protected by RCU.
		initialized some data that is to be used by the new NMI
		handler.  In this case, the rcu_dereference_sched() would
		be needed, because otherwise a CPU that received an NMI
		just after the new handler was set might see the pointer
		to the new NMI handler, but the old pre-initialized
		version of the handler's data.

		This same sad story can happen on other CPUs when using
		a compiler with aggressive pointer-value speculation
		optimizations.

		More important, the rcu_dereference_sched() makes it
		clear to someone reading the code that the pointer is
		being protected by RCU-sched.
+4 −3
Original line number Diff line number Diff line
@@ -260,7 +260,8 @@ over a rather long period of time, but improvements are always welcome!
	The reason that it is permissible to use RCU list-traversal
	primitives when the update-side lock is held is that doing so
	can be quite helpful in reducing code bloat when common code is
	shared between readers and updaters.
	shared between readers and updaters.  Additional primitives
	are provided for this case, as discussed in lockdep.txt.

10.	Conversely, if you are in an RCU read-side critical section,
	and you don't hold the appropriate update-side lock, you -must-
@@ -344,8 +345,8 @@ over a rather long period of time, but improvements are always welcome!
	requiring SRCU's read-side deadlock immunity or low read-side
	realtime latency.

	Note that, rcu_assign_pointer() and rcu_dereference() relate to
	SRCU just as they do to other forms of RCU.
	Note that, rcu_assign_pointer() relates to SRCU just as they do
	to other forms of RCU.

15.	The whole point of call_rcu(), synchronize_rcu(), and friends
	is to wait until all pre-existing readers have finished before
Loading