linux-next.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* linux-next: manual merge of the driver-core tree with the tip tree
@ 2011-12-28  4:57 Stephen Rothwell
  2012-01-04 22:52 ` Greg KH
  0 siblings, 1 reply; 19+ messages in thread
From: Stephen Rothwell @ 2011-12-28  4:57 UTC (permalink / raw)
  To: Greg KH
  Cc: linux-next, linux-kernel, Josh Triplett, Paul E. McKenney,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Peter Zijlstra,
	Kay Sievers

[-- Attachment #1: Type: text/plain, Size: 1705 bytes --]

Hi Greg,

Today's linux-next merge of the driver-core tree got a conflict in
include/linux/cpu.h between commit 2987557f52b9 ("driver-core/cpu: Expose
hotpluggability to the rest of the kernel") from the tip tree and commit
8a25a2fd126c ("cpu: convert 'cpu' and 'machinecheck' sysdev_class to a
regular subsystem") from the driver-core tree.

Just context changes.  I fixed it up (see below) and can carry the fix as
necessary
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

diff --cc include/linux/cpu.h
index 305c263,fc3da0d..0000000
--- a/include/linux/cpu.h
+++ b/include/linux/cpu.h
@@@ -26,16 -26,15 +26,16 @@@ struct cpu 
  };
  
  extern int register_cpu(struct cpu *cpu, int num);
- extern struct sys_device *get_cpu_sysdev(unsigned cpu);
+ extern struct device *get_cpu_device(unsigned cpu);
 +extern bool cpu_is_hotpluggable(unsigned cpu);
  
- extern int cpu_add_sysdev_attr(struct sysdev_attribute *attr);
- extern void cpu_remove_sysdev_attr(struct sysdev_attribute *attr);
+ extern int cpu_add_dev_attr(struct device_attribute *attr);
+ extern void cpu_remove_dev_attr(struct device_attribute *attr);
  
- extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs);
- extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs);
+ extern int cpu_add_dev_attr_group(struct attribute_group *attrs);
+ extern void cpu_remove_dev_attr_group(struct attribute_group *attrs);
  
- extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls);
+ extern int sched_create_sysfs_power_savings_entries(struct device *dev);
  
  #ifdef CONFIG_HOTPLUG_CPU
  extern void unregister_cpu(struct cpu *cpu);

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2011-12-28  4:57 Stephen Rothwell
@ 2012-01-04 22:52 ` Greg KH
  0 siblings, 0 replies; 19+ messages in thread
From: Greg KH @ 2012-01-04 22:52 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: linux-next, linux-kernel, Josh Triplett, Paul E. McKenney,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Peter Zijlstra,
	Kay Sievers

