svn commit: r364672 - in stable/12/sys/compat/linuxkpi/common: include/linux src

Emmanuel Vadot manu at FreeBSD.org
Mon Aug 24 13:14:40 UTC 2020


Author: manu
Date: Mon Aug 24 13:14:38 2020
New Revision: 364672
URL: https://svnweb.freebsd.org/changeset/base/364672

Log:
  MFC r361450, r361452, r361550-r361551
  
  r361450:
  linuxkpi: Add refcount.h
  
  Implement some refcount functions needed by drm.
  Just use the atomic_t struct and functions from linuxkpi for simplicity.
  
  Sponsored-by: The FreeBSD Foundation
  
  Reviewed by:	hselsasky
  Differential Revision:	https://reviews.freebsd.org/D24985
  
  r361452:
  linuxkpi: Fix mod_timer and del_timer_sync
  
  mod_timer is supposed to return 1 if the modified timer was pending, which
  is exactly what callout_reset does so return the value after checking
  that it's a correct one in case the api change.
  del_timer_sync returns int so add a function and handle that.
  
  Reviewed by:	hselasky
  Differential Revision:	https://reviews.freebsd.org/D24983
  
  r361550:
  linuxkpi: Add rcu_swap_protected
  
  This macros swap an rcu pointer with a normal pointer.
  The condition only seems to be used for debug/warning under linux, ignore
  for now.
  
  Sponsored-by: The FreeBSD Foundation
  Reviewed by:	hselasky
  Differential Revision:	https://reviews.freebsd.org/D24954
  
  r361551:
  linuxkpi: Add kstrtou16
  
  This function convert a char * to a u16.
  Simply use strtoul and cast to compare for ERANGE
  
  Sponsored-by: The FreeBSD Foundation
  Reviewed by:	hselasky
  Differential Revision:	https://reviews.freebsd.org/D24996

Added:
  stable/12/sys/compat/linuxkpi/common/include/linux/refcount.h
     - copied unchanged from r361450, head/sys/compat/linuxkpi/common/include/linux/refcount.h
Modified:
  stable/12/sys/compat/linuxkpi/common/include/linux/kernel.h
  stable/12/sys/compat/linuxkpi/common/include/linux/rcupdate.h
  stable/12/sys/compat/linuxkpi/common/include/linux/timer.h
  stable/12/sys/compat/linuxkpi/common/src/linux_compat.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/compat/linuxkpi/common/include/linux/kernel.h
==============================================================================
--- stable/12/sys/compat/linuxkpi/common/include/linux/kernel.h	Mon Aug 24 12:59:55 2020	(r364671)
+++ stable/12/sys/compat/linuxkpi/common/include/linux/kernel.h	Mon Aug 24 13:14:38 2020	(r364672)
@@ -377,6 +377,24 @@ kstrtouint(const char *cp, unsigned int base, unsigned
 }
 
 static inline int
+kstrtou16(const char *cp, unsigned int base, u16 *res)
+{
+	char *end;
+	unsigned long temp;
+
+	*res = temp = strtoul(cp, &end, base);
+
+	/* skip newline character, if any */
+	if (*end == '\n')
+		end++;
+	if (*cp == 0 || *end != 0)
+		return (-EINVAL);
+	if (temp != (u16)temp)
+		return (-ERANGE);
+	return (0);
+}
+
+static inline int
 kstrtou32(const char *cp, unsigned int base, u32 *res)
 {
 	char *end;

Modified: stable/12/sys/compat/linuxkpi/common/include/linux/rcupdate.h
==============================================================================
--- stable/12/sys/compat/linuxkpi/common/include/linux/rcupdate.h	Mon Aug 24 12:59:55 2020	(r364671)
+++ stable/12/sys/compat/linuxkpi/common/include/linux/rcupdate.h	Mon Aug 24 13:14:38 2020	(r364672)
@@ -97,6 +97,12 @@
 	    (uintptr_t)(v));					\
 } while (0)
 
+#define	rcu_swap_protected(rcu, ptr, c) do {			\
+	typeof(ptr) p = rcu_dereference_protected(rcu, c);	\
+	rcu_assign_pointer(rcu, ptr);				\
+	(ptr) = p;						\
+} while (0)
+
 /* prototypes */
 
 extern void linux_call_rcu(unsigned type, struct rcu_head *ptr, rcu_callback_t func);

