Thread (16 messages) 16 messages, 6 authors, 2016-09-26

Re: [PATCH v3 0/2] Exynos IOMMU: proper runtime PM support (use device dependencies)

From: Tobias Jakobi <hidden>
Date: 2016-09-19 21:51:46
Also in: linux-iommu, linux-samsung-soc, lkml

Hello Marek,

I did some tests with the new version today. Sadly the reboot/shutdown
issues are still present.

Here's what appears on the UART last:
[  399.538147] sd 0:0:0:0: [sda] Synchronizing SCSI cache
[  404.970649] smsc95xx 1-2.1.1:1.0 eth0: Failed to read reg index 0x00000114: -110
[  404.972426] smsc95xx 1-2.1.1:1.0 eth0: Error reading MII_ACCESS
[  404.978336] smsc95xx 1-2.1.1:1.0 eth0: MII is busy in smsc95xx_mdio_read
[  404.985020] smsc95xx 1-2.1.1:1.0 eth0: Failed to read MII_BMSR
[  434.170626] usb 1-2-port2: cannot reset (err = -110)
[  435.210242] usb 1-2-port2: cannot reset (err = -110)
[  436.250261] usb 1-2-port2: cannot reset (err = -110)
[  437.290241] usb 1-2-port2: cannot reset (err = -110)
[  438.330241] usb 1-2-port2: cannot reset (err = -110)
[  438.330346] usb 1-2-port2: Cannot enable. Maybe the USB cable is bad?
[  439.370608] usb 1-2-port2: cannot disable (err = -110)
[  440.410225] usb 1-2-port2: cannot reset (err = -110)
[  441.450236] usb 1-2-port2: cannot reset (err = -110)
[  442.490222] usb 1-2-port2: cannot reset (err = -110)
[  443.530224] usb 1-2-port2: cannot reset (err = -110)
[  444.570228] usb 1-2-port2: cannot reset (err = -110)
[  444.570331] usb 1-2-port2: Cannot enable. Maybe the USB cable is bad?
[  445.610227] usb 1-2-port2: cannot disable (err = -110)
[  446.650230] usb 1-2-port2: cannot reset (err = -110)
[  447.690231] usb 1-2-port2: cannot reset (err = -110)
[  448.730235] usb 1-2-port2: cannot reset (err = -110)
[  449.770235] usb 1-2-port2: cannot reset (err = -110)
[  450.810239] usb 1-2-port2: cannot reset (err = -110)
[  450.810342] usb 1-2-port2: Cannot enable. Maybe the USB cable is bad?
[  451.850240] usb 1-2-port2: cannot disable (err = -110)
[  452.890243] usb 1-2-port2: cannot reset (err = -110)
[  453.930271] usb 1-2-port2: cannot reset (err = -110)
[  454.970247] usb 1-2-port2: cannot reset (err = -110)
[  456.010250] usb 1-2-port2: cannot reset (err = -110)
[  457.050251] usb 1-2-port2: cannot reset (err = -110)
[  457.050353] usb 1-2-port2: Cannot enable. Maybe the USB cable is bad?
[  458.090250] usb 1-2-port2: cannot disable (err = -110)
[  459.130603] usb 1-2-port2: cannot disable (err = -110)
[  464.330286] hub 1-2:1.0: hub_ext_port_status failed (err = -110)