On Wed, Dec 28, 2011 at 03:57:07PM +1100, Stephen Rothwell wrote:
> Hi Greg,
> 
> Today's linux-next merge of the driver-core tree got a conflict in
> include/linux/cpu.h between commit 2987557f52b9 ("driver-core/cpu: Expose
> hotpluggability to the rest of the kernel") from the tip tree and commit
> 8a25a2fd126c ("cpu: convert 'cpu' and 'machinecheck' sysdev_class to a
> regular subsystem") from the driver-core tree.
> 
> Just context changes.  I fixed it up (see below) and can carry the fix as
> necessary

Looks fine, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* linux-next: manual merge of the driver-core tree with the tip tree
@ 2012-11-29  4:24 Stephen Rothwell
  2012-11-29  5:19 ` Greg KH
  0 siblings, 1 reply; 19+ messages in thread
From: Stephen Rothwell @ 2012-11-29  4:24 UTC (permalink / raw)
  To: Greg KH
  Cc: linux-next, linux-kernel, Bill Pemberton, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, Peter Zijlstra

[-- Attachment #1: Type: text/plain, Size: 1060 bytes --]

Hi Greg,

Today's linux-next merge of the driver-core tree got a conflict in
lib/Makefile between commit e6459606b04e ("lib: Add early cpio decoder")
from the tip tree and commit 610141ee651c ("lib: kobject_uevent is no
longer dependant on CONFIG_HOTPLUG") from the driver-core tree.

I fixed it up (see below) and can carry the fix as necessary (no action
is required).

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

diff --cc lib/Makefile
index e91b9df,66787b9..0000000
--- a/lib/Makefile
+++ b/lib/Makefile
@@@ -12,7 -12,7 +12,7 @@@ lib-y := ctype.o string.o vsprintf.o cm
  	 idr.o int_sqrt.o extable.o \
  	 sha1.o md5.o irq_regs.o reciprocal_div.o argv_split.o \
  	 proportions.o flex_proportions.o prio_heap.o ratelimit.o show_mem.o \
- 	 is_single_threaded.o plist.o decompress.o earlycpio.o
 -	 is_single_threaded.o plist.o decompress.o kobject_uevent.o
++	 is_single_threaded.o plist.o decompress.o earlycpio.o kobject_uevent.o
  
  lib-$(CONFIG_MMU) += ioremap.o
  lib-$(CONFIG_SMP) += cpumask.o

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2012-11-29  4:24 Stephen Rothwell
@ 2012-11-29  5:19 ` Greg KH
  0 siblings, 0 replies; 19+ messages in thread
From: Greg KH @ 2012-11-29  5:19 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: linux-next, linux-kernel, Bill Pemberton, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, Peter Zijlstra

On Thu, Nov 29, 2012 at 03:24:11PM +1100, Stephen Rothwell wrote:
> Hi Greg,
> 
> Today's linux-next merge of the driver-core tree got a conflict in
> lib/Makefile between commit e6459606b04e ("lib: Add early cpio decoder")
> from the tip tree and commit 610141ee651c ("lib: kobject_uevent is no
> longer dependant on CONFIG_HOTPLUG") from the driver-core tree.
> 
> I fixed it up (see below) and can carry the fix as necessary (no action
> is required).

Looks good, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* linux-next: manual merge of the driver-core tree with the tip tree
@ 2013-04-11  5:30 Stephen Rothwell
  2013-04-11 13:26 ` Greg KH
  0 siblings, 1 reply; 19+ messages in thread
From: Stephen Rothwell @ 2013-04-11  5:30 UTC (permalink / raw)
  To: Greg KH
  Cc: linux-next, linux-kernel, Sasha Levin, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, Peter Zijlstra

[-- Attachment #1: Type: text/plain, Size: 510 bytes --]

Hi Greg,

Today's linux-next merge of the driver-core tree got a conflict in
kernel/rtmutex-tester.c between commit 8184004ed7a0
("locking/rtmutex/tester: Set correct permissions on sysfs files") from
the tip tree and commit 928c0c1571b0 ("rtmutex-tester: fix mode of sysfs
files") from the driver-core tree.

Both patches do the same thing - I used the tip version and can carry the
fix as necessary (no action is required).

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2013-04-11  5:30 Stephen Rothwell
@ 2013-04-11 13:26 ` Greg KH
  0 siblings, 0 replies; 19+ messages in thread
From: Greg KH @ 2013-04-11 13:26 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: linux-next, linux-kernel, Sasha Levin, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, Peter Zijlstra

On Thu, Apr 11, 2013 at 03:30:23PM +1000, Stephen Rothwell wrote:
> Hi Greg,
> 
> Today's linux-next merge of the driver-core tree got a conflict in
> kernel/rtmutex-tester.c between commit 8184004ed7a0
> ("locking/rtmutex/tester: Set correct permissions on sysfs files") from
> the tip tree and commit 928c0c1571b0 ("rtmutex-tester: fix mode of sysfs
> files") from the driver-core tree.
> 
> Both patches do the same thing - I used the tip version and can carry the
> fix as necessary (no action is required).

Thanks for the heads up.

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* linux-next: manual merge of the driver-core tree with the tip tree
@ 2014-03-13  0:07 Mark Brown
  0 siblings, 0 replies; 19+ messages in thread
From: Mark Brown @ 2014-03-13  0:07 UTC (permalink / raw)
  To: Greg KH, AKASHI Takahiro, Ard Biesheuvel; +Cc: linux-next, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 816 bytes --]

Hi Greg,

Today's linux-next merge of the driver-core tree got a conflict in arch/x86/Kconfig between commit b4df597ae51f ("audit: Add CONFIG_HAVE_ARCH_AUDITSYSCALL") from the tip tree and commit 2b9c1f03278 ("x86: align x86 arch with generic CPU modalias handling") from the driver-core tree.

I fixed it up (see below) and can carry the fix as necessary (no action
is required).

diff --cc arch/x86/Kconfig
index 81f8485bb6b7,7fab7e0b1a72..000000000000
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@@ -127,7 -127,7 +127,8 @@@ config X8
        select HAVE_DEBUG_STACKOVERFLOW
        select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64
        select HAVE_CC_STACKPROTECTOR
 +      select HAVE_ARCH_AUDITSYSCALL
+       select GENERIC_CPU_AUTOPROBE
  
  config INSTRUCTION_DECODER
        def_bool y

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* linux-next: manual merge of the driver-core tree with the tip tree
@ 2014-07-31  7:07 Stephen Rothwell
  2014-08-01  0:20 ` Greg KH
  0 siblings, 1 reply; 19+ messages in thread
From: Stephen Rothwell @ 2014-07-31  7:07 UTC (permalink / raw)
  To: Greg KH, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
	Peter Zijlstra
  Cc: linux-next, linux-kernel, Kees Cook, David Riley, John Stultz

[-- Attachment #1: Type: text/plain, Size: 1410 bytes --]

Hi Greg,

Today's linux-next merge of the driver-core tree got a conflict in
lib/Kconfig.debug between commit e704f93af5a0 ("kernel: time: Add
udelay_test module to validate udelay") from the tip tree and commit
0a8adf584759 ("test: add firmware_class loader test") from the
driver-core tree.

I fixed it up (see below) and can carry the fix as necessary (no action
is required).

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

diff --cc lib/Kconfig.debug
index 7cc4e8aff5df,213cd9f7e957..000000000000
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@@ -1659,15 -1649,19 +1659,28 @@@ config TEST_BP
  
  	  If unsure, say N.
  
+ config TEST_FIRMWARE
+ 	tristate "Test firmware loading via userspace interface"
+ 	default n
+ 	depends on FW_LOADER
+ 	help
+ 	  This builds the "test_firmware" module that creates a userspace
+ 	  interface for testing firmware loading. This can be used to
+ 	  control the triggering of firmware loading without needing an
+ 	  actual firmware-using device. The contents can be rechecked by
+ 	  userspace.
+ 
+ 	  If unsure, say N.
+ 
 +config TEST_UDELAY
 +	tristate "udelay test driver"
 +	default n
 +	help
 +	  This builds the "udelay_test" module that helps to make sure
 +	  that udelay() is working properly.
 +
 +	  If unsure, say N.
 +
  source "samples/Kconfig"
  
  source "lib/Kconfig.kgdb"

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2014-07-31  7:07 linux-next: manual merge of the driver-core tree with the tip tree Stephen Rothwell
@ 2014-08-01  0:20 ` Greg KH
  2014-08-01 23:38   ` Kees Cook
  0 siblings, 1 reply; 19+ messages in thread
From: Greg KH @ 2014-08-01  0:20 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Peter Zijlstra,
	linux-next, linux-kernel, Kees Cook, David Riley, John Stultz

On Thu, Jul 31, 2014 at 05:07:35PM +1000, Stephen Rothwell wrote:
> Hi Greg,
> 
> Today's linux-next merge of the driver-core tree got a conflict in
> lib/Kconfig.debug between commit e704f93af5a0 ("kernel: time: Add
> udelay_test module to validate udelay") from the tip tree and commit
> 0a8adf584759 ("test: add firmware_class loader test") from the
> driver-core tree.
> 
> I fixed it up (see below) and can carry the fix as necessary (no action
> is required).

Looks good, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2014-08-01  0:20 ` Greg KH
@ 2014-08-01 23:38   ` Kees Cook
  2014-08-02  2:40     ` Greg KH
                       ` (2 more replies)
  0 siblings, 3 replies; 19+ messages in thread
From: Kees Cook @ 2014-08-01 23:38 UTC (permalink / raw)
  To: Greg KH
  Cc: Stephen Rothwell, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
	Peter Zijlstra, Linux-Next, LKML, David Riley, John Stultz

On Thu, Jul 31, 2014 at 8:20 PM, Greg KH <greg@kroah.com> wrote:
> On Thu, Jul 31, 2014 at 05:07:35PM +1000, Stephen Rothwell wrote:
>> Hi Greg,
>>
>> Today's linux-next merge of the driver-core tree got a conflict in
>> lib/Kconfig.debug between commit e704f93af5a0 ("kernel: time: Add
>> udelay_test module to validate udelay") from the tip tree and commit
>> 0a8adf584759 ("test: add firmware_class loader test") from the
>> driver-core tree.
>>
>> I fixed it up (see below) and can carry the fix as necessary (no action
>> is required).
>
> Looks good, thanks.

For keeping things regularized, could this module instead be named
"test_udelay", to match the rest of most of the test modules?
(Starting with "test_".)

-Kees

-- 
Kees Cook
Chrome OS Security

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2014-08-01 23:38   ` Kees Cook
@ 2014-08-02  2:40     ` Greg KH
  2014-08-04 18:27     ` John Stultz
  2014-08-04 18:35     ` [PATCH] time: Rename udelay_test.c to test_udelay.c John Stultz
  2 siblings, 0 replies; 19+ messages in thread
From: Greg KH @ 2014-08-02  2:40 UTC (permalink / raw)
  To: Kees Cook
  Cc: Stephen Rothwell, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
	Peter Zijlstra, Linux-Next, LKML, David Riley, John Stultz

On Fri, Aug 01, 2014 at 07:38:26PM -0400, Kees Cook wrote:
> On Thu, Jul 31, 2014 at 8:20 PM, Greg KH <greg@kroah.com> wrote:
> > On Thu, Jul 31, 2014 at 05:07:35PM +1000, Stephen Rothwell wrote:
> >> Hi Greg,
> >>
> >> Today's linux-next merge of the driver-core tree got a conflict in
> >> lib/Kconfig.debug between commit e704f93af5a0 ("kernel: time: Add
> >> udelay_test module to validate udelay") from the tip tree and commit
> >> 0a8adf584759 ("test: add firmware_class loader test") from the
> >> driver-core tree.
> >>
> >> I fixed it up (see below) and can carry the fix as necessary (no action
> >> is required).
> >
> > Looks good, thanks.
> 
> For keeping things regularized, could this module instead be named
> "test_udelay", to match the rest of most of the test modules?
> (Starting with "test_".)

Makes sense, want to send a patch to rename it?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2014-08-01 23:38   ` Kees Cook
  2014-08-02  2:40     ` Greg KH
@ 2014-08-04 18:27     ` John Stultz
  2014-08-04 18:35     ` [PATCH] time: Rename udelay_test.c to test_udelay.c John Stultz
  2 siblings, 0 replies; 19+ messages in thread
From: John Stultz @ 2014-08-04 18:27 UTC (permalink / raw)
  To: Kees Cook
  Cc: Greg KH, Stephen Rothwell, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, Peter Zijlstra, Linux-Next, LKML, David Riley

On Fri, Aug 1, 2014 at 4:38 PM, Kees Cook <keescook@chromium.org> wrote:
> On Thu, Jul 31, 2014 at 8:20 PM, Greg KH <greg@kroah.com> wrote:
>> On Thu, Jul 31, 2014 at 05:07:35PM +1000, Stephen Rothwell wrote:
>>> Hi Greg,
>>>
>>> Today's linux-next merge of the driver-core tree got a conflict in
>>> lib/Kconfig.debug between commit e704f93af5a0 ("kernel: time: Add
>>> udelay_test module to validate udelay") from the tip tree and commit
>>> 0a8adf584759 ("test: add firmware_class loader test") from the
>>> driver-core tree.
>>>
>>> I fixed it up (see below) and can carry the fix as necessary (no action
>>> is required).
>>
>> Looks good, thanks.
>
> For keeping things regularized, could this module instead be named
> "test_udelay", to match the rest of most of the test modules?
> (Starting with "test_".)

Sure. I'll spin up a patch to change it and will submit here shortly.

thanks
-john

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH] time: Rename udelay_test.c to test_udelay.c
  2014-08-01 23:38   ` Kees Cook
  2014-08-02  2:40     ` Greg KH
  2014-08-04 18:27     ` John Stultz
@ 2014-08-04 18:35     ` John Stultz
  2014-08-04 19:35       ` Kees Cook
  2014-08-06 16:31       ` David Riley
  2 siblings, 2 replies; 19+ messages in thread
From: John Stultz @ 2014-08-04 18:35 UTC (permalink / raw)
  To: LKML
  Cc: John Stultz, Kees Cook, Greg KH, Stephen Rothwell,
	Thomas Gleixner, Ingo Molnar, Linux-Next, David Riley

Kees requested that this test module be renamed for consistency sake,
so this patch renames the udelay_test.c file (recently added to
tip/timers/core for 3.17) to test_udelay.c

Cc: Kees Cook <keescook@chromium.org>
Cc: Greg KH <greg@kroah.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Linux-Next <linux-next@vger.kernel.org>
Cc: David Riley <davidriley@chromium.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
 kernel/time/Makefile      |   2 +-
 kernel/time/test_udelay.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++
 kernel/time/udelay_test.c | 168 ----------------------------------------------
 3 files changed, 169 insertions(+), 169 deletions(-)
 create mode 100644 kernel/time/test_udelay.c
 delete mode 100644 kernel/time/udelay_test.c

diff --git a/kernel/time/Makefile b/kernel/time/Makefile
index 7347426..f622cf2 100644
--- a/kernel/time/Makefile
+++ b/kernel/time/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_TICK_ONESHOT)			+= tick-oneshot.o
 obj-$(CONFIG_TICK_ONESHOT)			+= tick-sched.o
 obj-$(CONFIG_TIMER_STATS)			+= timer_stats.o
 obj-$(CONFIG_DEBUG_FS)				+= timekeeping_debug.o
-obj-$(CONFIG_TEST_UDELAY)			+= udelay_test.o
+obj-$(CONFIG_TEST_UDELAY)			+= test_udelay.o
 
 $(obj)/time.o: $(obj)/timeconst.h
 
diff --git a/kernel/time/test_udelay.c b/kernel/time/test_udelay.c
new file mode 100644
index 0000000..e622ba3
--- /dev/null
+++ b/kernel/time/test_udelay.c
@@ -0,0 +1,168 @@
+/*
+ * udelay() test kernel module
+ *
+ * Test is executed by writing and reading to /sys/kernel/debug/udelay_test
+ * Tests are configured by writing: USECS ITERATIONS
+ * Tests are executed by reading from the same file.
+ * Specifying usecs of 0 or negative values will run multiples tests.
+ *
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/debugfs.h>
+#include <linux/delay.h>
+#include <linux/ktime.h>
+#include <linux/module.h>
+#include <linux/uaccess.h>
+
+#define DEFAULT_ITERATIONS 100
+
+#define DEBUGFS_FILENAME "udelay_test"
+
+static DEFINE_MUTEX(udelay_test_lock);
+static struct dentry *udelay_test_debugfs_file;
+static int udelay_test_usecs;
+static int udelay_test_iterations = DEFAULT_ITERATIONS;
+
+static int udelay_test_single(struct seq_file *s, int usecs, uint32_t iters)
+{
+	int min = 0, max = 0, fail_count = 0;
+	uint64_t sum = 0;
+	uint64_t avg;
+	int i;
+	/* Allow udelay to be up to 0.5% fast */
+	int allowed_error_ns = usecs * 5;
+
+	for (i = 0; i < iters; ++i) {
+		struct timespec ts1, ts2;
+		int time_passed;
+
+		ktime_get_ts(&ts1);
+		udelay(usecs);
+		ktime_get_ts(&ts2);
+		time_passed = timespec_to_ns(&ts2) - timespec_to_ns(&ts1);
+
+		if (i == 0 || time_passed < min)
+			min = time_passed;
+		if (i == 0 || time_passed > max)
+			max = time_passed;
+		if ((time_passed + allowed_error_ns) / 1000 < usecs)
+			++fail_count;
+		WARN_ON(time_passed < 0);
+		sum += time_passed;
+	}
+
+	avg = sum;
+	do_div(avg, iters);
+	seq_printf(s, "%d usecs x %d: exp=%d allowed=%d min=%d avg=%lld max=%d",
+			usecs, iters, usecs * 1000,
+			(usecs * 1000) - allowed_error_ns, min, avg, max);
+	if (fail_count)
+		seq_printf(s, " FAIL=%d", fail_count);
+	seq_puts(s, "\n");
+
+	return 0;
+}
+
+static int udelay_test_show(struct seq_file *s, void *v)
+{
+	int usecs;
+	int iters;
+	int ret = 0;
+
+	mutex_lock(&udelay_test_lock);
+	usecs = udelay_test_usecs;
+	iters = udelay_test_iterations;
+	mutex_unlock(&udelay_test_lock);
+
+	if (usecs > 0 && iters > 0) {
+		return udelay_test_single(s, usecs, iters);
+	} else if (usecs == 0) {
+		struct timespec ts;
+
+		ktime_get_ts(&ts);
+		seq_printf(s, "udelay() test (lpj=%ld kt=%ld.%09ld)\n",
+				loops_per_jiffy, ts.tv_sec, ts.tv_nsec);
+		seq_puts(s, "usage:\n");
+		seq_puts(s, "echo USECS [ITERS] > " DEBUGFS_FILENAME "\n");
+		seq_puts(s, "cat " DEBUGFS_FILENAME "\n");
+	}
+
+	return ret;
+}
+
+static int udelay_test_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, udelay_test_show, inode->i_private);
+}
+
+static ssize_t udelay_test_write(struct file *file, const char __user *buf,
+		size_t count, loff_t *pos)
+{
+	char lbuf[32];
+	int ret;
+	int usecs;
+	int iters;
+
+	if (count >= sizeof(lbuf))
+		return -EINVAL;
+
+	if (copy_from_user(lbuf, buf, count))
+		return -EFAULT;
+	lbuf[count] = '\0';
+
+	ret = sscanf(lbuf, "%d %d", &usecs, &iters);
+	if (ret < 1)
+		return -EINVAL;
+	else if (ret < 2)
+		iters = DEFAULT_ITERATIONS;
+
+	mutex_lock(&udelay_test_lock);
+	udelay_test_usecs = usecs;
+	udelay_test_iterations = iters;
+	mutex_unlock(&udelay_test_lock);
+
+	return count;
+}
+
+static const struct file_operations udelay_test_debugfs_ops = {
+	.owner = THIS_MODULE,
+	.open = udelay_test_open,
+	.read = seq_read,
+	.write = udelay_test_write,
+	.llseek = seq_lseek,
+	.release = single_release,
+};
+
+static int __init udelay_test_init(void)
+{
+	mutex_lock(&udelay_test_lock);
+	udelay_test_debugfs_file = debugfs_create_file(DEBUGFS_FILENAME,
+			S_IRUSR, NULL, NULL, &udelay_test_debugfs_ops);
+	mutex_unlock(&udelay_test_lock);
+
+	return 0;
+}
+
+module_init(udelay_test_init);
+
+static void __exit udelay_test_exit(void)
+{
+	mutex_lock(&udelay_test_lock);
+	debugfs_remove(udelay_test_debugfs_file);
+	mutex_unlock(&udelay_test_lock);
+}
+
+module_exit(udelay_test_exit);
+
+MODULE_AUTHOR("David Riley <davidriley@chromium.org>");
+MODULE_LICENSE("GPL");
diff --git a/kernel/time/udelay_test.c b/kernel/time/udelay_test.c
deleted file mode 100644
index e622ba3..0000000
--- a/kernel/time/udelay_test.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * udelay() test kernel module
- *
- * Test is executed by writing and reading to /sys/kernel/debug/udelay_test
- * Tests are configured by writing: USECS ITERATIONS
- * Tests are executed by reading from the same file.
- * Specifying usecs of 0 or negative values will run multiples tests.
- *
- * Copyright (C) 2014 Google, Inc.
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/debugfs.h>
-#include <linux/delay.h>
-#include <linux/ktime.h>
-#include <linux/module.h>
-#include <linux/uaccess.h>
-
-#define DEFAULT_ITERATIONS 100
-
-#define DEBUGFS_FILENAME "udelay_test"
-
-static DEFINE_MUTEX(udelay_test_lock);
-static struct dentry *udelay_test_debugfs_file;
-static int udelay_test_usecs;
-static int udelay_test_iterations = DEFAULT_ITERATIONS;
-
-static int udelay_test_single(struct seq_file *s, int usecs, uint32_t iters)
-{
-	int min = 0, max = 0, fail_count = 0;
-	uint64_t sum = 0;
-	uint64_t avg;
-	int i;
-	/* Allow udelay to be up to 0.5% fast */
-	int allowed_error_ns = usecs * 5;
-
-	for (i = 0; i < iters; ++i) {
-		struct timespec ts1, ts2;
-		int time_passed;
-
-		ktime_get_ts(&ts1);
-		udelay(usecs);
-		ktime_get_ts(&ts2);
-		time_passed = timespec_to_ns(&ts2) - timespec_to_ns(&ts1);
-
-		if (i == 0 || time_passed < min)
-			min = time_passed;
-		if (i == 0 || time_passed > max)
-			max = time_passed;
-		if ((time_passed + allowed_error_ns) / 1000 < usecs)
-			++fail_count;
-		WARN_ON(time_passed < 0);
-		sum += time_passed;
-	}
-
-	avg = sum;
-	do_div(avg, iters);
-	seq_printf(s, "%d usecs x %d: exp=%d allowed=%d min=%d avg=%lld max=%d",
-			usecs, iters, usecs * 1000,
-			(usecs * 1000) - allowed_error_ns, min, avg, max);
-	if (fail_count)
-		seq_printf(s, " FAIL=%d", fail_count);
-	seq_puts(s, "\n");
-
-	return 0;
-}
-
-static int udelay_test_show(struct seq_file *s, void *v)
-{
-	int usecs;
-	int iters;
-	int ret = 0;
-
-	mutex_lock(&udelay_test_lock);
-	usecs = udelay_test_usecs;
-	iters = udelay_test_iterations;
-	mutex_unlock(&udelay_test_lock);
-
-	if (usecs > 0 && iters > 0) {
-		return udelay_test_single(s, usecs, iters);
-	} else if (usecs == 0) {
-		struct timespec ts;
-
-		ktime_get_ts(&ts);
-		seq_printf(s, "udelay() test (lpj=%ld kt=%ld.%09ld)\n",
-				loops_per_jiffy, ts.tv_sec, ts.tv_nsec);
-		seq_puts(s, "usage:\n");
-		seq_puts(s, "echo USECS [ITERS] > " DEBUGFS_FILENAME "\n");
-		seq_puts(s, "cat " DEBUGFS_FILENAME "\n");
-	}
-
-	return ret;
-}
-
-static int udelay_test_open(struct inode *inode, struct file *file)
-{
-	return single_open(file, udelay_test_show, inode->i_private);
-}
-
-static ssize_t udelay_test_write(struct file *file, const char __user *buf,
-		size_t count, loff_t *pos)
-{
-	char lbuf[32];
-	int ret;
-	int usecs;
-	int iters;
-
-	if (count >= sizeof(lbuf))
-		return -EINVAL;
-
-	if (copy_from_user(lbuf, buf, count))
-		return -EFAULT;
-	lbuf[count] = '\0';
-
-	ret = sscanf(lbuf, "%d %d", &usecs, &iters);
-	if (ret < 1)
-		return -EINVAL;
-	else if (ret < 2)
-		iters = DEFAULT_ITERATIONS;
-
-	mutex_lock(&udelay_test_lock);
-	udelay_test_usecs = usecs;
-	udelay_test_iterations = iters;
-	mutex_unlock(&udelay_test_lock);
-
-	return count;
-}
-
-static const struct file_operations udelay_test_debugfs_ops = {
-	.owner = THIS_MODULE,
-	.open = udelay_test_open,
-	.read = seq_read,
-	.write = udelay_test_write,
-	.llseek = seq_lseek,
-	.release = single_release,
-};
-
-static int __init udelay_test_init(void)
-{
-	mutex_lock(&udelay_test_lock);
-	udelay_test_debugfs_file = debugfs_create_file(DEBUGFS_FILENAME,
-			S_IRUSR, NULL, NULL, &udelay_test_debugfs_ops);
-	mutex_unlock(&udelay_test_lock);
-
-	return 0;
-}
-
-module_init(udelay_test_init);
-
-static void __exit udelay_test_exit(void)
-{
-	mutex_lock(&udelay_test_lock);
-	debugfs_remove(udelay_test_debugfs_file);
-	mutex_unlock(&udelay_test_lock);
-}
-
-module_exit(udelay_test_exit);
-
-MODULE_AUTHOR("David Riley <davidriley@chromium.org>");
-MODULE_LICENSE("GPL");
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH] time: Rename udelay_test.c to test_udelay.c
  2014-08-04 18:35     ` [PATCH] time: Rename udelay_test.c to test_udelay.c John Stultz
@ 2014-08-04 19:35       ` Kees Cook
  2014-08-06 16:31       ` David Riley
  1 sibling, 0 replies; 19+ messages in thread
From: Kees Cook @ 2014-08-04 19:35 UTC (permalink / raw)
  To: John Stultz
  Cc: LKML, Greg KH, Stephen Rothwell, Thomas Gleixner, Ingo Molnar,
	Linux-Next, David Riley

On Mon, Aug 4, 2014 at 11:35 AM, John Stultz <john.stultz@linaro.org> wrote:
> Kees requested that this test module be renamed for consistency sake,
> so this patch renames the udelay_test.c file (recently added to
> tip/timers/core for 3.17) to test_udelay.c
>
> Cc: Kees Cook <keescook@chromium.org>
> Cc: Greg KH <greg@kroah.com>
> Cc: Stephen Rothwell <sfr@canb.auug.org.au>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Linux-Next <linux-next@vger.kernel.org>
> Cc: David Riley <davidriley@chromium.org>
> Signed-off-by: John Stultz <john.stultz@linaro.org>

Thank you! :)

Acked-by: Kees Cook <keescook@chromium.org>

-Kees

> ---
>  kernel/time/Makefile      |   2 +-
>  kernel/time/test_udelay.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++
>  kernel/time/udelay_test.c | 168 ----------------------------------------------
>  3 files changed, 169 insertions(+), 169 deletions(-)
>  create mode 100644 kernel/time/test_udelay.c
>  delete mode 100644 kernel/time/udelay_test.c
>
> diff --git a/kernel/time/Makefile b/kernel/time/Makefile
> index 7347426..f622cf2 100644
> --- a/kernel/time/Makefile
> +++ b/kernel/time/Makefile
> @@ -13,7 +13,7 @@ obj-$(CONFIG_TICK_ONESHOT)                    += tick-oneshot.o
>  obj-$(CONFIG_TICK_ONESHOT)                     += tick-sched.o
>  obj-$(CONFIG_TIMER_STATS)                      += timer_stats.o
>  obj-$(CONFIG_DEBUG_FS)                         += timekeeping_debug.o
> -obj-$(CONFIG_TEST_UDELAY)                      += udelay_test.o
> +obj-$(CONFIG_TEST_UDELAY)                      += test_udelay.o
>
>  $(obj)/time.o: $(obj)/timeconst.h
>
> diff --git a/kernel/time/test_udelay.c b/kernel/time/test_udelay.c
> new file mode 100644
> index 0000000..e622ba3
> --- /dev/null
> +++ b/kernel/time/test_udelay.c
> @@ -0,0 +1,168 @@
> +/*
> + * udelay() test kernel module
> + *
> + * Test is executed by writing and reading to /sys/kernel/debug/udelay_test
> + * Tests are configured by writing: USECS ITERATIONS
> + * Tests are executed by reading from the same file.
> + * Specifying usecs of 0 or negative values will run multiples tests.
> + *
> + * Copyright (C) 2014 Google, Inc.
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/debugfs.h>
> +#include <linux/delay.h>
> +#include <linux/ktime.h>
> +#include <linux/module.h>
> +#include <linux/uaccess.h>
> +
> +#define DEFAULT_ITERATIONS 100
> +
> +#define DEBUGFS_FILENAME "udelay_test"
> +
> +static DEFINE_MUTEX(udelay_test_lock);
> +static struct dentry *udelay_test_debugfs_file;
> +static int udelay_test_usecs;
> +static int udelay_test_iterations = DEFAULT_ITERATIONS;
> +
> +static int udelay_test_single(struct seq_file *s, int usecs, uint32_t iters)
> +{
> +       int min = 0, max = 0, fail_count = 0;
> +       uint64_t sum = 0;
> +       uint64_t avg;
> +       int i;
> +       /* Allow udelay to be up to 0.5% fast */
> +       int allowed_error_ns = usecs * 5;
> +
> +       for (i = 0; i < iters; ++i) {
> +               struct timespec ts1, ts2;
> +               int time_passed;
> +
> +               ktime_get_ts(&ts1);
> +               udelay(usecs);
> +               ktime_get_ts(&ts2);
> +               time_passed = timespec_to_ns(&ts2) - timespec_to_ns(&ts1);
> +
> +               if (i == 0 || time_passed < min)
> +                       min = time_passed;
> +               if (i == 0 || time_passed > max)
> +                       max = time_passed;
> +               if ((time_passed + allowed_error_ns) / 1000 < usecs)
> +                       ++fail_count;
> +               WARN_ON(time_passed < 0);
> +               sum += time_passed;
> +       }
> +
> +       avg = sum;
> +       do_div(avg, iters);
> +       seq_printf(s, "%d usecs x %d: exp=%d allowed=%d min=%d avg=%lld max=%d",
> +                       usecs, iters, usecs * 1000,
> +                       (usecs * 1000) - allowed_error_ns, min, avg, max);
> +       if (fail_count)
> +               seq_printf(s, " FAIL=%d", fail_count);
> +       seq_puts(s, "\n");
> +
> +       return 0;
> +}
> +
> +static int udelay_test_show(struct seq_file *s, void *v)
> +{
> +       int usecs;
> +       int iters;
> +       int ret = 0;
> +
> +       mutex_lock(&udelay_test_lock);
> +       usecs = udelay_test_usecs;
> +       iters = udelay_test_iterations;
> +       mutex_unlock(&udelay_test_lock);
> +
> +       if (usecs > 0 && iters > 0) {
> +               return udelay_test_single(s, usecs, iters);
> +       } else if (usecs == 0) {
> +               struct timespec ts;
> +
> +               ktime_get_ts(&ts);
> +               seq_printf(s, "udelay() test (lpj=%ld kt=%ld.%09ld)\n",
> +                               loops_per_jiffy, ts.tv_sec, ts.tv_nsec);
> +               seq_puts(s, "usage:\n");
> +               seq_puts(s, "echo USECS [ITERS] > " DEBUGFS_FILENAME "\n");
> +               seq_puts(s, "cat " DEBUGFS_FILENAME "\n");
> +       }
> +
> +       return ret;
> +}
> +
> +static int udelay_test_open(struct inode *inode, struct file *file)
> +{
> +       return single_open(file, udelay_test_show, inode->i_private);
> +}
> +
> +static ssize_t udelay_test_write(struct file *file, const char __user *buf,
> +               size_t count, loff_t *pos)
> +{
> +       char lbuf[32];
> +       int ret;
> +       int usecs;
> +       int iters;
> +
> +       if (count >= sizeof(lbuf))
> +               return -EINVAL;
> +
> +       if (copy_from_user(lbuf, buf, count))
> +               return -EFAULT;
> +       lbuf[count] = '\0';
> +
> +       ret = sscanf(lbuf, "%d %d", &usecs, &iters);
> +       if (ret < 1)
> +               return -EINVAL;
> +       else if (ret < 2)
> +               iters = DEFAULT_ITERATIONS;
> +
> +       mutex_lock(&udelay_test_lock);
> +       udelay_test_usecs = usecs;
> +       udelay_test_iterations = iters;
> +       mutex_unlock(&udelay_test_lock);
> +
> +       return count;
> +}
> +
> +static const struct file_operations udelay_test_debugfs_ops = {
> +       .owner = THIS_MODULE,
> +       .open = udelay_test_open,
> +       .read = seq_read,
> +       .write = udelay_test_write,
> +       .llseek = seq_lseek,
> +       .release = single_release,
> +};
> +
> +static int __init udelay_test_init(void)
> +{
> +       mutex_lock(&udelay_test_lock);
> +       udelay_test_debugfs_file = debugfs_create_file(DEBUGFS_FILENAME,
> +                       S_IRUSR, NULL, NULL, &udelay_test_debugfs_ops);
> +       mutex_unlock(&udelay_test_lock);
> +
> +       return 0;
> +}
> +
> +module_init(udelay_test_init);
> +
> +static void __exit udelay_test_exit(void)
> +{
> +       mutex_lock(&udelay_test_lock);
> +       debugfs_remove(udelay_test_debugfs_file);
> +       mutex_unlock(&udelay_test_lock);
> +}
> +
> +module_exit(udelay_test_exit);
> +
> +MODULE_AUTHOR("David Riley <davidriley@chromium.org>");
> +MODULE_LICENSE("GPL");
> diff --git a/kernel/time/udelay_test.c b/kernel/time/udelay_test.c
> deleted file mode 100644
> index e622ba3..0000000
> --- a/kernel/time/udelay_test.c
> +++ /dev/null
> @@ -1,168 +0,0 @@
> -/*
> - * udelay() test kernel module
> - *
> - * Test is executed by writing and reading to /sys/kernel/debug/udelay_test
> - * Tests are configured by writing: USECS ITERATIONS
> - * Tests are executed by reading from the same file.
> - * Specifying usecs of 0 or negative values will run multiples tests.
> - *
> - * Copyright (C) 2014 Google, Inc.
> - *
> - * This software is licensed under the terms of the GNU General Public
> - * License version 2, as published by the Free Software Foundation, and
> - * may be copied, distributed, and modified under those terms.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - */
> -
> -#include <linux/debugfs.h>
> -#include <linux/delay.h>
> -#include <linux/ktime.h>
> -#include <linux/module.h>
> -#include <linux/uaccess.h>
> -
> -#define DEFAULT_ITERATIONS 100
> -
> -#define DEBUGFS_FILENAME "udelay_test"
> -
> -static DEFINE_MUTEX(udelay_test_lock);
> -static struct dentry *udelay_test_debugfs_file;
> -static int udelay_test_usecs;
> -static int udelay_test_iterations = DEFAULT_ITERATIONS;
> -
> -static int udelay_test_single(struct seq_file *s, int usecs, uint32_t iters)
> -{
> -       int min = 0, max = 0, fail_count = 0;
> -       uint64_t sum = 0;
> -       uint64_t avg;
> -       int i;
> -       /* Allow udelay to be up to 0.5% fast */
> -       int allowed_error_ns = usecs * 5;
> -
> -       for (i = 0; i < iters; ++i) {
> -               struct timespec ts1, ts2;
> -               int time_passed;
> -
> -               ktime_get_ts(&ts1);
> -               udelay(usecs);
> -               ktime_get_ts(&ts2);
> -               time_passed = timespec_to_ns(&ts2) - timespec_to_ns(&ts1);
> -
> -               if (i == 0 || time_passed < min)
> -                       min = time_passed;
> -               if (i == 0 || time_passed > max)
> -                       max = time_passed;
> -               if ((time_passed + allowed_error_ns) / 1000 < usecs)
> -                       ++fail_count;
> -               WARN_ON(time_passed < 0);
> -               sum += time_passed;
> -       }
> -
> -       avg = sum;
> -       do_div(avg, iters);
> -       seq_printf(s, "%d usecs x %d: exp=%d allowed=%d min=%d avg=%lld max=%d",
> -                       usecs, iters, usecs * 1000,
> -                       (usecs * 1000) - allowed_error_ns, min, avg, max);
> -       if (fail_count)
> -               seq_printf(s, " FAIL=%d", fail_count);
> -       seq_puts(s, "\n");
> -
> -       return 0;
> -}
> -
> -static int udelay_test_show(struct seq_file *s, void *v)
> -{
> -       int usecs;
> -       int iters;
> -       int ret = 0;
> -
> -       mutex_lock(&udelay_test_lock);
> -       usecs = udelay_test_usecs;
> -       iters = udelay_test_iterations;
> -       mutex_unlock(&udelay_test_lock);
> -
> -       if (usecs > 0 && iters > 0) {
> -               return udelay_test_single(s, usecs, iters);
> -       } else if (usecs == 0) {
> -               struct timespec ts;
> -
> -               ktime_get_ts(&ts);
> -               seq_printf(s, "udelay() test (lpj=%ld kt=%ld.%09ld)\n",
> -                               loops_per_jiffy, ts.tv_sec, ts.tv_nsec);
> -               seq_puts(s, "usage:\n");
> -               seq_puts(s, "echo USECS [ITERS] > " DEBUGFS_FILENAME "\n");
> -               seq_puts(s, "cat " DEBUGFS_FILENAME "\n");
> -       }
> -
> -       return ret;
> -}
> -
> -static int udelay_test_open(struct inode *inode, struct file *file)
> -{
> -       return single_open(file, udelay_test_show, inode->i_private);
> -}
> -
> -static ssize_t udelay_test_write(struct file *file, const char __user *buf,
> -               size_t count, loff_t *pos)
> -{
> -       char lbuf[32];
> -       int ret;
> -       int usecs;
> -       int iters;
> -
> -       if (count >= sizeof(lbuf))
> -               return -EINVAL;
> -
> -       if (copy_from_user(lbuf, buf, count))
> -               return -EFAULT;
> -       lbuf[count] = '\0';
> -
> -       ret = sscanf(lbuf, "%d %d", &usecs, &iters);
> -       if (ret < 1)
> -               return -EINVAL;
> -       else if (ret < 2)
> -               iters = DEFAULT_ITERATIONS;
> -
> -       mutex_lock(&udelay_test_lock);
> -       udelay_test_usecs = usecs;
> -       udelay_test_iterations = iters;
> -       mutex_unlock(&udelay_test_lock);
> -
> -       return count;
> -}
> -
> -static const struct file_operations udelay_test_debugfs_ops = {
> -       .owner = THIS_MODULE,
> -       .open = udelay_test_open,
> -       .read = seq_read,
> -       .write = udelay_test_write,
> -       .llseek = seq_lseek,
> -       .release = single_release,
> -};
> -
> -static int __init udelay_test_init(void)
> -{
> -       mutex_lock(&udelay_test_lock);
> -       udelay_test_debugfs_file = debugfs_create_file(DEBUGFS_FILENAME,
> -                       S_IRUSR, NULL, NULL, &udelay_test_debugfs_ops);
> -       mutex_unlock(&udelay_test_lock);
> -
> -       return 0;
> -}
> -
> -module_init(udelay_test_init);
> -
> -static void __exit udelay_test_exit(void)
> -{
> -       mutex_lock(&udelay_test_lock);
> -       debugfs_remove(udelay_test_debugfs_file);
> -       mutex_unlock(&udelay_test_lock);
> -}
> -
> -module_exit(udelay_test_exit);
> -
> -MODULE_AUTHOR("David Riley <davidriley@chromium.org>");
> -MODULE_LICENSE("GPL");
> --
> 1.9.1
>



-- 
Kees Cook
Chrome OS Security

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] time: Rename udelay_test.c to test_udelay.c
  2014-08-04 18:35     ` [PATCH] time: Rename udelay_test.c to test_udelay.c John Stultz
  2014-08-04 19:35       ` Kees Cook
