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);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to