Copied: stable/12/sys/compat/linuxkpi/common/include/linux/refcount.h (from r361450, head/sys/compat/linuxkpi/common/include/linux/refcount.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/sys/compat/linuxkpi/common/include/linux/refcount.h	Mon Aug 24 13:14:38 2020	(r364672, copy of r361450, head/sys/compat/linuxkpi/common/include/linux/refcount.h)
@@ -0,0 +1,82 @@
+/*-
+ * Copyright (c) 2020 The FreeBSD Foundation
+ *
+ * This software was developed by Emmanuel Vadot under sponsorship
+ * from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _LINUX_REFCOUNT_H
+#define _LINUX_REFCOUNT_H
+
+#include <linux/atomic.h>
+
+struct refcount_linux {
+	atomic_t value;
+};
+typedef struct refcount_linux refcount_t;
+
+static inline void
+refcount_set(refcount_t *ref, unsigned int i)
+{
+	atomic_set(&ref->value, i);
+}
+
+static inline void
+refcount_inc(refcount_t *ref)
+{
+	atomic_inc(&ref->value);
+}
+
+static inline bool
+refcount_inc_not_zero(refcount_t *ref)
+{
+	return (atomic_inc_not_zero(&ref->value));
+}
+
+static inline void
+refcount_dec(refcount_t *ref)
+{
+	atomic_dec(&ref->value);
+}
+
+static inline unsigned int
+refcount_read(refcount_t *ref)
+{
+	return atomic_read(&ref->value);
+}
+
+static inline bool
+refcount_dec_and_lock_irqsave(refcount_t *ref, spinlock_t *lock,
+    unsigned long *flags)
+{
+	if (atomic_dec_and_test(&ref->value) == true) {
+		spin_lock_irqsave(lock, flags);
+		return (true);
+	}
+	return (false);
+}
+
+#endif /* __LINUX_REFCOUNT_H__ */

Modified: stable/12/sys/compat/linuxkpi/common/include/linux/timer.h
==============================================================================
--- stable/12/sys/compat/linuxkpi/common/include/linux/timer.h	Mon Aug 24 12:59:55 2020	(r364671)
+++ stable/12/sys/compat/linuxkpi/common/include/linux/timer.h	Mon Aug 24 13:14:38 2020	(r364672)
@@ -78,12 +78,12 @@ extern unsigned long linux_timer_hz_mask;
 	callout_init(&(timer)->callout, 1);			\
 } while (0)
 
-extern void mod_timer(struct timer_list *, int);
+extern int mod_timer(struct timer_list *, int);
 extern void add_timer(struct timer_list *);
 extern void add_timer_on(struct timer_list *, int cpu);
 extern int del_timer(struct timer_list *);
+extern int del_timer_sync(struct timer_list *);
 
-#define	del_timer_sync(timer)	(void)callout_drain(&(timer)->callout)
 #define	timer_pending(timer)	callout_pending(&(timer)->callout)
 #define	round_jiffies(j)	\
 	((int)(((j) + linux_timer_hz_mask) & ~linux_timer_hz_mask))

Modified: stable/12/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- stable/12/sys/compat/linuxkpi/common/src/linux_compat.c	Mon Aug 24 12:59:55 2020	(r364671)
+++ stable/12/sys/compat/linuxkpi/common/src/linux_compat.c	Mon Aug 24 13:14:38 2020	(r364672)
@@ -1903,14 +1903,19 @@ linux_timer_callback_wrapper(void *context)
 	timer->function(timer->data);
 }
 
-void
+int
 mod_timer(struct timer_list *timer, int expires)
 {
+	int ret;
 
 	timer->expires = expires;
-	callout_reset(&timer->callout,
+	ret = callout_reset(&timer->callout,
 	    linux_timer_jiffies_until(expires),
 	    &linux_timer_callback_wrapper, timer);
+
+	MPASS(ret == 0 || ret == 1);
+
+	return (ret == 1);
 }
 
 void
@@ -1936,6 +1941,15 @@ del_timer(struct timer_list *timer)
 {
 
 	if (callout_stop(&(timer)->callout) == -1)
+		return (0);
+	return (1);
+}
+
+int
+del_timer_sync(struct timer_list *timer)
+{
+
+	if (callout_drain(&(timer)->callout) == -1)
 		return (0);
 	return (1);
 }


More information about the svn-src-stable-12 mailing list