@ 2014-08-06 16:31       ` David Riley
  1 sibling, 0 replies; 19+ messages in thread
From: David Riley @ 2014-08-06 16:31 UTC (permalink / raw)
  To: John Stultz
  Cc: LKML, Kees Cook, Greg KH, Stephen Rothwell, Thomas Gleixner,
	Ingo Molnar, Linux-Next

On Mon, Aug 4, 2014 at 11:35 AM, John Stultz <john.stultz@linaro.org> wrote:
> Kees requested that this test module be renamed for consistency sake,
> so this patch renames the udelay_test.c file (recently added to
> tip/timers/core for 3.17) to test_udelay.c
>
> Cc: Kees Cook <keescook@chromium.org>
> Cc: Greg KH <greg@kroah.com>
> Cc: Stephen Rothwell <sfr@canb.auug.org.au>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Linux-Next <linux-next@vger.kernel.org>
> Cc: David Riley <davidriley@chromium.org>
> Signed-off-by: John Stultz <john.stultz@linaro.org>

Acked-by: David Riley <davidriley@chromium.org>

> ---
>  kernel/time/Makefile      |   2 +-
>  kernel/time/test_udelay.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++
>  kernel/time/udelay_test.c | 168 ----------------------------------------------
>  3 files changed, 169 insertions(+), 169 deletions(-)
>  create mode 100644 kernel/time/test_udelay.c
>  delete mode 100644 kernel/time/udelay_test.c
>
> diff --git a/kernel/time/Makefile b/kernel/time/Makefile
> index 7347426..f622cf2 100644
> --- a/kernel/time/Makefile
> +++ b/kernel/time/Makefile
> @@ -13,7 +13,7 @@ obj-$(CONFIG_TICK_ONESHOT)                    += tick-oneshot.o
>  obj-$(CONFIG_TICK_ONESHOT)                     += tick-sched.o
>  obj-$(CONFIG_TIMER_STATS)                      += timer_stats.o
>  obj-$(CONFIG_DEBUG_FS)                         += timekeeping_debug.o
> -obj-$(CONFIG_TEST_UDELAY)                      += udelay_test.o
> +obj-$(CONFIG_TEST_UDELAY)                      += test_udelay.o
>
>  $(obj)/time.o: $(obj)/timeconst.h
>
> diff --git a/kernel/time/test_udelay.c b/kernel/time/test_udelay.c
> new file mode 100644
> index 0000000..e622ba3
> --- /dev/null
> +++ b/kernel/time/test_udelay.c
> @@ -0,0 +1,168 @@
> +/*
> + * udelay() test kernel module
> + *
> + * Test is executed by writing and reading to /sys/kernel/debug/udelay_test
> + * Tests are configured by writing: USECS ITERATIONS
> + * Tests are executed by reading from the same file.
> + * Specifying usecs of 0 or negative values will run multiples tests.
> + *
> + * Copyright (C) 2014 Google, Inc.
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/debugfs.h>
> +#include <linux/delay.h>
> +#include <linux/ktime.h>
> +#include <linux/module.h>
> +#include <linux/uaccess.h>
> +
> +#define DEFAULT_ITERATIONS 100
> +
> +#define DEBUGFS_FILENAME "udelay_test"
> +
> +static DEFINE_MUTEX(udelay_test_lock);
> +static struct dentry *udelay_test_debugfs_file;
> +static int udelay_test_usecs;
> +static int udelay_test_iterations = DEFAULT_ITERATIONS;
> +
> +static int udelay_test_single(struct seq_file *s, int usecs, uint32_t iters)
> +{
> +       int min = 0, max = 0, fail_count = 0;
> +       uint64_t sum = 0;
> +       uint64_t avg;
> +       int i;
> +       /* Allow udelay to be up to 0.5% fast */
> +       int allowed_error_ns = usecs * 5;
> +
> +       for (i = 0; i < iters; ++i) {
> +               struct timespec ts1, ts2;
> +               int time_passed;
> +
> +               ktime_get_ts(&ts1);
> +               udelay(usecs);
> +               ktime_get_ts(&ts2);
> +               time_passed = timespec_to_ns(&ts2) - timespec_to_ns(&ts1);
> +
> +               if (i == 0 || time_passed < min)
> +                       min = time_passed;
> +               if (i == 0 || time_passed > max)
> +                       max = time_passed;
> +               if ((time_passed + allowed_error_ns) / 1000 < usecs)
> +                       ++fail_count;
> +               WARN_ON(time_passed < 0);
> +               sum += time_passed;
> +       }
> +
> +       avg = sum;
> +       do_div(avg, iters);
> +       seq_printf(s, "%d usecs x %d: exp=%d allowed=%d min=%d avg=%lld max=%d",
> +                       usecs, iters, usecs * 1000,
> +                       (usecs * 1000) - allowed_error_ns, min, avg, max);
> +       if (fail_count)
> +               seq_printf(s, " FAIL=%d", fail_count);
> +       seq_puts(s, "\n");
> +
> +       return 0;
> +}
> +
> +static int udelay_test_show(struct seq_file *s, void *v)
> +{
> +       int usecs;
> +       int iters;
> +       int ret = 0;
> +
> +       mutex_lock(&udelay_test_lock);
> +       usecs = udelay_test_usecs;
> +       iters = udelay_test_iterations;
> +       mutex_unlock(&udelay_test_lock);
> +
> +       if (usecs > 0 && iters > 0) {
> +               return udelay_test_single(s, usecs, iters);
> +       } else if (usecs == 0) {
> +               struct timespec ts;
> +
> +               ktime_get_ts(&ts);
> +               seq_printf(s, "udelay() test (lpj=%ld kt=%ld.%09ld)\n",
> +                               loops_per_jiffy, ts.tv_sec, ts.tv_nsec);
> +               seq_puts(s, "usage:\n");
> +               seq_puts(s, "echo USECS [ITERS] > " DEBUGFS_FILENAME "\n");
> +               seq_puts(s, "cat " DEBUGFS_FILENAME "\n");
> +       }
> +
> +       return ret;
> +}
> +
> +static int udelay_test_open(struct inode *inode, struct file *file)
> +{
> +       return single_open(file, udelay_test_show, inode->i_private);
> +}
> +
> +static ssize_t udelay_test_write(struct file *file, const char __user *buf,
> +               size_t count, loff_t *pos)
> +{
> +       char lbuf[32];
> +       int ret;
> +       int usecs;
> +       int iters;
> +
> +       if (count >= sizeof(lbuf))
> +               return -EINVAL;
> +
> +       if (copy_from_user(lbuf, buf, count))
> +               return -EFAULT;
> +       lbuf[count] = '\0';
> +
> +       ret = sscanf(lbuf, "%d %d", &usecs, &iters);
> +       if (ret < 1)
> +               return -EINVAL;
> +       else if (ret < 2)
> +               iters = DEFAULT_ITERATIONS;
> +
> +       mutex_lock(&udelay_test_lock);
> +       udelay_test_usecs = usecs;
> +       udelay_test_iterations = iters;
> +       mutex_unlock(&udelay_test_lock);
> +
> +       return count;
> +}
> +
> +static const struct file_operations udelay_test_debugfs_ops = {
> +       .owner = THIS_MODULE,
> +       .open = udelay_test_open,
> +       .read = seq_read,
> +       .write = udelay_test_write,
> +       .llseek = seq_lseek,
> +       .release = single_release,
> +};
> +
> +static int __init udelay_test_init(void)
> +{
> +       mutex_lock(&udelay_test_lock);
> +       udelay_test_debugfs_file = debugfs_create_file(DEBUGFS_FILENAME,
> +                       S_IRUSR, NULL, NULL, &udelay_test_debugfs_ops);
> +       mutex_unlock(&udelay_test_lock);
> +
> +       return 0;
> +}
> +
> +module_init(udelay_test_init);
> +
> +static void __exit udelay_test_exit(void)
> +{
> +       mutex_lock(&udelay_test_lock);
> +       debugfs_remove(udelay_test_debugfs_file);
> +       mutex_unlock(&udelay_test_lock);
> +}
> +
> +module_exit(udelay_test_exit);
> +
> +MODULE_AUTHOR("David Riley <davidriley@chromium.org>");
> +MODULE_LICENSE("GPL");
> diff --git a/kernel/time/udelay_test.c b/kernel/time/udelay_test.c
> deleted file mode 100644
> index e622ba3..0000000
> --- a/kernel/time/udelay_test.c
> +++ /dev/null
> @@ -1,168 +0,0 @@
> -/*
> - * udelay() test kernel module
> - *
> - * Test is executed by writing and reading to /sys/kernel/debug/udelay_test
> - * Tests are configured by writing: USECS ITERATIONS
> - * Tests are executed by reading from the same file.
> - * Specifying usecs of 0 or negative values will run multiples tests.
> - *
> - * Copyright (C) 2014 Google, Inc.
> - *
> - * This software is licensed under the terms of the GNU General Public
> - * License version 2, as published by the Free Software Foundation, and
> - * may be copied, distributed, and modified under those terms.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - */
> -
> -#include <linux/debugfs.h>
> -#include <linux/delay.h>
> -#include <linux/ktime.h>
> -#include <linux/module.h>
> -#include <linux/uaccess.h>
> -
> -#define DEFAULT_ITERATIONS 100
> -
> -#define DEBUGFS_FILENAME "udelay_test"
> -
> -static DEFINE_MUTEX(udelay_test_lock);
> -static struct dentry *udelay_test_debugfs_file;
> -static int udelay_test_usecs;
> -static int udelay_test_iterations = DEFAULT_ITERATIONS;
> -
> -static int udelay_test_single(struct seq_file *s, int usecs, uint32_t iters)
> -{
> -       int min = 0, max = 0, fail_count = 0;
> -       uint64_t sum = 0;
> -       uint64_t avg;
> -       int i;
> -       /* Allow udelay to be up to 0.5% fast */
> -       int allowed_error_ns = usecs * 5;
> -
> -       for (i = 0; i < iters; ++i) {
> -               struct timespec ts1, ts2;
> -               int time_passed;
> -
> -               ktime_get_ts(&ts1);
> -               udelay(usecs);
> -               ktime_get_ts(&ts2);
> -               time_passed = timespec_to_ns(&ts2) - timespec_to_ns(&ts1);
> -
> -               if (i == 0 || time_passed < min)
> -                       min = time_passed;
> -               if (i == 0 || time_passed > max)
> -                       max = time_passed;
> -               if ((time_passed + allowed_error_ns) / 1000 < usecs)
> -                       ++fail_count;
> -               WARN_ON(time_passed < 0);
> -               sum += time_passed;
> -       }
> -
> -       avg = sum;
> -       do_div(avg, iters);
> -       seq_printf(s, "%d usecs x %d: exp=%d allowed=%d min=%d avg=%lld max=%d",
> -                       usecs, iters, usecs * 1000,
> -                       (usecs * 1000) - allowed_error_ns, min, avg, max);
> -       if (fail_count)
> -               seq_printf(s, " FAIL=%d", fail_count);
> -       seq_puts(s, "\n");
> -
> -       return 0;
> -}
> -
> -static int udelay_test_show(struct seq_file *s, void *v)
> -{
> -       int usecs;
> -       int iters;
> -       int ret = 0;
> -
> -       mutex_lock(&udelay_test_lock);
> -       usecs = udelay_test_usecs;
> -       iters = udelay_test_iterations;
> -       mutex_unlock(&udelay_test_lock);
> -
> -       if (usecs > 0 && iters > 0) {
> -               return udelay_test_single(s, usecs, iters);
> -       } else if (usecs == 0) {
> -               struct timespec ts;
> -
> -               ktime_get_ts(&ts);
> -               seq_printf(s, "udelay() test (lpj=%ld kt=%ld.%09ld)\n",
> -                               loops_per_jiffy, ts.tv_sec, ts.tv_nsec);
> -               seq_puts(s, "usage:\n");
> -               seq_puts(s, "echo USECS [ITERS] > " DEBUGFS_FILENAME "\n");
> -               seq_puts(s, "cat " DEBUGFS_FILENAME "\n");
> -       }
> -
> -       return ret;
> -}
> -
> -static int udelay_test_open(struct inode *inode, struct file *file)
> -{
> -       return single_open(file, udelay_test_show, inode->i_private);
> -}
> -
> -static ssize_t udelay_test_write(struct file *file, const char __user *buf,
> -               size_t count, loff_t *pos)
> -{
> -       char lbuf[32];
> -       int ret;
> -       int usecs;
> -       int iters;
> -
> -       if (count >= sizeof(lbuf))
> -               return -EINVAL;
> -
> -       if (copy_from_user(lbuf, buf, count))
> -               return -EFAULT;
> -       lbuf[count] = '\0';
> -
> -       ret = sscanf(lbuf, "%d %d", &usecs, &iters);
> -       if (ret < 1)
> -               return -EINVAL;
> -       else if (ret < 2)
> -               iters = DEFAULT_ITERATIONS;
> -
> -       mutex_lock(&udelay_test_lock);
> -       udelay_test_usecs = usecs;
> -       udelay_test_iterations = iters;
> -       mutex_unlock(&udelay_test_lock);
> -
> -       return count;
> -}
> -
> -static const struct file_operations udelay_test_debugfs_ops = {
> -       .owner = THIS_MODULE,
> -       .open = udelay_test_open,
> -       .read = seq_read,
> -       .write = udelay_test_write,
> -       .llseek = seq_lseek,
> -       .release = single_release,
> -};
> -
> -static int __init udelay_test_init(void)
> -{
> -       mutex_lock(&udelay_test_lock);
> -       udelay_test_debugfs_file = debugfs_create_file(DEBUGFS_FILENAME,
> -                       S_IRUSR, NULL, NULL, &udelay_test_debugfs_ops);
> -       mutex_unlock(&udelay_test_lock);
> -
> -       return 0;
> -}
> -
> -module_init(udelay_test_init);
> -
> -static void __exit udelay_test_exit(void)
> -{
> -       mutex_lock(&udelay_test_lock);
> -       debugfs_remove(udelay_test_debugfs_file);
> -       mutex_unlock(&udelay_test_lock);
> -}
> -
> -module_exit(udelay_test_exit);
> -
> -MODULE_AUTHOR("David Riley <davidriley@chromium.org>");
> -MODULE_LICENSE("GPL");
> --
> 1.9.1
>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* linux-next: manual merge of the driver-core tree with the tip tree
@ 2025-11-17  5:21 Stephen Rothwell
  2025-11-17 21:29 ` Boqun Feng
  0 siblings, 1 reply; 19+ messages in thread
