[PATCH 00/35] treewide trivial patches converting pr_warning to pr_warn

STALE3393d

8 messages, 5 authors, 2017-03-21 · open the first message on its own page

[PATCH 00/35] treewide trivial patches converting pr_warning to pr_warn

From: Joe Perches <joe@perches.com>
Date: 2017-02-17 07:20:34

There are ~4300 uses of pr_warn and ~250 uses of the older
pr_warning in the kernel source tree.

Make the use of pr_warn consistent across all kernel files.

This excludes all files in tools/ as there is a separate
define pr_warning for that directory tree and pr_warn is
not used in tools/.

Done with 'sed s/\bpr_warning\b/pr_warn/' and some emacsing.

Miscellanea:

o Coalesce formats and realign arguments

Some files not compiled - no cross-compilers

Joe Perches (35):
  alpha: Convert remaining uses of pr_warning to pr_warn
  ARM: ep93xx: Convert remaining uses of pr_warning to pr_warn
  arm64: Convert remaining uses of pr_warning to pr_warn
  arch/blackfin: Convert remaining uses of pr_warning to pr_warn
  ia64: Convert remaining use of pr_warning to pr_warn
  powerpc: Convert remaining uses of pr_warning to pr_warn
  sh: Convert remaining uses of pr_warning to pr_warn
  sparc: Convert remaining use of pr_warning to pr_warn
  x86: Convert remaining uses of pr_warning to pr_warn
  drivers/acpi: Convert remaining uses of pr_warning to pr_warn
  block/drbd: Convert remaining uses of pr_warning to pr_warn
  gdrom: Convert remaining uses of pr_warning to pr_warn
  drivers/char: Convert remaining use of pr_warning to pr_warn
  clocksource: Convert remaining use of pr_warning to pr_warn
  drivers/crypto: Convert remaining uses of pr_warning to pr_warn
  fmc: Convert remaining use of pr_warning to pr_warn
  drivers/gpu: Convert remaining uses of pr_warning to pr_warn
  drivers/ide: Convert remaining uses of pr_warning to pr_warn
  drivers/input: Convert remaining uses of pr_warning to pr_warn
  drivers/isdn: Convert remaining uses of pr_warning to pr_warn
  drivers/macintosh: Convert remaining uses of pr_warning to pr_warn
  drivers/media: Convert remaining use of pr_warning to pr_warn
  drivers/mfd: Convert remaining uses of pr_warning to pr_warn
  drivers/mtd: Convert remaining uses of pr_warning to pr_warn
  drivers/of: Convert remaining uses of pr_warning to pr_warn
  drivers/oprofile: Convert remaining uses of pr_warning to pr_warn
  drivers/platform: Convert remaining uses of pr_warning to pr_warn
  drivers/rapidio: Convert remaining use of pr_warning to pr_warn
  drivers/scsi: Convert remaining use of pr_warning to pr_warn
  drivers/sh: Convert remaining use of pr_warning to pr_warn
  drivers/tty: Convert remaining uses of pr_warning to pr_warn
  drivers/video: Convert remaining uses of pr_warning to pr_warn
  kernel/trace: Convert remaining uses of pr_warning to pr_warn
  lib: Convert remaining uses of pr_warning to pr_warn
  sound/soc: Convert remaining uses of pr_warning to pr_warn

 arch/alpha/kernel/perf_event.c                     |  4 +-
 arch/arm/mach-ep93xx/core.c                        |  4 +-
 arch/arm64/include/asm/syscall.h                   |  8 ++--
 arch/arm64/kernel/hw_breakpoint.c                  |  8 ++--
 arch/arm64/kernel/smp.c                            |  4 +-
 arch/blackfin/kernel/nmi.c                         |  2 +-
 arch/blackfin/kernel/ptrace.c                      |  2 +-
 arch/blackfin/mach-bf533/boards/stamp.c            |  2 +-
 arch/blackfin/mach-bf537/boards/cm_bf537e.c        |  2 +-
 arch/blackfin/mach-bf537/boards/cm_bf537u.c        |  2 +-
 arch/blackfin/mach-bf537/boards/stamp.c            |  2 +-
 arch/blackfin/mach-bf537/boards/tcm_bf537.c        |  2 +-
 arch/blackfin/mach-bf561/boards/cm_bf561.c         |  2 +-
 arch/blackfin/mach-bf561/boards/ezkit.c            |  2 +-
 arch/blackfin/mm/isram-driver.c                    |  4 +-
 arch/ia64/kernel/setup.c                           |  6 +--
 arch/powerpc/kernel/pci-common.c                   |  4 +-
 arch/powerpc/mm/init_64.c                          |  5 +--
 arch/powerpc/mm/mem.c                              |  3 +-
 arch/powerpc/platforms/512x/mpc512x_shared.c       |  4 +-
 arch/powerpc/platforms/85xx/socrates_fpga_pic.c    |  7 ++--
 arch/powerpc/platforms/86xx/mpc86xx_hpcn.c         |  2 +-
 arch/powerpc/platforms/pasemi/dma_lib.c            |  4 +-
 arch/powerpc/platforms/powernv/opal.c              |  8 ++--
 arch/powerpc/platforms/powernv/pci-ioda.c          | 10 ++---
 arch/powerpc/platforms/ps3/device-init.c           | 14 +++----
 arch/powerpc/platforms/ps3/mm.c                    |  4 +-
 arch/powerpc/platforms/ps3/os-area.c               |  2 +-
 arch/powerpc/platforms/pseries/iommu.c             |  8 ++--
 arch/powerpc/platforms/pseries/setup.c             |  4 +-
 arch/powerpc/sysdev/fsl_pci.c                      |  9 ++---
 arch/powerpc/sysdev/mpic.c                         | 10 ++---
 arch/powerpc/sysdev/xics/icp-native.c              | 10 ++---
 arch/powerpc/sysdev/xics/ics-opal.c                |  4 +-
 arch/powerpc/sysdev/xics/ics-rtas.c                |  4 +-
 arch/powerpc/sysdev/xics/xics-common.c             |  8 ++--
 arch/sh/boards/mach-sdk7786/nmi.c                  |  2 +-
 arch/sh/drivers/pci/fixups-sdk7786.c               |  2 +-
 arch/sh/kernel/io_trapped.c                        |  2 +-
 arch/sh/kernel/setup.c                             |  2 +-
 arch/sh/mm/consistent.c                            |  5 +--
 arch/sparc/kernel/smp_64.c                         |  5 +--
 arch/x86/kernel/amd_gart_64.c                      | 12 ++----
 arch/x86/kernel/apic/apic.c                        | 46 ++++++++++------------
 arch/x86/kernel/apic/apic_noop.c                   |  2 +-
 arch/x86/kernel/setup_percpu.c                     |  4 +-
 arch/x86/kernel/tboot.c                            | 15 ++++---
 arch/x86/kernel/tsc_sync.c                         |  8 ++--
 arch/x86/mm/kmmio.c                                |  8 ++--
 arch/x86/mm/mmio-mod.c                             |  5 +--
 arch/x86/mm/numa.c                                 | 12 +++---
 arch/x86/mm/numa_emulation.c                       |  6 +--
 arch/x86/mm/testmmiotrace.c                        |  5 +--
 arch/x86/oprofile/op_x86_model.h                   |  6 +--
 arch/x86/platform/olpc/olpc-xo15-sci.c             |  2 +-
 arch/x86/platform/sfi/sfi.c                        |  3 +-
 arch/x86/xen/debugfs.c                             |  2 +-
 arch/x86/xen/setup.c                               |  2 +-
 drivers/acpi/apei/apei-base.c                      | 32 +++++++--------
 drivers/acpi/apei/einj.c                           |  4 +-
 drivers/acpi/apei/erst-dbg.c                       |  4 +-
 drivers/acpi/apei/ghes.c                           | 30 +++++++-------
 drivers/acpi/apei/hest.c                           | 10 ++---
 drivers/acpi/resource.c                            |  4 +-
 drivers/block/drbd/drbd_nl.c                       | 13 +++---
 drivers/cdrom/gdrom.c                              |  4 +-
 drivers/char/virtio_console.c                      |  2 +-
 drivers/clocksource/samsung_pwm_timer.c            |  4 +-
 drivers/crypto/n2_core.c                           | 12 +++---
 drivers/fmc/fmc-fakedev.c                          |  2 +-
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c   |  2 +-
 drivers/gpu/drm/amd/powerplay/inc/pp_debug.h       |  2 +-
 drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.c    |  4 +-
 drivers/gpu/drm/amd/powerplay/smumgr/iceland_smc.c | 14 +++----
 .../gpu/drm/amd/powerplay/smumgr/polaris10_smc.c   |  4 +-
 drivers/gpu/drm/amd/powerplay/smumgr/tonga_smc.c   |  4 +-
 drivers/ide/tx4938ide.c                            |  2 +-
 drivers/ide/tx4939ide.c                            |  5 +--
 drivers/input/gameport/gameport.c                  |  4 +-
 drivers/input/joystick/gamecon.c                   |  3 +-
 drivers/input/misc/apanel.c                        |  3 +-
 drivers/input/misc/xen-kbdfront.c                  |  8 ++--
 drivers/input/serio/serio.c                        |  8 ++--
 drivers/isdn/gigaset/interface.c                   |  2 +-
 drivers/isdn/hardware/mISDN/avmfritz.c             | 17 ++++----
 drivers/isdn/hardware/mISDN/hfcmulti.c             |  8 ++--
 drivers/isdn/hardware/mISDN/hfcpci.c               |  4 +-
 drivers/isdn/hardware/mISDN/hfcsusb.c              |  4 +-
 drivers/isdn/hardware/mISDN/mISDNipac.c            |  4 +-
 drivers/isdn/hardware/mISDN/mISDNisar.c            | 10 ++---
 drivers/isdn/hardware/mISDN/netjet.c               |  8 ++--
 drivers/isdn/hardware/mISDN/w6692.c                | 12 +++---
 drivers/isdn/mISDN/hwchannel.c                     |  8 ++--
 drivers/macintosh/windfarm_fcu_controls.c          |  5 +--
 drivers/macintosh/windfarm_lm87_sensor.c           |  4 +-
 drivers/macintosh/windfarm_pm72.c                  | 22 +++++------
 drivers/macintosh/windfarm_rm31.c                  |  6 +--
 drivers/media/platform/sh_vou.c                    |  4 +-
 drivers/mfd/db8500-prcmu.c                         |  2 +-
 drivers/mfd/sta2x11-mfd.c                          |  4 +-
 drivers/mfd/twl4030-power.c                        |  7 +---
 drivers/mtd/chips/cfi_cmdset_0002.c                | 12 ++++--
 drivers/mtd/nand/cmx270_nand.c                     |  4 +-
 drivers/mtd/ofpart.c                               |  4 +-
 drivers/of/fdt.c                                   | 20 +++++-----
 drivers/oprofile/oprofile_perf.c                   |  8 ++--
 drivers/platform/x86/asus-laptop.c                 |  2 +-
 drivers/platform/x86/eeepc-laptop.c                |  2 +-
 drivers/platform/x86/intel_oaktrail.c              | 10 ++---
 drivers/rapidio/rio-sysfs.c                        |  4 +-
 drivers/scsi/a3000.c                               |  2 +-
 drivers/sh/intc/core.c                             |  4 +-
 drivers/tty/hvc/hvcs.c                             |  2 +-
 drivers/tty/tty_io.c                               |  4 +-
 drivers/video/fbdev/aty/radeon_base.c              |  4 +-
 drivers/video/fbdev/core/fbmon.c                   |  4 +-
 drivers/video/fbdev/pxafb.c                        |  7 ++--
 kernel/trace/trace_benchmark.c                     |  4 +-
 lib/cpu_rmap.c                                     |  2 +-
 lib/dma-debug.c                                    |  2 +-
 sound/soc/fsl/imx-audmux.c                         |  6 +--
 sound/soc/samsung/s3c-i2s-v2.c                     |  6 +--
 122 files changed, 367 insertions(+), 397 deletions(-)