If I trigger a stack trace via SysRq at this point, I get this here:
[  672.679321] sysrq: SysRq : Show backtrace of all active CPUs
[  672.679448] Sending NMI to all CPUs:
[  672.682901] NMI backtrace for cpu 0
[  672.686377] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.8.0-rc7-debug+ #6
[  672.693149] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[  672.699223] Backtrace: 
[  672.701657] [<c010c9bc>] (dump_backtrace) from [<c010cb68>] (show_stack+0x18/0x1c)
[  672.709212]  r6:c0c25e40 r5:600401d3 r4:00000000 r3:00040800
[  672.714845] [<c010cb50>] (show_stack) from [<c039bef8>] (dump_stack+0xb0/0xdc)
[  672.722062] [<c039be48>] (dump_stack) from [<c03a089c>] (nmi_cpu_backtrace+0x88/0x8c)
[  672.729870]  r8:c0c27f88 r7:c010e87c r6:00000000 r5:00000000 r4:00000000 r3:00000000
[  672.737590] [<c03a0814>] (nmi_cpu_backtrace) from [<c010e8d8>] (raise_nmi+0x5c/0x60)
[  672.745320]  r5:c0c0281c r4:c0c0281c
[  672.748868] [<c010e87c>] (raise_nmi) from [<c03a0800>] (nmi_trigger_all_cpu_backtrace+0x120/0x134)
[  672.757821]  r4:00000001 r3:00000000
[  672.761367] [<c03a06e0>] (nmi_trigger_all_cpu_backtrace) from [<c010f5c0>] (arch_trigger_all_cpu_backtrace+0x18/0x1c)
[  672.771972]  r7:00000001 r6:00000008 r5:0000006c r4:c0c0cf0c
[  672.777601] [<c010f5a8>] (arch_trigger_all_cpu_backtrace) from [<c03fc7c0>] (sysrq_handle_showallcpus+0x14/0x18)
[  672.787774] [<c03fc7ac>] (sysrq_handle_showallcpus) from [<c03fcfc8>] (__handle_sysrq+0x104/0x268)
[  672.796711] [<c03fcec4>] (__handle_sysrq) from [<c03fd5d4>] (handle_sysrq+0x34/0x38)
[  672.804431]  r8:c0c02100 r7:c0c2b994 r6:00000040 r5:00000000 r4:c0c2b964
[  672.811106] [<c03fd5a0>] (handle_sysrq) from [<c0412564>] (s3c24xx_serial_rx_drain_fifo+0x1fc/0x22c)
[  672.820236] [<c0412368>] (s3c24xx_serial_rx_drain_fifo) from [<c04133f8>] (s3c24xx_serial_rx_chars+0x74/0x1a8)
[  672.830214]  r10:0001000f r9:ee1f2200 r8:200401d3 r7:ed01cc00 r6:c0c2b994 r5:ee2a5550
[  672.838013]  r4:c0c2b964
[  672.840529] [<c0413384>] (s3c24xx_serial_rx_chars) from [<c041357c>] (s3c64xx_serial_handle_irq+0x50/0x68)
[  672.850178]  r10:c0c01e24 r9:00000000 r8:00000047 r7:c0c00000 r6:00000047 r5:00000001
[  672.857977]  r4:c0c2b964
[  672.860496] [<c041352c>] (s3c64xx_serial_handle_irq) from [<c01843b8>] (__handle_irq_event_percpu+0x7c/0x4c4)
[  672.870403]  r6:c0c02848 r5:eeb0a100 r4:ed76b8c0 r3:c041352c
[  672.876030] [<c018433c>] (__handle_irq_event_percpu) from [<c0184824>] (handle_irq_event_percpu+0x24/0x60)
[  672.885679]  r10:c0c01ee8 r9:ee808000 r8:00000001 r7:00000000 r6:c0c02848 r5:eeb0a100
[  672.893478]  r4:eeb0a100
[  672.895994] [<c0184800>] (handle_irq_event_percpu) from [<c01848a0>] (handle_irq_event+0x40/0x64)
[  672.904860]  r5:eeb0a160 r4:eeb0a100
[  672.908406] [<c0184860>] (handle_irq_event) from [<c01881d0>] (handle_fasteoi_irq+0xd8/0x1a8)
[  672.916925]  r6:c0c02848 r5:eeb0a160 r4:eeb0a100 r3:00000000
[  672.922554] [<c01880f8>] (handle_fasteoi_irq) from [<c0183ae8>] (generic_handle_irq+0x2c/0x3c)
[  672.931160]  r7:00000000 r6:00000047 r5:00000000 r4:c0b42270
[  672.936790] [<c0183abc>] (generic_handle_irq) from [<c0183b7c>] (__handle_domain_irq+0x84/0xf4)
[  672.945486] [<c0183af8>] (__handle_domain_irq) from [<c0101510>] (gic_handle_irq+0x5c/0xa0)
[  672.953815]  r10:c0c02524 r9:f0821000 r8:f0820000 r7:c0c01ee8 r6:f082000c r5:c0c26380
[  672.961616]  r4:c0c02848 r3:c0c01ee8
[  672.965172] [<c01014b4>] (gic_handle_irq) from [<c010d7b0>] (__irq_svc+0x70/0xb0)
[  672.972651] Exception stack(0xc0c01ee8 to 0xc0c01f30)
[  672.977679] 1ee0:                   00000001 00000001 00000000 c011b660 c0c00000 c0c448cc
[  672.985846] 1f00: c0c024d4 00000001 00000000 00000000 c0c02524 c0c01f44 c0c01f08 c0c01f38
[  672.994005] 1f20: c01743d4 c01089d4 20040053 ffffffff
[  672.999029]  r9:c0c00000 r8:00000000 r7:c0c01f1c r6:ffffffff r5:20040053 r4:c01089d4
[  673.006758] [<c01089a8>] (arch_cpu_idle) from [<c016cdd8>] (default_idle_call+0x28/0x38)
[  673.014838] [<c016cdb0>] (default_idle_call) from [<c016d190>] (cpu_startup_entry+0x3a8/0x484)
[  673.023436] [<c016cde8>] (cpu_startup_entry) from [<c0807b00>] (rest_init+0x168/0x178)
[  673.031327]  r7:ffffffff
[  673.033834] [<c0807998>] (rest_init) from [<c0b00cf8>] (start_kernel+0x384/0x390)
[  673.041308]  r5:c0c49000 r4:00000001
[  673.044855] [<c0b00974>] (start_kernel) from [<40008078>] (0x40008078)
[  673.051486] NMI backtrace for cpu 3
[  673.054844] CPU: 3 PID: 0 Comm: swapper/3 Not tainted 4.8.0-rc7-debug+ #6
[  673.061615] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[  673.067692] task: ee8b3200 task.stack: ee8be000
[  673.072201] PC is at arch_cpu_idle+0x2c/0x44
[  673.076455] LR is at trace_hardirqs_on_caller+0x158/0x200
[  673.081840] pc : [<c01089d4>]    lr : [<c01743d4>]    psr: 20010053
[  673.088089] sp : ee8bff90  ip : ee8bff60  fp : ee8bff9c
[  673.093294] r10: c0c02524  r9 : 00000000  r8 : 00000000
[  673.098503] r7 : 00000008  r6 : c0c024d4  r5 : c0c448cc  r4 : ee8be000
[  673.105014] r3 : c011b660  r2 : 00000000  r1 : 00000001  r0 : 00000001
[  673.111525] Flags: nzCv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment none
[  673.118736] Control: 10c5387d  Table: 6dc5804a  DAC: 00000051
[  673.124459] CPU: 3 PID: 0 Comm: swapper/3 Not tainted 4.8.0-rc7-debug+ #6
[  673.131229] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[  673.137306] Backtrace: 
[  673.139730] [<c010c9bc>] (dump_backtrace) from [<c010cb68>] (show_stack+0x18/0x1c)
[  673.147292]  r6:c0c25e40 r5:600101d3 r4:00000000 r3:00040800
[  673.152929] [<c010cb50>] (show_stack) from [<c039bef8>] (dump_stack+0xb0/0xdc)
[  673.160138] [<c039be48>] (dump_stack) from [<c0108c5c>] (show_regs+0x14/0x18)
[  673.167251]  r8:f082c000 r7:ee8bff40 r6:c0b42270 r5:00000003 r4:ee8bff40 r3:00040800
[  673.174982] [<c0108c48>] (show_regs) from [<c03a0880>] (nmi_cpu_backtrace+0x6c/0x8c)
[  673.182707] [<c03a0814>] (nmi_cpu_backtrace) from [<c010f1c0>] (handle_IPI+0x14c/0x434)
[  673.190692]  r5:c0b42270 r4:00000007
[  673.194241] [<c010f074>] (handle_IPI) from [<c0101550>] (gic_handle_irq+0x9c/0xa0)
[  673.201803]  r10:c0c02524 r9:f082d000 r8:f082c000 r7:ee8bff40 r6:f082c00c r5:c0c26380
[  673.209615]  r4:c0c02848
[  673.212121] [<c01014b4>] (gic_handle_irq) from [<c010d7b0>] (__irq_svc+0x70/0xb0)
[  673.219596] Exception stack(0xee8bff40 to 0xee8bff88)
[  673.224624] ff40: 00000001 00000001 00000000 c011b660 ee8be000 c0c448cc c0c024d4 00000008
[  673.232790] ff60: 00000000 00000000 c0c02524 ee8bff9c ee8bff60 ee8bff90 c01743d4 c01089d4
[  673.240952] ff80: 20010053 ffffffff
[  673.244411]  r9:ee8be000 r8:00000000 r7:ee8bff74 r6:ffffffff r5:20010053 r4:c01089d4
[  673.252147] [<c01089a8>] (arch_cpu_idle) from [<c016cdd8>] (default_idle_call+0x28/0x38)
[  673.260221] [<c016cdb0>] (default_idle_call) from [<c016d190>] (cpu_startup_entry+0x3a8/0x484)
[  673.268816] [<c016cde8>] (cpu_startup_entry) from [<c010ee88>] (secondary_start_kernel+0xf8/0x100)
[  673.277755]  r7:c0c49328
[  673.280259] [<c010ed90>] (secondary_start_kernel) from [<401015ec>] (0x401015ec)
[  673.287648]  r5:00000051 r4:6e89406a
[  673.291197] NMI backtrace for cpu 2
[  673.294670] CPU: 2 PID: 3729 Comm: reboot Not tainted 4.8.0-rc7-debug+ #6
[  673.301443] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[  673.307518] task: ee030c80 task.stack: edec8000
[  673.312029] PC is at _raw_spin_unlock_irq+0x30/0x64
[  673.316891] LR is at mark_held_locks+0x74/0x9c
[  673.321317] pc : [<c080ee84>]    lr : [<c0174254>]    psr: 200a0053
[  673.327569] sp : edec9df0  ip : c0d9a4d4  fp : edec9e04
[  673.332775] r10: 00000000  r9 : ee029c44  r8 : c0c49020
[  673.337984] r7 : ee029cb0  r6 : 00000000  r5 : ee029d84  r4 : ee029cb0
[  673.344495] r3 : 600a00d3  r2 : 00000000  r1 : ee031158  r0 : 00000001
[  673.351005] Flags: nzCv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment none
[  673.358215] Control: 10c5387d  Table: 6d7ec04a  DAC: 00000051
[  673.363937] CPU: 2 PID: 3729 Comm: reboot Not tainted 4.8.0-rc7-debug+ #6
[  673.370709] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[  673.376784] Backtrace: 
[  673.379209] [<c010c9bc>] (dump_backtrace) from [<c010cb68>] (show_stack+0x18/0x1c)
[  673.386773]  r6:c0c25e40 r5:600a01d3 r4:00000000 r3:00040800
[  673.392408] [<c010cb50>] (show_stack) from [<c039bef8>] (dump_stack+0xb0/0xdc)
[  673.399618] [<c039be48>] (dump_stack) from [<c0108c5c>] (show_regs+0x14/0x18)
[  673.406732]  r8:f0828000 r7:edec9da0 r6:c0b42270 r5:00000002 r4:edec9da0 r3:00040800
[  673.414462] [<c0108c48>] (show_regs) from [<c03a0880>] (nmi_cpu_backtrace+0x6c/0x8c)
[  673.422187] [<c03a0814>] (nmi_cpu_backtrace) from [<c010f1c0>] (handle_IPI+0x14c/0x434)
[  673.430173]  r5:c0b42270 r4:00000007
[  673.433722] [<c010f074>] (handle_IPI) from [<c0101550>] (gic_handle_irq+0x9c/0xa0)
[  673.441283]  r10:00000000 r9:f0829000 r8:f0828000 r7:edec9da0 r6:f082800c r5:c0c26380
[  673.449095]  r4:c0c02848
[  673.451601] [<c01014b4>] (gic_handle_irq) from [<c010d7b0>] (__irq_svc+0x70/0xb0)
[  673.459076] Exception stack(0xedec9da0 to 0xedec9de8)
[  673.464103] 9da0: 00000001 ee031158 00000000 600a00d3 ee029cb0 ee029d84 00000000 ee029cb0
[  673.472272] 9dc0: c0c49020 ee029c44 00000000 edec9e04 c0d9a4d4 edec9df0 c0174254 c080ee84
[  673.480430] 9de0: 200a0053 ffffffff
[  673.483892]  r9:edec8000 r8:c0c49020 r7:edec9dd4 r6:ffffffff r5:200a0053 r4:c080ee84
[  673.491627] [<c080ee54>] (_raw_spin_unlock_irq) from [<c047ab90>] (pm_runtime_barrier+0x68/0xbc)
[  673.500395]  r4:ee029c10 r3:00000080
[  673.503942] [<c047ab28>] (pm_runtime_barrier) from [<c046c6d4>] (device_shutdown+0x110/0x1c8)
[  673.512460]  r7:c140755c r6:ee029c10 r5:c0c2e210 r4:ee029c1c
[  673.518094] [<c046c5c4>] (device_shutdown) from [<c014ad10>] (kernel_restart_prepare+0x3c/0x40)
[  673.526782]  r9:c0c0ae1c r8:00000010 r7:c0c0b244 r6:01234567 r5:00000000 r4:00000000
[  673.534506] [<c014acd4>] (kernel_restart_prepare) from [<c014ae68>] (kernel_restart+0x14/0x58)
[  673.543100] [<c014ae54>] (kernel_restart) from [<c014b13c>] (SyS_reboot+0x114/0x200)
[  673.550824]  r4:c0c02448 r3:01234567
[  673.554374] [<c014b028>] (SyS_reboot) from [<c0107ee0>] (ret_fast_syscall+0x0/0x1c)
[  673.562021]  r9:edec8000 r8:c0108084 r7:00000058 r6:010a0008 r5:be9f6ce0 r4:00000001
[  673.569748] NMI backtrace for cpu 1
[  673.573211] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.8.0-rc7-debug+ #6
[  673.579984] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[  673.586059] task: ee8b1900 task.stack: ee8ba000
[  673.590570] PC is at arch_cpu_idle+0x2c/0x44
[  673.594823] LR is at trace_hardirqs_on_caller+0x158/0x200
[  673.600206] pc : [<c01089d4>]    lr : [<c01743d4>]    psr: 200b0053
[  673.606457] sp : ee8bbf90  ip : ee8bbf60  fp : ee8bbf9c
[  673.611664] r10: c0c02524  r9 : 00000000  r8 : 00000000
[  673.616872] r7 : 00000002  r6 : c0c024d4  r5 : c0c448cc  r4 : ee8ba000
[  673.623383] r3 : c011b660  r2 : 00000000  r1 : 00000001  r0 : 00000001
[  673.629894] Flags: nzCv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment none
[  673.637103] Control: 10c5387d  Table: 6df9804a  DAC: 00000051
[  673.642827] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.8.0-rc7-debug+ #6
[  673.649598] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[  673.655672] Backtrace: 
[  673.658098] [<c010c9bc>] (dump_backtrace) from [<c010cb68>] (show_stack+0x18/0x1c)
[  673.665660]  r6:c0c25e40 r5:600b01d3 r4:00000000 r3:00040800
[  673.671296] [<c010cb50>] (show_stack) from [<c039bef8>] (dump_stack+0xb0/0xdc)
[  673.678506] [<c039be48>] (dump_stack) from [<c0108c5c>] (show_regs+0x14/0x18)
[  673.685620]  r8:f0824000 r7:ee8bbf40 r6:c0b42270 r5:00000001 r4:ee8bbf40 r3:00040800
[  673.693350] [<c0108c48>] (show_regs) from [<c03a0880>] (nmi_cpu_backtrace+0x6c/0x8c)
[  673.701075] [<c03a0814>] (nmi_cpu_backtrace) from [<c010f1c0>] (handle_IPI+0x14c/0x434)
[  673.709061]  r5:c0b42270 r4:00000007
[  673.712610] [<c010f074>] (handle_IPI) from [<c0101550>] (gic_handle_irq+0x9c/0xa0)
[  673.720171]  r10:c0c02524 r9:f0825000 r8:f0824000 r7:ee8bbf40 r6:f082400c r5:c0c26380
[  673.727983]  r4:c0c02848
[  673.730489] [<c01014b4>] (gic_handle_irq) from [<c010d7b0>] (__irq_svc+0x70/0xb0)
[  673.737964] Exception stack(0xee8bbf40 to 0xee8bbf88)
[  673.742992] bf40: 00000001 00000001 00000000 c011b660 ee8ba000 c0c448cc c0c024d4 00000002
[  673.751160] bf60: 00000000 00000000 c0c02524 ee8bbf9c ee8bbf60 ee8bbf90 c01743d4 c01089d4
[  673.759319] bf80: 200b0053 ffffffff
[  673.762780]  r9:ee8ba000 r8:00000000 r7:ee8bbf74 r6:ffffffff r5:200b0053 r4:c01089d4
[  673.770515] [<c01089a8>] (arch_cpu_idle) from [<c016cdd8>] (default_idle_call+0x28/0x38)
[  673.778588] [<c016cdb0>] (default_idle_call) from [<c016d190>] (cpu_startup_entry+0x3a8/0x484)
[  673.787182] [<c016cde8>] (cpu_startup_entry) from [<c010ee88>] (secondary_start_kernel+0xf8/0x100)
[  673.796123]  r7:c0c49328
[  673.798627] [<c010ed90>] (secondary_start_kernel) from [<401015ec>] (0x401015ec)
[  673.806016]  r5:00000051 r4:6e89406a
So this seems to be PM related, since it hangs in pm_runtime_barrier()
in device_shutdown().