From: Stephen Rothwell @ 2025-11-17  5:21 UTC (permalink / raw)
  To: Greg KH, Danilo Krummrich, Rafael J. Wysocki, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, Peter Zijlstra
  Cc: Boqun Feng, Linux Kernel Mailing List, Linux Next Mailing List

[-- Attachment #1: Type: text/plain, Size: 7978 bytes --]

Hi all,

Today's linux-next merge of the driver-core tree got a conflict in:

  rust/kernel/debugfs/traits.rs

between commit:

  f74cf399e02e ("rust: debugfs: Replace the usage of Rust native atomics")

from the tip tree and commits:

  9c804d9cf2db ("rust: debugfs: support for binary large objects")
  a9fca8a7b2c5 ("rust: debugfs: support blobs from smart pointers")

from the driver-core tree.

I fixed it up (I think - see below) and can carry the fix as necessary. This
complex conflicts.
conflicts should be mentioned to your upstream maintainer when your tree
is now fixed as far as linux-next is concerned, but any non trivial
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly

-- 
Cheers,
Stephen Rothwell

diff --cc rust/kernel/debugfs/traits.rs
index 92054fed2136,82441ac8adaa..000000000000
--- a/rust/kernel/debugfs/traits.rs
+++ b/rust/kernel/debugfs/traits.rs
@@@ -3,12 -3,20 +3,17 @@@
  
  //! Traits for rendering or updating values exported to DebugFS.
  
+ use crate::alloc::Allocator;
+ use crate::fs::file;
  use crate::prelude::*;
+ use crate::sync::Arc;
 +use crate::sync::atomic::{Atomic, AtomicBasicOps, AtomicType, Relaxed};
  use crate::sync::Mutex;
- use crate::uaccess::UserSliceReader;
+ use crate::transmute::{AsBytes, FromBytes};
+ use crate::uaccess::{UserSliceReader, UserSliceWriter};
  use core::fmt::{self, Debug, Formatter};
+ use core::ops::{Deref, DerefMut};
  use core::str::FromStr;
 -use core::sync::atomic::{
 -    AtomicI16, AtomicI32, AtomicI64, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU64,
 -    AtomicU8, AtomicUsize, Ordering,
 -};
  
  /// A trait for types that can be written into a string.
  ///
@@@ -63,21 -175,164 +172,148 @@@ impl<T: FromStr + Unpin> Reader for Mut
      }
  }
  
 +impl<T: AtomicType + FromStr> Reader for Atomic<T>
 +where
 +    T::Repr: AtomicBasicOps,
 +{
 +    fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result {
 +        let mut buf = [0u8; 21]; // Enough for a 64-bit number.
 +        if reader.len() > buf.len() {
 +            return Err(EINVAL);
 +        }
 +        let n = reader.len();
 +        reader.read_slice(&mut buf[..n])?;
 +
 +        let s = core::str::from_utf8(&buf[..n]).map_err(|_| EINVAL)?;
 +        let val = s.trim().parse::<T>().map_err(|_| EINVAL)?;
 +        self.store(val, Relaxed);
 +        Ok(())
 +    }
 +}