-- 
2.10.0.rc2.1.g053435c

[PATCH 32/35] drivers/video: Convert remaining uses of pr_warning to pr_warn

From: Joe Perches <joe@perches.com>
Date: 2017-02-17 07:13:27

To enable eventual removal of pr_warning

This makes pr_warn use consistent for drivers/video

Prior to this patch, there were 6 uses of pr_warning and
25 uses of pr_warn in drivers/video

Signed-off-by: Joe Perches <joe@perches.com>
---
 drivers/video/fbdev/aty/radeon_base.c | 4 ++--
 drivers/video/fbdev/core/fbmon.c      | 4 ++--
 drivers/video/fbdev/pxafb.c           | 7 +++----
 3 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/drivers/video/fbdev/aty/radeon_base.c b/drivers/video/fbdev/aty/radeon_base.c
index 218339a4edaa..6b4c7872b375 100644
--- a/drivers/video/fbdev/aty/radeon_base.c
+++ b/drivers/video/fbdev/aty/radeon_base.c
@@ -2453,8 +2453,8 @@ static int radeonfb_pci_register(struct pci_dev *pdev,
 		err |= sysfs_create_bin_file(&rinfo->pdev->dev.kobj,
 						&edid2_attr);
 	if (err)
-		pr_warning("%s() Creating sysfs files failed, continuing\n",
-			   __func__);
+		pr_warn("%s() Creating sysfs files failed, continuing\n",
+			__func__);
 
 	/* save current mode regs before we switch into the new one
 	 * so we can restore this upon __exit
diff --git a/drivers/video/fbdev/core/fbmon.c b/drivers/video/fbdev/core/fbmon.c
index 62c0cf79674f..687ebb053438 100644
--- a/drivers/video/fbdev/core/fbmon.c
+++ b/drivers/video/fbdev/core/fbmon.c
@@ -1073,9 +1073,9 @@ void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs)
 	for (i = specs->modedb_len + num; i < specs->modedb_len + num + svd_n; i++) {
 		int idx = svd[i - specs->modedb_len - num];
 		if (!idx || idx >= ARRAY_SIZE(cea_modes)) {
-			pr_warning("Reserved SVD code %d\n", idx);
+			pr_warn("Reserved SVD code %d\n", idx);
 		} else if (!cea_modes[idx].xres) {
-			pr_warning("Unimplemented SVD code %d\n", idx);
+			pr_warn("Unimplemented SVD code %d\n", idx);
 		} else {
 			memcpy(&m[i], cea_modes + idx, sizeof(m[i]));
 			pr_debug("Adding SVD #%d: %ux%u@%u\n", idx,
diff --git a/drivers/video/fbdev/pxafb.c b/drivers/video/fbdev/pxafb.c
index ef73f14d7ba0..b21a89b03fb4 100644
--- a/drivers/video/fbdev/pxafb.c
+++ b/drivers/video/fbdev/pxafb.c
@@ -645,7 +645,7 @@ static void overlay1fb_disable(struct pxafb_layer *ofb)
 	lcd_writel(ofb->fbi, FBR1, ofb->fbi->fdadr[DMA_OV1] | 0x3);
 
 	if (wait_for_completion_timeout(&ofb->branch_done, 1 * HZ) = 0)
-		pr_warning("%s: timeout disabling overlay1\n", __func__);
+		pr_warn("%s: timeout disabling overlay1\n", __func__);
 
 	lcd_writel(ofb->fbi, LCCR5, lccr5);
 }
@@ -710,7 +710,7 @@ static void overlay2fb_disable(struct pxafb_layer *ofb)
 	lcd_writel(ofb->fbi, FBR4, ofb->fbi->fdadr[DMA_OV2_Cr] | 0x3);
 
 	if (wait_for_completion_timeout(&ofb->branch_done, 1 * HZ) = 0)
-		pr_warning("%s: timeout disabling overlay2\n", __func__);
+		pr_warn("%s: timeout disabling overlay2\n", __func__);
 }
 
 static struct pxafb_layer_ops ofb_ops[] = {
@@ -1187,8 +1187,7 @@ int pxafb_smart_flush(struct fb_info *info)
 	lcd_writel(fbi, LCCR0, fbi->reg_lccr0 | LCCR0_ENB);
 
 	if (wait_for_completion_timeout(&fbi->command_done, HZ/2) = 0) {
-		pr_warning("%s: timeout waiting for command done\n",
-				__func__);
+		pr_warn("%s: timeout waiting for command done\n", __func__);
 		ret = -ETIMEDOUT;
 	}
 
-- 
2.10.0.rc2.1.g053435c

Re: [PATCH 00/35] treewide trivial patches converting pr_warning to pr_warn

From: "Rafael J. Wysocki" <rafael@kernel.org>
Date: 2017-02-17 12:27:10

On Fri, Feb 17, 2017 at 8:11 AM, Joe Perches [off-list ref] wrote:
There are ~4300 uses of pr_warn and ~250 uses of the older
pr_warning in the kernel source tree.

Make the use of pr_warn consistent across all kernel files.

This excludes all files in tools/ as there is a separate
define pr_warning for that directory tree and pr_warn is
not used in tools/.

Done with 'sed s/\bpr_warning\b/pr_warn/' and some emacsing.
Sorry about asking if that has been asked already.

Wouldn't it be slightly less intrusive to simply redefined
pr_warning() as a synonym for pr_warn()?

Thanks,
Rafael

Re: [PATCH 00/35] treewide trivial patches converting pr_warning to pr_warn

From: Rob Herring <robh@kernel.org>
Date: 2017-02-23 15:28:57

On Fri, Feb 17, 2017 at 1:11 AM, Joe Perches [off-list ref] wrote:
There are ~4300 uses of pr_warn and ~250 uses of the older
pr_warning in the kernel source tree.

Make the use of pr_warn consistent across all kernel files.

This excludes all files in tools/ as there is a separate
define pr_warning for that directory tree and pr_warn is
not used in tools/.

Done with 'sed s/\bpr_warning\b/pr_warn/' and some emacsing.

Miscellanea:

o Coalesce formats and realign arguments

Some files not compiled - no cross-compilers

Joe Perches (35):
  alpha: Convert remaining uses of pr_warning to pr_warn
  ARM: ep93xx: Convert remaining uses of pr_warning to pr_warn
  arm64: Convert remaining uses of pr_warning to pr_warn
  arch/blackfin: Convert remaining uses of pr_warning to pr_warn
  ia64: Convert remaining use of pr_warning to pr_warn
  powerpc: Convert remaining uses of pr_warning to pr_warn
  sh: Convert remaining uses of pr_warning to pr_warn
  sparc: Convert remaining use of pr_warning to pr_warn
  x86: Convert remaining uses of pr_warning to pr_warn
  drivers/acpi: Convert remaining uses of pr_warning to pr_warn
  block/drbd: Convert remaining uses of pr_warning to pr_warn
  gdrom: Convert remaining uses of pr_warning to pr_warn
  drivers/char: Convert remaining use of pr_warning to pr_warn
  clocksource: Convert remaining use of pr_warning to pr_warn
  drivers/crypto: Convert remaining uses of pr_warning to pr_warn
  fmc: Convert remaining use of pr_warning to pr_warn
  drivers/gpu: Convert remaining uses of pr_warning to pr_warn
  drivers/ide: Convert remaining uses of pr_warning to pr_warn
  drivers/input: Convert remaining uses of pr_warning to pr_warn
  drivers/isdn: Convert remaining uses of pr_warning to pr_warn
  drivers/macintosh: Convert remaining uses of pr_warning to pr_warn
  drivers/media: Convert remaining use of pr_warning to pr_warn
  drivers/mfd: Convert remaining uses of pr_warning to pr_warn
  drivers/mtd: Convert remaining uses of pr_warning to pr_warn
  drivers/of: Convert remaining uses of pr_warning to pr_warn
  drivers/oprofile: Convert remaining uses of pr_warning to pr_warn
  drivers/platform: Convert remaining uses of pr_warning to pr_warn
  drivers/rapidio: Convert remaining use of pr_warning to pr_warn
  drivers/scsi: Convert remaining use of pr_warning to pr_warn
  drivers/sh: Convert remaining use of pr_warning to pr_warn
  drivers/tty: Convert remaining uses of pr_warning to pr_warn
  drivers/video: Convert remaining uses of pr_warning to pr_warn
  kernel/trace: Convert remaining uses of pr_warning to pr_warn
  lib: Convert remaining uses of pr_warning to pr_warn
  sound/soc: Convert remaining uses of pr_warning to pr_warn
Where's the removal of pr_warning so we don't have more sneak in?

Rob

Re: [PATCH 00/35] treewide trivial patches converting pr_warning to pr_warn

From: Joe Perches <joe@perches.com>
Date: 2017-02-23 17:20:24

On Thu, 2017-02-23 at 09:28 -0600, Rob Herring wrote:
On Fri, Feb 17, 2017 at 1:11 AM, Joe Perches [off-list ref] wrote:
quoted
There are ~4300 uses of pr_warn and ~250 uses of the older
pr_warning in the kernel source tree.

Make the use of pr_warn consistent across all kernel files.

This excludes all files in tools/ as there is a separate
define pr_warning for that directory tree and pr_warn is
not used in tools/.

Done with 'sed s/\bpr_warning\b/pr_warn/' and some emacsing.
[]
Where's the removal of pr_warning so we don't have more sneak in?
After all of these actually get applied,
and maybe a cycle or two later, one would
get sent.

Re: [PATCH 00/35] treewide trivial patches converting pr_warning to pr_warn

From: Emil Velikov <hidden>
Date: 2017-02-23 17:48:32

On 23 February 2017 at 17:18, Joe Perches [off-list ref] wrote:
On Thu, 2017-02-23 at 09:28 -0600, Rob Herring wrote:
quoted
On Fri, Feb 17, 2017 at 1:11 AM, Joe Perches [off-list ref] wrote:
quoted
There are ~4300 uses of pr_warn and ~250 uses of the older
pr_warning in the kernel source tree.

Make the use of pr_warn consistent across all kernel files.

This excludes all files in tools/ as there is a separate
define pr_warning for that directory tree and pr_warn is
not used in tools/.

Done with 'sed s/\bpr_warning\b/pr_warn/' and some emacsing.
[]
quoted
Where's the removal of pr_warning so we don't have more sneak in?
After all of these actually get applied,
and maybe a cycle or two later, one would
get sent.
By which point you'll get a few reincarnation of it. So you'll have to
do the same exercise again :-(

I guess the question is - are you expecting to get the series merged
all together/via one tree ? If not, your plan is perfectly reasonable.
Fwiw in the DRM subsystem, similar cleanups does purge the respective
macros/other with the final commit. But there one can pull the lot in
one go.

Regards,
Emil

Re: [PATCH 00/35] treewide trivial patches converting pr_warning to pr_warn

From: Joe Perches <joe@perches.com>
Date: 2017-02-23 17:55:05

On Thu, 2017-02-23 at 17:41 +0000, Emil Velikov wrote:
On 23 February 2017 at 17:18, Joe Perches [off-list ref] wrote:
quoted
On Thu, 2017-02-23 at 09:28 -0600, Rob Herring wrote:
quoted
On Fri, Feb 17, 2017 at 1:11 AM, Joe Perches [off-list ref] wrote:
quoted
There are ~4300 uses of pr_warn and ~250 uses of the older
pr_warning in the kernel source tree.

Make the use of pr_warn consistent across all kernel files.

This excludes all files in tools/ as there is a separate
define pr_warning for that directory tree and pr_warn is
not used in tools/.

Done with 'sed s/\bpr_warning\b/pr_warn/' and some emacsing.
[]
quoted
Where's the removal of pr_warning so we don't have more sneak in?
After all of these actually get applied,
and maybe a cycle or two later, one would
get sent.
By which point you'll get a few reincarnation of it. So you'll have to
do the same exercise again :-(
Maybe to one or two files.  Not a big deal.
I guess the question is - are you expecting to get the series merged
all together/via one tree ?
No.  The only person that could do that effectively is Linus.
If not, your plan is perfectly reasonable.

Re: [PATCH 32/35] drivers/video: Convert remaining uses of pr_warning to pr_warn

From: Bartlomiej Zolnierkiewicz <hidden>
Date: 2017-03-21 15:17:28

On Thursday, February 16, 2017 11:11:45 PM Joe Perches wrote:
To enable eventual removal of pr_warning

This makes pr_warn use consistent for drivers/video

Prior to this patch, there were 6 uses of pr_warning and
25 uses of pr_warn in drivers/video

Signed-off-by: Joe Perches <joe@perches.com>
Patch queued for 4.12, thanks.

Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help