Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Jul 2019 16:34:32 +0000 (UTC)
From:      Johannes Lundberg <johalun@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r350083 - in stable/12/sys: compat/linuxkpi/common/include/linux sys
Message-ID:  <201907171634.x6HGYW1i093135@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: johalun
Date: Wed Jul 17 16:34:32 2019
New Revision: 350083
URL: https://svnweb.freebsd.org/changeset/base/350083

Log:
  MFC r349277:
  LinuxKPI: Additions to rcu list.
  
  - Add rcu list functions.
  - Make rcu hlist's foreach macro use rcu calls instead of the non-rcu macro.
  - Bump FreeBSD version so we have a checkpoint for the vboxvideo drm driver.
  
  Reviewed by:	hps
  Approved by:	imp (mentor), hps
  MFC after:	1 week
  Differential Revision:	D20719

Modified:
  stable/12/sys/compat/linuxkpi/common/include/linux/rculist.h
  stable/12/sys/sys/param.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/compat/linuxkpi/common/include/linux/rculist.h
==============================================================================
--- stable/12/sys/compat/linuxkpi/common/include/linux/rculist.h	Wed Jul 17 16:31:50 2019	(r350082)
+++ stable/12/sys/compat/linuxkpi/common/include/linux/rculist.h	Wed Jul 17 16:34:32 2019	(r350083)
@@ -33,6 +33,25 @@
 #include <linux/list.h>
 #include <linux/rcupdate.h>
 
+#define	list_entry_rcu(ptr, type, member) \
+	container_of(READ_ONCE(ptr), type, member)
+
+#define	list_next_rcu(head)	(*((struct list_head **)(&(head)->next)))
+
+#define	list_for_each_entry_rcu(pos, head, member) \
+	for (pos = list_entry_rcu((head)->next, typeof(*(pos)), member); \
+	     &(pos)->member != (head);					\
+	     pos = list_entry_rcu((pos)->member.next, typeof(*(pos)), member))
+
+static inline void
+list_add_rcu(struct list_head *new, struct list_head *prev)
+{
+	new->next = prev->next;
+	new->prev = prev;
+	rcu_assign_pointer(list_next_rcu(prev), new);
+	prev->prev = new;
+}
+
 #define	hlist_first_rcu(head)	(*((struct hlist_node **)(&(head)->first)))
 #define	hlist_next_rcu(node)	(*((struct hlist_node **)(&(node)->next)))
 #define	hlist_pprev_rcu(node)	(*((struct hlist_node **)((node)->pprev)))
@@ -47,8 +66,12 @@ hlist_add_behind_rcu(struct hlist_node *n, struct hlis
 		n->next->pprev = &n->next;
 }
 
-#define	hlist_for_each_entry_rcu(pos, head, member)	\
-	hlist_for_each_entry(pos, head, member)
+#define	hlist_for_each_entry_rcu(pos, head, member)			\
+	for (pos = hlist_entry_safe (rcu_dereference_raw(hlist_first_rcu(head)),\
+	        typeof(*(pos)), member);				\
+	     (pos);							\
+	     pos = hlist_entry_safe(rcu_dereference_raw(hlist_next_rcu(	\
+			&(pos)->member)), typeof(*(pos)), member))
 
 static inline void
 hlist_del_rcu(struct hlist_node *n)

Modified: stable/12/sys/sys/param.h
==============================================================================
--- stable/12/sys/sys/param.h	Wed Jul 17 16:31:50 2019	(r350082)
+++ stable/12/sys/sys/param.h	Wed Jul 17 16:34:32 2019	(r350083)
@@ -60,7 +60,7 @@
  *		in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1200513	/* Master, propagated to newvers */
+#define __FreeBSD_version 1200514	/* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201907171634.x6HGYW1i093135>