Anyway, I noticed something else on boot:
[    7.567702] usb-storage 1-2.2:1.0: USB Mass Storage device detected
[    7.569762] scsi host0: usb-storage 1-2.2:1.0
[    7.579054] scsi host0: runtime PM trying to activate child device host0 but parent (1-2.2:1.0) is not active

Maybe some details about my storage setup. While boot and rootfs are on
a SD card, /var and some other things are on a USB thumb drive (/dev/sda
is that drive).

My guess is that with the runpm changes the failure to sync the thumb
drive now blocks the rest of the shutdown/reboot procedure.


With best wishes,
Tobias



Marek Szyprowski wrote:
Hello,

This patch series finally implements proper runtime PM support in Exynos
IOMMU driver. This has been achieved by using recently introduce device
links, which lets SYSMMU controller's runtime PM to follow master's device
runtime PM state (the device which actually performs DMA transaction).
The main idea behind this solution is an observation that any DMA activity
from master device can be done only when master device is active, thus when
master device is suspended SYSMMU controller device can also be suspended.

This patchset solves the situation that power domains are always enabled,
because all SYSMMU controllers (which belongs to those domains) are
permanently active (because existing driver was simplified and kept
SYSMMU device active all the time after initialization).

Patch requires second version of Rafeal's "Functional dependencies
between devices" patchset, which is available here:
https://lkml.org/lkml/2016/9/8/798

If one wants to test this patchset, I've provided a branch with all needed
patches (some fixes for Exynos4 FIMC-IS driver are needed):
https://git.linaro.org/people/marek.szyprowski/linux-srpol.git v4.8-iommu-pm-v3

Patches are based on vanilla v4.8-rc6 kernel with Rafael's patches applied.

Best regards
Marek Szyprowski
Samsung R&D Institute Poland


Changelog:
v3:
- rebased on top of latest device dependencies/links patchset
- added proper locking between runtime pm, iommu_attach/detach and sysmmu
  enable/disable(added per iommu owner device's rpm lock)

v2:
- replaced PM notifiers with generic device dependencies/links developped
  by Rafael J. Wysocki

v1: http://www.spinics.net/lists/arm-kernel/msg509600.html
- initial version


Patch summary:

Marek Szyprowski (2):
  iommu/exynos: Remove excessive, useless debug
  iommu/exynos: Add proper runtime pm support

 drivers/iommu/exynos-iommu.c | 228 ++++++++++++++++++-------------------------
 1 file changed, 94 insertions(+), 134 deletions(-)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help