++
+ /// Trait for types that can be constructed from a binary representation.
+ ///
+ /// See also [`BinaryReader`] for interior mutability.
+ pub trait BinaryReaderMut {
+     /// Reads the binary form of `self` from `reader`.
+     ///
+     /// Same as [`BinaryReader::read_from_slice`], but takes a mutable reference.
+     ///
+     /// `offset` is the requested offset into the binary representation of `self`.
+     ///
+     /// On success, returns the number of bytes read from `reader`.
+     fn read_from_slice_mut(
+         &mut self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize>;
+ }
+ 
+ // Base implementation for any `T: AsBytes + FromBytes`.
+ impl<T: AsBytes + FromBytes> BinaryReaderMut for T {
+     fn read_from_slice_mut(
+         &mut self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize> {
+         reader.read_slice_file(self.as_bytes_mut(), offset)
+     }
+ }
+ 
+ // Delegate for `Box<T, A>`: Support a `Box<T, A>` with an outer lock.
+ impl<T: ?Sized + BinaryReaderMut, A: Allocator> BinaryReaderMut for Box<T, A> {
+     fn read_from_slice_mut(
+         &mut self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize> {
+         self.deref_mut().read_from_slice_mut(reader, offset)
+     }
+ }
+ 
+ // Delegate for `Vec<T, A>`: Support a `Vec<T, A>` with an outer lock.
+ impl<T, A> BinaryReaderMut for Vec<T, A>
+ where
+     T: AsBytes + FromBytes,
+     A: Allocator,
+ {
+     fn read_from_slice_mut(
+         &mut self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize> {
+         let slice = self.as_mut_slice();
+ 
+         // SAFETY: `T: AsBytes + FromBytes` allows us to treat `&mut [T]` as `&mut [u8]`.
+         let buffer = unsafe {
+             core::slice::from_raw_parts_mut(
+                 slice.as_mut_ptr().cast(),
+                 core::mem::size_of_val(slice),
+             )
+         };
+ 
+         reader.read_slice_file(buffer, offset)
+     }
+ }
+ 
+ /// Trait for types that can be constructed from a binary representation.
+ ///
+ /// See also [`BinaryReaderMut`] for the mutable version.
+ pub trait BinaryReader {
+     /// Reads the binary form of `self` from `reader`.
+     ///
+     /// `offset` is the requested offset into the binary representation of `self`.
+     ///
+     /// On success, returns the number of bytes read from `reader`.
+     fn read_from_slice(
+         &self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize>;
+ }
+ 
+ // Delegate for `Mutex<T>`: Support a `T` with an outer `Mutex`.
+ impl<T: BinaryReaderMut + Unpin> BinaryReader for Mutex<T> {
+     fn read_from_slice(
+         &self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize> {
+         let mut this = self.lock();
+ 
+         this.read_from_slice_mut(reader, offset)
+     }
+ }
+ 
+ // Delegate for `Box<T, A>`: Support a `Box<T, A>` with an inner lock.
+ impl<T: ?Sized + BinaryReader, A: Allocator> BinaryReader for Box<T, A> {
+     fn read_from_slice(
+         &self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize> {
+         self.deref().read_from_slice(reader, offset)
+     }
+ }
+ 
+ // Delegate for `Pin<Box<T, A>>`: Support a `Pin<Box<T, A>>` with an inner lock.
+ impl<T: ?Sized + BinaryReader, A: Allocator> BinaryReader for Pin<Box<T, A>> {
+     fn read_from_slice(
+         &self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize> {
+         self.deref().read_from_slice(reader, offset)
+     }
+ }
+ 
+ // Delegate for `Arc<T>`: Support an `Arc<T>` with an inner lock.
+ impl<T: ?Sized + BinaryReader> BinaryReader for Arc<T> {
+     fn read_from_slice(
+         &self,
+         reader: &mut UserSliceReader,
+         offset: &mut file::Offset,
+     ) -> Result<usize> {
+         self.deref().read_from_slice(reader, offset)
+     }
+ }
 -
 -macro_rules! impl_reader_for_atomic {
 -    ($(($atomic_type:ty, $int_type:ty)),*) => {
 -        $(
 -            impl Reader for $atomic_type {
 -                fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result {
 -                    let mut buf = [0u8; 21]; // Enough for a 64-bit number.
 -                    if reader.len() > buf.len() {
 -                        return Err(EINVAL);
 -                    }
 -                    let n = reader.len();
 -                    reader.read_slice(&mut buf[..n])?;
 -
 -                    let s = core::str::from_utf8(&buf[..n]).map_err(|_| EINVAL)?;
 -                    let val = s.trim().parse::<$int_type>().map_err(|_| EINVAL)?;
 -                    self.store(val, Ordering::Relaxed);
 -                    Ok(())
 -                }
 -            }
 -        )*
 -    };
 -}
 -
 -impl_reader_for_atomic!(
 -    (AtomicI16, i16),
 -    (AtomicI32, i32),
 -    (AtomicI64, i64),
 -    (AtomicI8, i8),
 -    (AtomicIsize, isize),
 -    (AtomicU16, u16),
 -    (AtomicU32, u32),
 -    (AtomicU64, u64),
 -    (AtomicU8, u8),
 -    (AtomicUsize, usize)
 -);

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* linux-next: manual merge of the driver-core tree with the tip tree
@ 2025-11-17  5:30 Stephen Rothwell
  2025-11-17 21:34 ` Boqun Feng
  0 siblings, 1 reply; 19+ messages in thread
From: Stephen Rothwell @ 2025-11-17  5:30 UTC (permalink / raw)
  To: Greg KH, Danilo Krummrich, Rafael J. Wysocki, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, Peter Zijlstra
  Cc: Boqun Feng, Linux Kernel Mailing List, Linux Next Mailing List

[-- Attachment #1: Type: text/plain, Size: 3719 bytes --]

Hi all,

Today's linux-next merge of the driver-core tree got conflicts in:

  samples/rust/rust_debugfs.rs
  samples/rust/rust_debugfs_scoped.rs

between commit:

  f74cf399e02e ("rust: debugfs: Replace the usage of Rust native atomics")

from the tip tree and commits:

  0242623384c7 ("rust: driver: let probe() return impl PinInit<Self, Error>")
  52af0c37964b ("samples: rust: debugfs: add example for blobs")
  f656279afde1 ("samples: rust: debugfs_scoped: add example for blobs")

from the driver-core tree.

I fixed it up (I think - see below) and can carry the fix as necessary.
This is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.

-- 
Cheers,
Stephen Rothwell

diff --cc samples/rust/rust_debugfs.rs
index 711faa07bece,c45b568d951b..000000000000
--- a/samples/rust/rust_debugfs.rs
+++ b/samples/rust/rust_debugfs.rs
@@@ -36,8 -38,9 +36,9 @@@ use kernel::c_str
  use kernel::debugfs::{Dir, File};
  use kernel::new_mutex;
  use kernel::prelude::*;
+ use kernel::sizes::*;
 +use kernel::sync::atomic::{Atomic, Relaxed};
  use kernel::sync::Mutex;
 -
  use kernel::{acpi, device::Core, of, platform, str::CString, types::ARef};
  
  kernel::module_platform_driver! {
@@@ -57,9 -60,13 +58,13 @@@ struct RustDebugFs 
      #[pin]
      _compatible: File<CString>,
      #[pin]
 -    counter: File<AtomicUsize>,
 +    counter: File<Atomic<usize>>,
      #[pin]
      inner: File<Mutex<Inner>>,
+     #[pin]
+     array_blob: File<Mutex<[u8; 4]>>,
+     #[pin]
+     vector_blob: File<Mutex<KVec<u8>>>,
  }
  
  #[derive(Debug)]
@@@ -104,16 -111,17 +109,17 @@@ impl platform::Driver for RustDebugFs 
      fn probe(
          pdev: &platform::Device<Core>,
          _info: Option<&Self::IdInfo>,
-     ) -> Result<Pin<KBox<Self>>> {
-         let result = KBox::try_pin_init(RustDebugFs::new(pdev), GFP_KERNEL)?;
-         // We can still mutate fields through the files which are atomic or mutexed:
-         result.counter.store(91, Relaxed);
-         {
-             let mut guard = result.inner.lock();
-             guard.x = guard.y;
-             guard.y = 42;
-         }
-         Ok(result)
+     ) -> impl PinInit<Self, Error> {
+         RustDebugFs::new(pdev).pin_chain(|this| {
 -            this.counter.store(91, Ordering::Relaxed);
++            this.counter.store(91, Relaxed);
+             {
+                 let mut guard = this.inner.lock();
+                 guard.x = guard.y;
+                 guard.y = 42;
+             }
+ 
+             Ok(())
+         })
      }
  }
  
diff --cc samples/rust/rust_debugfs_scoped.rs
index 9f0ec5f24cda,c80312cf168d..000000000000
--- a/samples/rust/rust_debugfs_scoped.rs
+++ b/samples/rust/rust_debugfs_scoped.rs
@@@ -6,9 -6,10 +6,10 @@@
  //! `Scope::dir` to create a variety of files without the need to separately
  //! track them all.
  
 -use core::sync::atomic::AtomicUsize;
  use kernel::debugfs::{Dir, Scope};
  use kernel::prelude::*;
+ use kernel::sizes::*;
 +use kernel::sync::atomic::Atomic;
  use kernel::sync::Mutex;
  use kernel::{c_str, new_mutex, str::CString};
  
@@@ -109,7 -114,8 +114,8 @@@ impl ModuleData 
  
  struct DeviceData {
      name: CString,
 -    nums: KVec<AtomicUsize>,
 +    nums: KVec<Atomic<usize>>,
+     blob: Pin<KBox<Mutex<[u8; SZ_4K]>>>,
  }
  
  fn init_control(base_dir: &Dir, dyn_dirs: Dir) -> impl PinInit<Scope<ModuleData>> + '_ {

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2025-11-17  5:21 Stephen Rothwell
@ 2025-11-17 21:29 ` Boqun Feng
  0 siblings, 0 replies; 19+ messages in thread
From: Boqun Feng @ 2025-11-17 21:29 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: Greg KH, Danilo Krummrich, Rafael J. Wysocki, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, Peter Zijlstra,
	Linux Kernel Mailing List, Linux Next Mailing List

On Mon, Nov 17, 2025 at 04:21:54PM +1100, Stephen Rothwell wrote:
> Hi all,
> 

Hi Stephen,

> Today's linux-next merge of the driver-core tree got a conflict in:
> 
>   rust/kernel/debugfs/traits.rs
> 
> between commit:
> 
>   f74cf399e02e ("rust: debugfs: Replace the usage of Rust native atomics")
> 
> from the tip tree and commits:
> 
>   9c804d9cf2db ("rust: debugfs: support for binary large objects")
>   a9fca8a7b2c5 ("rust: debugfs: support blobs from smart pointers")
> 
> from the driver-core tree.
> 
> I fixed it up (I think - see below) and can carry the fix as necessary. This
> complex conflicts.

Thank you for reporting this, the fix looks good to me and I also did a
rust doc test on next-20251117, and confirm it works. Thank you!

> conflicts should be mentioned to your upstream maintainer when your tree
> is now fixed as far as linux-next is concerned, but any non trivial
> is submitted for merging.  You may also want to consider cooperating
> with the maintainer of the conflicting tree to minimise any particularly
> 

Greg and Peter, any concern about this conflict? It's not very trivial,
but I believe it's not too much work to resolve then (just removing the
Atomic* usage and use the LKMM atomic).

Regards,
Boqun

> -- 
> Cheers,
> Stephen Rothwell
> 
> diff --cc rust/kernel/debugfs/traits.rs
> index 92054fed2136,82441ac8adaa..000000000000
> --- a/rust/kernel/debugfs/traits.rs
> +++ b/rust/kernel/debugfs/traits.rs
> @@@ -3,12 -3,20 +3,17 @@@
>   
>   //! Traits for rendering or updating values exported to DebugFS.
>   
> + use crate::alloc::Allocator;
> + use crate::fs::file;
>   use crate::prelude::*;
> + use crate::sync::Arc;
>  +use crate::sync::atomic::{Atomic, AtomicBasicOps, AtomicType, Relaxed};
>   use crate::sync::Mutex;
> - use crate::uaccess::UserSliceReader;
> + use crate::transmute::{AsBytes, FromBytes};
> + use crate::uaccess::{UserSliceReader, UserSliceWriter};
>   use core::fmt::{self, Debug, Formatter};
> + use core::ops::{Deref, DerefMut};
>   use core::str::FromStr;
>  -use core::sync::atomic::{
>  -    AtomicI16, AtomicI32, AtomicI64, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU64,
>  -    AtomicU8, AtomicUsize, Ordering,
>  -};
>   
>   /// A trait for types that can be written into a string.
>   ///
> @@@ -63,21 -175,164 +172,148 @@@ impl<T: FromStr + Unpin> Reader for Mut
>       }
>   }
>   
>  +impl<T: AtomicType + FromStr> Reader for Atomic<T>
>  +where
>  +    T::Repr: AtomicBasicOps,
>  +{
>  +    fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result {
>  +        let mut buf = [0u8; 21]; // Enough for a 64-bit number.
>  +        if reader.len() > buf.len() {
>  +            return Err(EINVAL);
>  +        }
>  +        let n = reader.len();
>  +        reader.read_slice(&mut buf[..n])?;
>  +
>  +        let s = core::str::from_utf8(&buf[..n]).map_err(|_| EINVAL)?;
>  +        let val = s.trim().parse::<T>().map_err(|_| EINVAL)?;
>  +        self.store(val, Relaxed);
>  +        Ok(())
>  +    }
>  +}
> ++
> + /// Trait for types that can be constructed from a binary representation.
> + ///
> + /// See also [`BinaryReader`] for interior mutability.
> + pub trait BinaryReaderMut {
> +     /// Reads the binary form of `self` from `reader`.
> +     ///
> +     /// Same as [`BinaryReader::read_from_slice`], but takes a mutable reference.
> +     ///
> +     /// `offset` is the requested offset into the binary representation of `self`.
> +     ///
> +     /// On success, returns the number of bytes read from `reader`.
> +     fn read_from_slice_mut(
> +         &mut self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize>;
> + }
> + 
> + // Base implementation for any `T: AsBytes + FromBytes`.
> + impl<T: AsBytes + FromBytes> BinaryReaderMut for T {
> +     fn read_from_slice_mut(
> +         &mut self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize> {
> +         reader.read_slice_file(self.as_bytes_mut(), offset)
> +     }
> + }
> + 
> + // Delegate for `Box<T, A>`: Support a `Box<T, A>` with an outer lock.
> + impl<T: ?Sized + BinaryReaderMut, A: Allocator> BinaryReaderMut for Box<T, A> {
> +     fn read_from_slice_mut(
> +         &mut self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize> {
> +         self.deref_mut().read_from_slice_mut(reader, offset)
> +     }
> + }
> + 
> + // Delegate for `Vec<T, A>`: Support a `Vec<T, A>` with an outer lock.
> + impl<T, A> BinaryReaderMut for Vec<T, A>
> + where
> +     T: AsBytes + FromBytes,
> +     A: Allocator,
> + {
> +     fn read_from_slice_mut(
> +         &mut self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize> {
> +         let slice = self.as_mut_slice();
> + 
> +         // SAFETY: `T: AsBytes + FromBytes` allows us to treat `&mut [T]` as `&mut [u8]`.
> +         let buffer = unsafe {
> +             core::slice::from_raw_parts_mut(
> +                 slice.as_mut_ptr().cast(),
> +                 core::mem::size_of_val(slice),
> +             )
> +         };
> + 
> +         reader.read_slice_file(buffer, offset)
> +     }
> + }
> + 
> + /// Trait for types that can be constructed from a binary representation.
> + ///
> + /// See also [`BinaryReaderMut`] for the mutable version.
> + pub trait BinaryReader {
> +     /// Reads the binary form of `self` from `reader`.
> +     ///
> +     /// `offset` is the requested offset into the binary representation of `self`.
> +     ///
> +     /// On success, returns the number of bytes read from `reader`.
> +     fn read_from_slice(
> +         &self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize>;
> + }
> + 
> + // Delegate for `Mutex<T>`: Support a `T` with an outer `Mutex`.
> + impl<T: BinaryReaderMut + Unpin> BinaryReader for Mutex<T> {
> +     fn read_from_slice(
> +         &self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize> {
> +         let mut this = self.lock();
> + 
> +         this.read_from_slice_mut(reader, offset)
> +     }
> + }
> + 
> + // Delegate for `Box<T, A>`: Support a `Box<T, A>` with an inner lock.
> + impl<T: ?Sized + BinaryReader, A: Allocator> BinaryReader for Box<T, A> {
> +     fn read_from_slice(
> +         &self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize> {
> +         self.deref().read_from_slice(reader, offset)
> +     }
> + }
> + 
> + // Delegate for `Pin<Box<T, A>>`: Support a `Pin<Box<T, A>>` with an inner lock.
> + impl<T: ?Sized + BinaryReader, A: Allocator> BinaryReader for Pin<Box<T, A>> {
> +     fn read_from_slice(
> +         &self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize> {
> +         self.deref().read_from_slice(reader, offset)
> +     }
> + }
> + 
> + // Delegate for `Arc<T>`: Support an `Arc<T>` with an inner lock.
> + impl<T: ?Sized + BinaryReader> BinaryReader for Arc<T> {
> +     fn read_from_slice(
> +         &self,
> +         reader: &mut UserSliceReader,
> +         offset: &mut file::Offset,
> +     ) -> Result<usize> {
> +         self.deref().read_from_slice(reader, offset)
> +     }
> + }
>  -
>  -macro_rules! impl_reader_for_atomic {
>  -    ($(($atomic_type:ty, $int_type:ty)),*) => {
>  -        $(
>  -            impl Reader for $atomic_type {
>  -                fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result {
>  -                    let mut buf = [0u8; 21]; // Enough for a 64-bit number.
>  -                    if reader.len() > buf.len() {
>  -                        return Err(EINVAL);
>  -                    }
>  -                    let n = reader.len();
>  -                    reader.read_slice(&mut buf[..n])?;
>  -
>  -                    let s = core::str::from_utf8(&buf[..n]).map_err(|_| EINVAL)?;
>  -                    let val = s.trim().parse::<$int_type>().map_err(|_| EINVAL)?;
>  -                    self.store(val, Ordering::Relaxed);
>  -                    Ok(())
>  -                }
>  -            }
>  -        )*
>  -    };
>  -}
>  -
>  -impl_reader_for_atomic!(
>  -    (AtomicI16, i16),
>  -    (AtomicI32, i32),
>  -    (AtomicI64, i64),
>  -    (AtomicI8, i8),
>  -    (AtomicIsize, isize),
>  -    (AtomicU16, u16),
>  -    (AtomicU32, u32),
>  -    (AtomicU64, u64),
>  -    (AtomicU8, u8),
>  -    (AtomicUsize, usize)
>  -);



^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: linux-next: manual merge of the driver-core tree with the tip tree
  2025-11-17  5:30 linux-next: manual merge of the driver-core tree with the tip tree Stephen Rothwell
@ 2025-11-17 21:34 ` Boqun Feng
  0 siblings, 0 replies; 19+ messages in thread
From: Boqun Feng @ 2025-11-17 21:34 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: Greg KH, Danilo Krummrich, Rafael J. Wysocki, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, Peter Zijlstra,
	Linux Kernel Mailing List, Linux Next Mailing List

On Mon, Nov 17, 2025 at 04:30:33PM +1100, Stephen Rothwell wrote:
> Hi all,
> 
> Today's linux-next merge of the driver-core tree got conflicts in:
> 
>   samples/rust/rust_debugfs.rs
>   samples/rust/rust_debugfs_scoped.rs
> 
> between commit:
> 
>   f74cf399e02e ("rust: debugfs: Replace the usage of Rust native atomics")
> 
> from the tip tree and commits:
> 
>   0242623384c7 ("rust: driver: let probe() return impl PinInit<Self, Error>")
>   52af0c37964b ("samples: rust: debugfs: add example for blobs")
>   f656279afde1 ("samples: rust: debugfs_scoped: add example for blobs")
> 
> from the driver-core tree.
> 
> I fixed it up (I think - see below) and can carry the fix as necessary.

Again, this fix looks good to me. Thanks!

Regards,
Boqun

> This is now fixed as far as linux-next is concerned, but any non trivial
> conflicts should be mentioned to your upstream maintainer when your tree
> is submitted for merging.  You may also want to consider cooperating
> with the maintainer of the conflicting tree to minimise any particularly
> complex conflicts.
> 
> -- 
> Cheers,
> Stephen Rothwell
> 
> diff --cc samples/rust/rust_debugfs.rs
> index 711faa07bece,c45b568d951b..000000000000
> --- a/samples/rust/rust_debugfs.rs
> +++ b/samples/rust/rust_debugfs.rs
> @@@ -36,8 -38,9 +36,9 @@@ use kernel::c_str
>   use kernel::debugfs::{Dir, File};
>   use kernel::new_mutex;
>   use kernel::prelude::*;
> + use kernel::sizes::*;
>  +use kernel::sync::atomic::{Atomic, Relaxed};
>   use kernel::sync::Mutex;
>  -
>   use kernel::{acpi, device::Core, of, platform, str::CString, types::ARef};
>   
>   kernel::module_platform_driver! {
> @@@ -57,9 -60,13 +58,13 @@@ struct RustDebugFs 
>       #[pin]
>       _compatible: File<CString>,
>       #[pin]
>  -    counter: File<AtomicUsize>,
>  +    counter: File<Atomic<usize>>,
>       #[pin]
>       inner: File<Mutex<Inner>>,
> +     #[pin]
> +     array_blob: File<Mutex<[u8; 4]>>,
> +     #[pin]
> +     vector_blob: File<Mutex<KVec<u8>>>,
>   }
>   
>   #[derive(Debug)]
> @@@ -104,16 -111,17 +109,17 @@@ impl platform::Driver for RustDebugFs 
>       fn probe(
>           pdev: &platform::Device<Core>,
>           _info: Option<&Self::IdInfo>,
> -     ) -> Result<Pin<KBox<Self>>> {
> -         let result = KBox::try_pin_init(RustDebugFs::new(pdev), GFP_KERNEL)?;
> -         // We can still mutate fields through the files which are atomic or mutexed:
> -         result.counter.store(91, Relaxed);
> -         {
> -             let mut guard = result.inner.lock();
> -             guard.x = guard.y;
> -             guard.y = 42;
> -         }
> -         Ok(result)
> +     ) -> impl PinInit<Self, Error> {
> +         RustDebugFs::new(pdev).pin_chain(|this| {
>  -            this.counter.store(91, Ordering::Relaxed);
> ++            this.counter.store(91, Relaxed);
> +             {
> +                 let mut guard = this.inner.lock();
> +                 guard.x = guard.y;
> +                 guard.y = 42;
> +             }
> + 
> +             Ok(())
> +         })
>       }
>   }
>   
> diff --cc samples/rust/rust_debugfs_scoped.rs
> index 9f0ec5f24cda,c80312cf168d..000000000000
> --- a/samples/rust/rust_debugfs_scoped.rs
> +++ b/samples/rust/rust_debugfs_scoped.rs
> @@@ -6,9 -6,10 +6,10 @@@
>   //! `Scope::dir` to create a variety of files without the need to separately
>   //! track them all.
>   
>  -use core::sync::atomic::AtomicUsize;
>   use kernel::debugfs::{Dir, Scope};
>   use kernel::prelude::*;
> + use kernel::sizes::*;
>  +use kernel::sync::atomic::Atomic;
>   use kernel::sync::Mutex;
>   use kernel::{c_str, new_mutex, str::CString};
>   
> @@@ -109,7 -114,8 +114,8 @@@ impl ModuleData 
>   
>   struct DeviceData {
>       name: CString,
>  -    nums: KVec<AtomicUsize>,
>  +    nums: KVec<Atomic<usize>>,
> +     blob: Pin<KBox<Mutex<[u8; SZ_4K]>>>,
>   }
>   
>   fn init_control(base_dir: &Dir, dyn_dirs: Dir) -> impl PinInit<Scope<ModuleData>> + '_ {



^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2025-11-17 21:34 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-31  7:07 linux-next: manual merge of the driver-core tree with the tip tree Stephen Rothwell
2014-08-01  0:20 ` Greg KH
2014-08-01 23:38   ` Kees Cook
2014-08-02  2:40     ` Greg KH
2014-08-04 18:27     ` John Stultz
2014-08-04 18:35     ` [PATCH] time: Rename udelay_test.c to test_udelay.c John Stultz
2014-08-04 19:35       ` Kees Cook
2014-08-06 16:31       ` David Riley
  -- strict thread matches above, loose matches on Subject: below --
2025-11-17  5:30 linux-next: manual merge of the driver-core tree with the tip tree Stephen Rothwell
2025-11-17 21:34 ` Boqun Feng
2025-11-17  5:21 Stephen Rothwell
2025-11-17 21:29 ` Boqun Feng
2014-03-13  0:07 Mark Brown
2013-04-11  5:30 Stephen Rothwell
2013-04-11 13:26 ` Greg KH
2012-11-29  4:24 Stephen Rothwell
2012-11-29  5:19 ` Greg KH
2011-12-28  4:57 Stephen Rothwell
2012-01-04 22:52 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).