Skip to contentSkip to conversation

drm/nouveau/kms: Implement KDB debug hooks for nouveau KMS.

PATCH In review Chris Ball 6 participants 21 messages Aug 19, 2010 – Oct 27, 2010 5 messages not in the archive

Subsystems (5)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

Chris Ball

author
#3 lore raw

PATCH 1/1 drm/nouveau/kms: Implement KDB debug hooks for nouveau KMS.

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

¹:  http://lkml.org/lkml/2010/8/5/280
²:  http://dev.laptop.org/~cjb/kdb-radeon.patch
³:  http://blog.printf.net/articles/2010/08/19/kdb-kms-for-nouveau-radeon

From: Chris Ball <[email protected]>
Date: Thu, 19 Aug 2010 12:55:34 -0400
Subject: [PATCH] drm/nouveau/kms: Implement KDB debug hooks for nouveau KMS.

---
 drivers/gpu/drm/nouveau/nouveau_fbcon.c |    6 ++++
 drivers/gpu/drm/nouveau/nv04_crtc.c     |   46 ++++++++++++++++++++++++-----
 drivers/gpu/drm/nouveau/nv50_crtc.c     |   49 ++++++++++++++++++++++--------
 3 files changed, 80 insertions(+), 21 deletions(-)
drivers/gpu/drm/nouveau/nouveau_fbcon.c +6 -0
index 2fb2444..aac1460 100644
@@ -104,6 +104,8 @@ static struct fb_ops nouveau_fbcon_ops = {
 	.fb_pan_display = drm_fb_helper_pan_display,
 	.fb_blank = drm_fb_helper_blank,
 	.fb_setcmap = drm_fb_helper_setcmap,
+	.fb_debug_enter = drm_fb_helper_debug_enter,
+	.fb_debug_leave = drm_fb_helper_debug_leave,
 };
 
 static struct fb_ops nv04_fbcon_ops = {
@@ -117,6 +119,8 @@ static struct fb_ops nv04_fbcon_ops = {
 	.fb_pan_display = drm_fb_helper_pan_display,
 	.fb_blank = drm_fb_helper_blank,
 	.fb_setcmap = drm_fb_helper_setcmap,
+	.fb_debug_enter = drm_fb_helper_debug_enter,
+	.fb_debug_leave = drm_fb_helper_debug_leave,
 };
 
 static struct fb_ops nv50_fbcon_ops = {
@@ -130,6 +134,8 @@ static struct fb_ops nv50_fbcon_ops = {
 	.fb_pan_display = drm_fb_helper_pan_display,
 	.fb_blank = drm_fb_helper_blank,
 	.fb_setcmap = drm_fb_helper_setcmap,
+	.fb_debug_enter = drm_fb_helper_debug_enter,
+	.fb_debug_leave = drm_fb_helper_debug_leave,
 };
 
 static void nouveau_fbcon_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
drivers/gpu/drm/nouveau/nv04_crtc.c +38 -8

71 lines not on this page · raw message

drivers/gpu/drm/nouveau/nv50_crtc.c +36 -13

85 lines not on this page · raw message

Signature · 12 lines
1.6.2.5

------------------------------------------------------------------------------
This SF.net email is sponsored by 

Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev 
_______________________________________________
Kgdb-bugreport mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

A message that is not in the archive (sent off-list or not yet received): m3aaoimqrp.fsf_-_-0VGQAjvlmrQzNDMTQreKSUB+6BGkLq7r@public.gmane.org

#5 lore raw
Quoted 7 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

There is a problem with this on pre-nv20 cards. Fbcon acceleration won't work properly with IRQs disabled because you miss the context switching
interrupts: You'll get a locked up fbcon if you hit sysrq-g when there's some process using the GPU.

I'd suggest disabling acceleration while in debug mode (e.g. using nouveau_fbcon_save_disable_accel()). That aside the patch looks good to me.

Quoted 8 lines

- Chris.

¹:  http://lkml.org/lkml/2010/8/5/280
²:  http://dev.laptop.org/~cjb/kdb-radeon.patch
³:  http://blog.printf.net/articles/2010/08/19/kdb-kms-for-nouveau-radeon

[...]

_______________________________________________
Nouveau mailing list [email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

author
#6 lore raw

Hi Francisco,

Quoted 8 lines

There is a problem with this on pre-nv20 cards. Fbcon acceleration won't work properly with IRQs disabled because you miss the context switching interrupts: You'll get a locked up fbcon if you hit sysrq-g when there's some process using the GPU.

I'd suggest disabling acceleration while in debug mode (e.g. using nouveau_fbcon_save_disable_accel()). That aside the patch looks good to me.

Thanks very much for this. Here's a (only compile-tested) patch for this, on top of jwessel's current kgdb-next branch. Jason, would you mind testing on pre-nv20 and applying?

Thanks,

- Chris.

From: Chris Ball <[email protected]>
Subject: [PATCH] drm/nouveau/kms: Avoid a hang entering KDB with VT accel on.

Francisco Jerez advises that pre-nv20 cards would hang if we entered kdb with accel on and IRQs disabled, so we now disable accel before entering kdb and re-enable it on the way back out.

Cc Francisco Jerez <[email protected]>
Cc Jason Wessel <[email protected]>
---
 drivers/gpu/drm/nouveau/nv04_crtc.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)
drivers/gpu/drm/nouveau/nv04_crtc.c +9 -0
index fb669dd..427f90e 100644
@@ -31,10 +31,11 @@
 #include "nouveau_connector.h"
 #include "nouveau_crtc.h"
 #include "nouveau_fb.h"
 #include "nouveau_hw.h"
 #include "nvreg.h"
+#include "nouveau_fbcon.h"
 
 static int
 nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 			struct drm_framebuffer *old_fb);
 
@@ -858,10 +859,18 @@ nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 static int
 nv04_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
 			       struct drm_framebuffer *fb,
 			       int x, int y, int enter)
 {
+	struct drm_nouveau_private *dev_priv = crtc->dev->dev_private;
+	struct drm_device *dev = dev_priv->dev;
+
+	if (enter)
+		nouveau_fbcon_save_disable_accel(dev);
+	else
+		nouveau_fbcon_restore_accel(dev);
+
 	return nv04_crtc_do_mode_set_base(crtc, fb, x, y, true);
 }
 
 static void nv04_cursor_upload(struct drm_device *dev, struct nouveau_bo *src,
 			       struct nouveau_bo *dst)
Signature · 8 lines
1.6.2.5

------------------------------------------------------------------------------
Sell apps to millions through the Intel(R) Atom(Tm) Developer Program
Be part of this innovative community and reach millions of netbook users 
worldwide. Take advantage of special opportunities to increase revenue and 
speed time-to-market. Join now, and jumpstart your future.
http://p.sf.net/sfu/intel-atom-d2d

A message that is not in the archive (sent off-list or not yet received): m3k4nhqcia.fsf_-_-0VGQAjvlmrQzNDMTQreKSUB+6BGkLq7r@public.gmane.org

#8 lore raw
Quoted 7 lines · Chris Ball

Hi Francisco,

Quoted 5 lines

There is a problem with this on pre-nv20 cards. Fbcon acceleration won't work properly with IRQs disabled because you miss the context switching interrupts: You'll get a locked up fbcon if you hit sysrq-g when there's some process using the GPU.

Quoted 8 lines
Quoted 3 lines

I'd suggest disabling acceleration while in debug mode (e.g. using nouveau_fbcon_save_disable_accel()). That aside the patch looks good to me.

Thanks very much for this. Here's a (only compile-tested) patch for this, on top of jwessel's current kgdb-next branch. Jason, would you mind testing on pre-nv20 and applying?

Thanks, it looks OK to me, and I just tested it successfully on nv11. You can have my "Acked-by" on both nouveau patches if you need it.

Quoted 44 lines

Thanks,

- Chris.

From: Chris Ball <[email protected]>
Subject: [PATCH] drm/nouveau/kms: Avoid a hang entering KDB with VT accel on.

Francisco Jerez advises that pre-nv20 cards would hang if we entered kdb with accel on and IRQs disabled, so we now disable accel before entering kdb and re-enable it on the way back out.

Cc Francisco Jerez <[email protected]>
Cc Jason Wessel <[email protected]>
---
 drivers/gpu/drm/nouveau/nv04_crtc.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)
drivers/gpu/drm/nouveau/nv04_crtc.c +4 -0
index fb669dd..427f90e 100644
@@ -31,10 +31,11 @@
 #include "nouveau_connector.h"
 #include "nouveau_crtc.h"
 #include "nouveau_fb.h"
 #include "nouveau_hw.h"
 #include "nvreg.h"
+#include "nouveau_fbcon.h"
 
 static int
 nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 			struct drm_framebuffer *old_fb);
 
@@ -858,10 +859,18 @@ nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 static int
 nv04_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
 			       struct drm_framebuffer *fb,
 			       int x, int y, int enter)
 {
+	struct drm_nouveau_private *dev_priv = crtc->dev->dev_private;
+	struct drm_device *dev = dev_priv->dev;
+

drivers/gpu/drm/nouveau/nv04_crtc.c nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, · line 876

Quoted 10 lines
drivers/gpu/drm/nouveau/nv04_crtc.c +5 -0
+	if (enter)
+		nouveau_fbcon_save_disable_accel(dev);
+	else
+		nouveau_fbcon_restore_accel(dev);
+
 	return nv04_crtc_do_mode_set_base(crtc, fb, x, y, true);
 }
 
 static void nv04_cursor_upload(struct drm_device *dev, struct nouveau_bo *src,
 			       struct nouveau_bo *dst)

_______________________________________________
Nouveau mailing list [email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

#9 lore raw
In reply to Chris Ball
Quoted 7 lines · Chris Ball

Hi Francisco,

Quoted 5 lines

There is a problem with this on pre-nv20 cards. Fbcon acceleration won't work properly with IRQs disabled because you miss the context switching interrupts: You'll get a locked up fbcon if you hit sysrq-g when there's some process using the GPU.

Quoted 9 lines
Quoted 3 lines

I'd suggest disabling acceleration while in debug mode (e.g. using nouveau_fbcon_save_disable_accel()). That aside the patch looks good to me.

Thanks very much for this. Here's a (only compile-tested) patch for this, on top of jwessel's current kgdb-next branch. Jason, would you mind testing on pre-nv20 and applying?

Thanks Chris,

This is applied to the kgdb tree, and I'll send the whole atomic modesetting series over to dri-devel as soon as it passes the regression tests as that should be the place it is merged from unless we receive sign-off from Jesse Barnes and Dave Airlie in which case I'll put it in a future pull request.

It was pretty cool to see the kdb/kms feature finally working on the laptop I use the most.

Thanks,
Jason.

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev

#10 lore raw
In reply to a message not in the archive
Quoted 8 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

Hi,

I just tried that patch, but unfortunately nether with nor without it kdb seems not to work.
It could be id10t error from my side, but I did test the kdb in the past with few KMS patches, and it seemed to work.

Now I can't even get its prompt on the console.

This is what I do:

echo kbd | sudo tee /sys/module/kgdboc/parameters/kgdboc (also tried booting with kgdboc=kbd)

Both seems to start kdb, because

maxim@maxim-laptop:~$ cat /sys/module/kgdboc/parameters/kgdboc 
kbd
maxim@maxim-laptop:~$ dmesg | grep kgdb
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-2.6.36-rc3+ root=UUID=52341b68-74f3-4c96-aaf8-7586a06c4b4e ro splash video=nouveau nmi_watchdog=lapic kgdboc=kbd
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-2.6.36-rc3+ root=UUID=52341b68-74f3-4c96-aaf8-7586a06c4b4e ro splash video=nouveau nmi_watchdog=lapic kgdboc=kbd
[    2.671914] kgdb: Registered I/O driver kgdboc.

Now when I first switch to console and then press Alt+SysRQ+G, I just get SYSRQ: DEBUG, and system hangs. It could be printk level, but that should be ok, no?

maxim@maxim-laptop:~$ cat /proc/sys/kernel/printk
7       4       1       7

Also if I remember correct inputting 'g' then ENTER should resume the system, but it doesn't.

So I think kdb doesn't work at all here

Best regards,
Maxim Levitsky

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

#11 lore raw
Quoted 19 lines · Maxim Levitsky
Quoted 9 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

Hi,

I just tried that patch, but unfortunately nether with nor without it kdb seems not to work.
It could be id10t error from my side, but I did test the kdb in the past with few KMS patches, and it seemed to work.

Quoted 7 lines

Now I can't even get its prompt on the console.

This is what I do:

echo kbd | sudo tee /sys/module/kgdboc/parameters/kgdboc (also tried booting with kgdboc=kbd)

Try changing it to kgdboc=kms,kbd or the "echo kms,kbd"

When you use only the kbd, the kms feature is not activated.

Jason.

------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:

Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
Kgdb-bugreport mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

#12 lore raw
Quoted 24 lines · Jason Wessel
Quoted 23 lines · Maxim Levitsky
Quoted 9 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

Hi,

I just tried that patch, but unfortunately nether with nor without it kdb seems not to work.
It could be id10t error from my side, but I did test the kdb in the past with few KMS patches, and it seemed to work.

Now I can't even get its prompt on the console.

This is what I do:

Quoted 7 lines
Quoted 3 lines

echo kbd | sudo tee /sys/module/kgdboc/parameters/kgdboc (also tried booting with kgdboc=kbd)

Try changing it to kgdboc=kms,kbd or the "echo kms,kbd"

When you use only the kbd, the kms feature is not activated.

This doesn't help.

I am afraid that this bug isn't related to kms, but rather is generic.

Best regards,
Maxim Levitsky

------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:

Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
Kgdb-bugreport mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

#13 lore raw
Quoted 29 lines · Maxim Levitsky
Quoted 28 lines · Jason Wessel
Quoted 26 lines · Maxim Levitsky
Quoted 9 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

Hi,

I just tried that patch, but unfortunately nether with nor without it kdb seems not to work.
It could be id10t error from my side, but I did test the kdb in the past with few KMS patches, and it seemed to work.

Now I can't even get its prompt on the console.

This is what I do:

echo kbd | sudo tee /sys/module/kgdboc/parameters/kgdboc (also tried booting with kgdboc=kbd)

Quoted 6 lines
Quoted 3 lines

Try changing it to kgdboc=kms,kbd or the "echo kms,kbd"

When you use only the kbd, the kms feature is not activated.

This doesn't help.

I am afraid that this bug isn't related to kms, but rather is generic.

I turns out that it was the NMI watchdog that I had enabled. Without it kdb works very well, including the kms support.

It would be better if you were to detect kms instead of adding an explicit param to kgdboc cmd line.

Also found out that after a debug session with Alt+SysRQ+g and X running, these keys aren't released. I had to press on all of them to make them release.
It makes sense as kgdboc in that case reads directly from keyboard port.

Best regards,
Maxim Levitsky

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Kgdb-bugreport mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

#14 lore raw
Quoted 32 lines · Maxim Levitsky
Quoted 31 lines · Maxim Levitsky
Quoted 30 lines · Jason Wessel
Quoted 19 lines · Maxim Levitsky
Quoted 9 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

Hi,

I just tried that patch, but unfortunately nether with nor without it kdb seems not to work.
It could be id10t error from my side, but I did test the kdb in the past with few KMS patches, and it seemed to work.

Quoted 7 lines

Now I can't even get its prompt on the console.

This is what I do:

echo kbd | sudo tee /sys/module/kgdboc/parameters/kgdboc (also tried booting with kgdboc=kbd)

Try changing it to kgdboc=kms,kbd or the "echo kms,kbd"

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

When you use only the kbd, the kms feature is not activated.

This doesn't help.

I am afraid that this bug isn't related to kms, but rather is generic.

I turns out that it was the NMI watchdog that I had enabled. Without it kdb works very well, including the kms support.

Please disregard this. kdb works with nmi watchdog now as well. Probably something was fixed, maybe unrelated to it.

Quoted 8 lines

It would be better if you were to detect kms instead of adding an explicit param to kgdboc cmd line.

Also found out that after a debug session with Alt+SysRQ+g and X running, these keys aren't released. I had to press on all of them to make them release.
It makes sense as kgdboc in that case reads directly from keyboard port.

And I see that kgdb actually has a code that works that around. I suspect that what happens is that keys are released before X continues running, and therefore it doesn't pick these events up.

Best regards,
Maxim Levitsky

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Kgdb-bugreport mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

#15 lore raw
Quoted 47 lines · Maxim Levitsky
Quoted 32 lines · Maxim Levitsky
Quoted 31 lines · Maxim Levitsky
Quoted 30 lines · Jason Wessel
Quoted 19 lines · Maxim Levitsky
Quoted 9 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

Hi,

I just tried that patch, but unfortunately nether with nor without it kdb seems not to work.
It could be id10t error from my side, but I did test the kdb in the past with few KMS patches, and it seemed to work.

Quoted 7 lines

Now I can't even get its prompt on the console.

This is what I do:

echo kbd | sudo tee /sys/module/kgdboc/parameters/kgdboc (also tried booting with kgdboc=kbd)

Try changing it to kgdboc=kms,kbd or the "echo kms,kbd"

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

When you use only the kbd, the kms feature is not activated.

This doesn't help.

I am afraid that this bug isn't related to kms, but rather is generic.

I turns out that it was the NMI watchdog that I had enabled. Without it kdb works very well, including the kms support.

Please disregard this. kdb works with nmi watchdog now as well. Probably something was fixed, maybe unrelated to it.

Quoted 4 lines

It would be better if you were to detect kms instead of adding an explicit param to kgdboc cmd line.

Quoted 7 lines
Quoted 4 lines

Also found out that after a debug session with Alt+SysRQ+g and X running, these keys aren't released. I had to press on all of them to make them release.
It makes sense as kgdboc in that case reads directly from keyboard port.

And I see that kgdb actually has a code that works that around. I suspect that what happens is that keys are released before X continues running, and therefore it doesn't pick these events up.

However an evtest on input event running on kernel tty, still only picks release of the alt key.

Best regards,
Maxim Levitsky

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Kgdb-bugreport mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

#16 lore raw
Quoted 52 lines · Maxim Levitsky
Quoted 51 lines · Maxim Levitsky
Quoted 32 lines · Maxim Levitsky
Quoted 31 lines · Maxim Levitsky
Quoted 30 lines · Jason Wessel
Quoted 19 lines · Maxim Levitsky
Quoted 9 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

Hi,

I just tried that patch, but unfortunately nether with nor without it kdb seems not to work.
It could be id10t error from my side, but I did test the kdb in the past with few KMS patches, and it seemed to work.

Quoted 7 lines

Now I can't even get its prompt on the console.

This is what I do:

echo kbd | sudo tee /sys/module/kgdboc/parameters/kgdboc (also tried booting with kgdboc=kbd)

Try changing it to kgdboc=kms,kbd or the "echo kms,kbd"

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

When you use only the kbd, the kms feature is not activated.

This doesn't help.

I am afraid that this bug isn't related to kms, but rather is generic.

I turns out that it was the NMI watchdog that I had enabled. Without it kdb works very well, including the kms support.

Please disregard this. kdb works with nmi watchdog now as well. Probably something was fixed, maybe unrelated to it.

Quoted 8 lines

It would be better if you were to detect kms instead of adding an explicit param to kgdboc cmd line.

Also found out that after a debug session with Alt+SysRQ+g and X running, these keys aren't released. I had to press on all of them to make them release.
It makes sense as kgdboc in that case reads directly from keyboard port.

Quoted 6 lines
Quoted 3 lines

And I see that kgdb actually has a code that works that around. I suspect that what happens is that keys are released before X continues running, and therefore it doesn't pick these events up.

However an evtest on input event running on kernel tty, still only picks release of the alt key.

[Dropped nouveau list, because this is offtopic there]

I pretty much got to the bottom of this.
There are 2 separate issues:

1. SysRq handler is now a input 'filter', which means that it can 'eat' input events, so they don't show up on input bus.
It does so while sysrq key is down.
So sysrq and 'g' events never reach the kernel kbd driver and therefore the hack to release them doesn't work.

2. The kbd_clear_keys_helper injects the keyup events alright, but it doesn't inject SYN events, and therefore X evdev driver doesn't pick these injected events untill next SYN event.

This patch makes key release work in expense of showing sysrq key to userspace, which isn't that good, because now Alt+SysRQ causes a screen capture by default.
In my opinion the sysrq filter should stay.
We should just make kdb hook into atkbd and do the key release there.
This should both result in cleaner/more robust code, and make this issue disappear. I'll look at doing that.

drivers/char/keyboard.c +1 -0
index 0c6c641..7df6af5 100644
@@ -368,6 +368,7 @@ static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
 {
 	unsigned int *keycode = data;
 	input_inject_event(handle, EV_KEY, *keycode, 0);
+	input_inject_event(handle, EV_SYN, SYN_REPORT, 0);
 	return 0;
 }
 
drivers/char/sysrq.c +1 -1
index ef31bb8..db1eb12 100644
@@ -601,7 +601,7 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
 	}
 
 out:
-	return sysrq_down;
+	return 0;
 }
 
 static int sysrq_connect(struct input_handler *handler,

Best regards,
Maxim Levitsky

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#17 lore raw
Quoted 111 lines · Maxim Levitsky
Quoted 52 lines · Maxim Levitsky
Quoted 51 lines · Maxim Levitsky
Quoted 32 lines · Maxim Levitsky
Quoted 31 lines · Maxim Levitsky
Quoted 30 lines · Jason Wessel
Quoted 19 lines · Maxim Levitsky
Quoted 9 lines · Chris Ball

Hi,

Here's a patch to add support for KMS debugging to Nouveau, along the style of the previous patches for Intel¹ and Radeon². I'm only able to test on nv50 here, so a test on nv04 would be much appreciated, and I've published instructions on how to test here³. Thanks!

- Chris.

Hi,

I just tried that patch, but unfortunately nether with nor without it kdb seems not to work.
It could be id10t error from my side, but I did test the kdb in the past with few KMS patches, and it seemed to work.

Quoted 7 lines

Now I can't even get its prompt on the console.

This is what I do:

echo kbd | sudo tee /sys/module/kgdboc/parameters/kgdboc (also tried booting with kgdboc=kbd)

Try changing it to kgdboc=kms,kbd or the "echo kms,kbd"

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

When you use only the kbd, the kms feature is not activated.

This doesn't help.

I am afraid that this bug isn't related to kms, but rather is generic.

I turns out that it was the NMI watchdog that I had enabled. Without it kdb works very well, including the kms support.

Please disregard this. kdb works with nmi watchdog now as well. Probably something was fixed, maybe unrelated to it.

Quoted 8 lines

It would be better if you were to detect kms instead of adding an explicit param to kgdboc cmd line.

Also found out that after a debug session with Alt+SysRQ+g and X running, these keys aren't released. I had to press on all of them to make them release.
It makes sense as kgdboc in that case reads directly from keyboard port.

Quoted 6 lines
Quoted 3 lines

And I see that kgdb actually has a code that works that around. I suspect that what happens is that keys are released before X continues running, and therefore it doesn't pick these events up.

However an evtest on input event running on kernel tty, still only picks release of the alt key.

[Dropped nouveau list, because this is offtopic there]

I pretty much got to the bottom of this.
There are 2 separate issues:

1. SysRq handler is now a input 'filter', which means that it can 'eat' input events, so they don't show up on input bus.
It does so while sysrq key is down.
So sysrq and 'g' events never reach the kernel kbd driver and therefore the hack to release them doesn't work.

2. The kbd_clear_keys_helper injects the keyup events alright, but it doesn't inject SYN events, and therefore X evdev driver doesn't pick these injected events untill next SYN event.

This patch makes key release work in expense of showing sysrq key to userspace, which isn't that good, because now Alt+SysRQ causes a screen capture by default.
In my opinion the sysrq filter should stay.
We should just make kdb hook into atkbd and do the key release there.
This should both result in cleaner/more robust code, and make this issue disappear. I'll look at doing that.

drivers/char/keyboard.c +1 -0
index 0c6c641..7df6af5 100644
@@ -368,6 +368,7 @@ static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
 {
 	unsigned int *keycode = data;
 	input_inject_event(handle, EV_KEY, *keycode, 0);
+	input_inject_event(handle, EV_SYN, SYN_REPORT, 0);
 	return 0;
 }
 
drivers/char/sysrq.c +1 -1
index ef31bb8..db1eb12 100644
@@ -601,7 +601,7 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
 	}
 
 out:
-	return sysrq_down;
+	return 0;
 }
 
 static int sysrq_connect(struct input_handler *handler,
Quoted 3 lines

Best regards,
Maxim Levitsky

Ping.

Maxim Levitsky

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Kgdb-bugreport mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

#18 lore raw
Quoted 49 lines · Maxim Levitsky
Quoted 49 lines

[Dropped nouveau list, because this is offtopic there]

I pretty much got to the bottom of this.
There are 2 separate issues:

1. SysRq handler is now a input 'filter', which means that it can 'eat' input events, so they don't show up on input bus.
It does so while sysrq key is down.
So sysrq and 'g' events never reach the kernel kbd driver and therefore the hack to release them doesn't work.

2. The kbd_clear_keys_helper injects the keyup events alright, but it doesn't inject SYN events, and therefore X evdev driver doesn't pick these injected events untill next SYN event.

This patch makes key release work in expense of showing sysrq key to userspace, which isn't that good, because now Alt+SysRQ causes a screen capture by default.
In my opinion the sysrq filter should stay.
We should just make kdb hook into atkbd and do the key release there.
This should both result in cleaner/more robust code, and make this issue disappear. I'll look at doing that.

drivers/char/keyboard.c +1 -0
index 0c6c641..7df6af5 100644
@@ -368,6 +368,7 @@ static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
 {
 	unsigned int *keycode = data;
 	input_inject_event(handle, EV_KEY, *keycode, 0);
+	input_inject_event(handle, EV_SYN, SYN_REPORT, 0);
 	return 0;
 }
 
drivers/char/sysrq.c +1 -1
index ef31bb8..db1eb12 100644
@@ -601,7 +601,7 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
 	}
 
 out:
-	return sysrq_down;
+	return 0;
 }
 
Quoted 7 lines
Quoted 7 lines
drivers/char/sysrq.c +0 -0
 static int sysrq_connect(struct input_handler *handler,

Best regards,
Maxim Levitsky

Hi Maxim,

Is it the case that this patch takes care of masking the sysrq event from user space?

Originally before it became an input filter I had a patch to the keyboard.c to completely consume the keypress of the sysrq-g.

I have been less than successful at getting the keyboard changes upstreamed, and I was probably going to ping AKPM, because on that front I had not received any kind of response either (linux-input that is).

Certainly I can carry your patch in my branch until we can determine a final upstream design.

Thanks,
Jason.

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev

#19 lore raw
Quoted 66 lines · Jason Wessel
Quoted 49 lines · Maxim Levitsky
Quoted 49 lines

[Dropped nouveau list, because this is offtopic there]

I pretty much got to the bottom of this.
There are 2 separate issues:

1. SysRq handler is now a input 'filter', which means that it can 'eat' input events, so they don't show up on input bus.
It does so while sysrq key is down.
So sysrq and 'g' events never reach the kernel kbd driver and therefore the hack to release them doesn't work.

2. The kbd_clear_keys_helper injects the keyup events alright, but it doesn't inject SYN events, and therefore X evdev driver doesn't pick these injected events untill next SYN event.

This patch makes key release work in expense of showing sysrq key to userspace, which isn't that good, because now Alt+SysRQ causes a screen capture by default.
In my opinion the sysrq filter should stay.
We should just make kdb hook into atkbd and do the key release there.
This should both result in cleaner/more robust code, and make this issue disappear. I'll look at doing that.

drivers/char/keyboard.c +1 -0
index 0c6c641..7df6af5 100644
@@ -368,6 +368,7 @@ static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
 {
 	unsigned int *keycode = data;
 	input_inject_event(handle, EV_KEY, *keycode, 0);
+	input_inject_event(handle, EV_SYN, SYN_REPORT, 0);
 	return 0;
 }
 
drivers/char/sysrq.c +1 -1
index ef31bb8..db1eb12 100644
@@ -601,7 +601,7 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
 	}
 
 out:
-	return sysrq_down;
+	return 0;
 }
 
Quoted 7 lines
Quoted 7 lines
drivers/char/sysrq.c +0 -0
 static int sysrq_connect(struct input_handler *handler,

Best regards,
Maxim Levitsky

Hi Maxim,

Is it the case that this patch takes care of masking the sysrq event from user space?

Originally before it became an input filter I had a patch to the keyboard.c to completely consume the keypress of the sysrq-g.

Quoted 6 lines

I have been less than successful at getting the keyboard changes upstreamed, and I was probably going to ping AKPM, because on that front I had not received any kind of response either (linux-input that is).

Certainly I can carry your patch in my branch until we can determine a final upstream design.

Its an option, but bear in the mind that my 'patch' causes very unpleasant regression.
The regression is that now Alt+SysRQ is reported to userspace and treated as a PrintScreen which in gnome is treated as a launcher for screenshot application.
So after you pressed it, you will end up with an army of gnome-screenshots poping up.
So I think that tty kbd driver is wrong place for key release.

The right solution in my opinion is to make atkbd register with kgdb and provide to it, the polling keyboard IO services, and also take care of releasing the keys as soon as debug mode is entered or exited.

Btw, can a driver register a hook into kgdb to be executed on enter/leave of the debug mode?
If so the atkbd driver should just do that.

I am also aware of the fact that atkbd doesn't talk to hardware directly.
Thus 'the' proper fix is also to add a polled serio handlers, make atkbd use them
if available and if so, register with the kgdb.

Best regards,
Maxim Levitsky

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev

#20 lore raw
Quoted 74 lines · Maxim Levitsky
Quoted 66 lines · Jason Wessel
Quoted 49 lines · Maxim Levitsky
Quoted 49 lines

[Dropped nouveau list, because this is offtopic there]

I pretty much got to the bottom of this.
There are 2 separate issues:

1. SysRq handler is now a input 'filter', which means that it can 'eat' input events, so they don't show up on input bus.
It does so while sysrq key is down.
So sysrq and 'g' events never reach the kernel kbd driver and therefore the hack to release them doesn't work.

2. The kbd_clear_keys_helper injects the keyup events alright, but it doesn't inject SYN events, and therefore X evdev driver doesn't pick these injected events untill next SYN event.

This patch makes key release work in expense of showing sysrq key to userspace, which isn't that good, because now Alt+SysRQ causes a screen capture by default.
In my opinion the sysrq filter should stay.
We should just make kdb hook into atkbd and do the key release there.
This should both result in cleaner/more robust code, and make this issue disappear. I'll look at doing that.

drivers/char/keyboard.c +1 -0
index 0c6c641..7df6af5 100644
@@ -368,6 +368,7 @@ static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
 {
 	unsigned int *keycode = data;
 	input_inject_event(handle, EV_KEY, *keycode, 0);
+	input_inject_event(handle, EV_SYN, SYN_REPORT, 0);
 	return 0;
 }
 
drivers/char/sysrq.c +1 -1
index ef31bb8..db1eb12 100644
@@ -601,7 +601,7 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
 	}
 
 out:
-	return sysrq_down;
+	return 0;
 }
 
Quoted 7 lines
Quoted 7 lines
drivers/char/sysrq.c +0 -0
 static int sysrq_connect(struct input_handler *handler,

Best regards,
Maxim Levitsky

Hi Maxim,

Is it the case that this patch takes care of masking the sysrq event from user space?

Originally before it became an input filter I had a patch to the keyboard.c to completely consume the keypress of the sysrq-g.

Quoted 6 lines

I have been less than successful at getting the keyboard changes upstreamed, and I was probably going to ping AKPM, because on that front I had not received any kind of response either (linux-input that is).

Certainly I can carry your patch in my branch until we can determine a final upstream design.

Quoted 9 lines

Its an option, but bear in the mind that my 'patch' causes very unpleasant regression.
The regression is that now Alt+SysRQ is reported to userspace and treated as a PrintScreen which in gnome is treated as a launcher for screenshot application.
So after you pressed it, you will end up with an army of gnome-screenshots poping up.
So I think that tty kbd driver is wrong place for key release.

Agree.

Quoted 3 lines

The right solution in my opinion is to make atkbd register with kgdb and provide to it, the polling keyboard IO services, and also take care of releasing the keys as soon as debug mode is entered or exited.

Disagree. We may support different keyboard devices with kdb or use one keyboard (USB) to drop into debugger and then switch to atkbd...

I think we need to move Jason's code from drivers/char/keyboard.c to drivers/char/sysrq.c and have it track keys that have been kept pressed before entering sysrq mode and release them when leaving the mode.

We also need to teach sysrq that some handlers need resetting of the keyboard state.

Quoted 10 lines

Btw, can a driver register a hook into kgdb to be executed on enter/leave of the debug mode?
If so the atkbd driver should just do that.

I am also aware of the fact that atkbd doesn't talk to hardware directly.
Thus 'the' proper fix is also to add a polled serio handlers, make atkbd use them
if available and if so, register with the kgdb.

The issue is not that interrupts are not available but that we are holding too many locks...

Signature · 1 line
Dmitry
#21 lore raw
Quoted 32 lines · Dmitry Torokhov
Quoted 30 lines · Maxim Levitsky
Quoted 28 lines · Jason Wessel
Quoted 26 lines · Maxim Levitsky
Quoted 26 lines

[Dropped nouveau list, because this is offtopic there]

I pretty much got to the bottom of this.
There are 2 separate issues:

1. SysRq handler is now a input 'filter', which means that it can 'eat' input events, so they don't show up on input bus.
It does so while sysrq key is down.
So sysrq and 'g' events never reach the kernel kbd driver and therefore the hack to release them doesn't work.

2. The kbd_clear_keys_helper injects the keyup events alright, but it doesn't inject SYN events, and therefore X evdev driver doesn't pick these injected events untill next SYN event.

This patch makes key release work in expense of showing sysrq key to userspace, which isn't that good, because now Alt+SysRQ causes a screen capture by default.
In my opinion the sysrq filter should stay.
We should just make kdb hook into atkbd and do the key release there.
This should both result in cleaner/more robust code, and make this issue disappear. I'll look at doing that.

Quoted 12 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
drivers/char/keyboard.c +0 -0
index 0c6c641..7df6af5 100644
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines

drivers/char/keyboard.c static int kbd_clear_keys_helper(struct input_handle *handle, void *data) · line 374

Quoted 8 lines
drivers/char/keyboard.c +1 -0
@@ -368,6 +368,7 @@ static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
 {
 	unsigned int *keycode = data;
 	input_inject_event(handle, EV_KEY, *keycode, 0);
+	input_inject_event(handle, EV_SYN, SYN_REPORT, 0);
 	return 0;
 }
 

So I kept this piece, in the 0002 patch which is attached. I revised
the keyboard/input series at:

http://git.kernel.org/?p=linux/kernel/git/jwessel/linux-2.6-kgdb.git;a=shortlog;h=refs/heads/for_input

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
drivers/char/sysrq.c +0 -0
index ef31bb8..db1eb12 100644
@@ -601,7 +601,7 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
 	}
 
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines

drivers/char/sysrq.c static bool sysrq_filter(struct input_handle *handle, unsigned int type, · line 606

Quoted 5 lines
drivers/char/sysrq.c +1 -1
 out:
-	return sysrq_down;
+	return 0;
 }
 

I took some time to look more closely at the problem, and I believe we still want to filter out all these input events.

Quoted 9 lines
Quoted 5 lines

The right solution in my opinion is to make atkbd register with kgdb and provide to it, the polling keyboard IO services, and also take care of releasing the keys as soon as debug mode is entered or exited.

Disagree. We may support different keyboard devices with kdb or use one keyboard (USB) to drop into debugger and then switch to atkbd...

Quoted 8 lines

I think we need to move Jason's code from drivers/char/keyboard.c to drivers/char/sysrq.c and have it track keys that have been kept pressed before entering sysrq mode and release them when leaving the mode.

We also need to teach sysrq that some handlers need resetting of the keyboard state.

I found the root of the problem was the low level keyboard bit mask
getting out of sync in the input layer. Perhaps Dmitry can have a look
at the 3rd patch in the series, which addresses the problem.

I also put these patches into kgdb-next.

I believe it fixes the problems Maxim encountered, or at least the problems I observed independently with stuck keys and the lack of the ability to correctly use alt-PrintScreen.

If you are willing Maxim, can you give these patches a go?

Thanks,
Jason.

Quoted 1 line

From ed6fb201ca864e977c6a4fcf345014fd1d4ebed4 Mon Sep 17 00:00:00 2001

From: Jason Wessel <[email protected]>
Date: Sun, 26 Sep 2010 06:33:36 -0500
Subject: [PATCH 1/3] keyboard,kgdboc: Allow key release on kernel resume

When using a keyboard with kdb, a hook point to free all the keystrokes is required for resuming kernel operations.

This is mainly because there is no way to force the end user to hold down the original keys that were pressed prior to entering kdb when resuming the kernel.

The kgdboc driver will call kbd_dbg_clear_keys() just prior to resuming the kernel execution which will schedule a callback to clear any keys which were depressed prior to the entering the kernel debugger.

CC Dmitry Torokhov <[email protected]>
CC Greg Kroah-Hartman <[email protected]>
---
 drivers/char/keyboard.c  |   37 +++++++++++++++++++++++++++++++++++++
 drivers/serial/kgdboc.c  |   13 +++++++++++++
 include/linux/kbd_kern.h |    1 +
 3 files changed, 51 insertions(+), 0 deletions(-)
drivers/char/keyboard.c +37 -0
index a7ca752..0c6c641 100644
@@ -363,6 +363,43 @@ static void to_utf8(struct vc_data *vc, uint c)
 	}
 }
 
+#ifdef CONFIG_KDB_KEYBOARD
+static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
+{
+	unsigned int *keycode = data;
+	input_inject_event(handle, EV_KEY, *keycode, 0);
+	return 0;
+}
+
+static void kbd_clear_keys_callback(struct work_struct *dummy)
+{
+	unsigned int i, j, k;
+
+	for (i = 0; i < ARRAY_SIZE(key_down); i++) {
+		if (!key_down[i])
+			continue;
+
+		k = i * BITS_PER_LONG;
+
+		for (j = 0; j < BITS_PER_LONG; j++, k++) {
+			if (!test_bit(k, key_down))
+				continue;
+			input_handler_for_each_handle(&kbd_handler, &k,
+				      kbd_clear_keys_helper);
+		}
+	}
+}
+
+static DECLARE_WORK(kbd_clear_keys_work, kbd_clear_keys_callback);
+
+/* Called to clear any key presses after resuming the kernel. */
+void kbd_dbg_clear_keys(void)
+{
+	schedule_work(&kbd_clear_keys_work);
+}
+EXPORT_SYMBOL_GPL(kbd_dbg_clear_keys);
+#endif /* CONFIG_KDB_KEYBOARD */
+
 /*
  * Called after returning from RAW mode or when changing consoles - recompute
  * shift_down[] and shift_state from key_down[] maybe called when keymap is
drivers/serial/kgdboc.c +13 -0
index 39f9a1a..62b6edc 100644
@@ -18,6 +18,7 @@
 #include <linux/tty.h>
 #include <linux/console.h>
 #include <linux/vt_kern.h>
+#include <linux/kbd_kern.h>
 
 #define MAX_CONFIG_LEN		40
 
@@ -37,12 +38,16 @@ static struct tty_driver	*kgdb_tty_driver;
 static int			kgdb_tty_line;
 
 #ifdef CONFIG_KDB_KEYBOARD
+static bool			kgdboc_use_kbd;
+
 static int kgdboc_register_kbd(char **cptr)
 {
+	kgdboc_use_kbd = false;
 	if (strncmp(*cptr, "kbd", 3) == 0) {
 		if (kdb_poll_idx < KDB_POLL_FUNC_MAX) {
 			kdb_poll_funcs[kdb_poll_idx] = kdb_get_kbd_char;
 			kdb_poll_idx++;
+			kgdboc_use_kbd = true;
 			if (cptr[0][3] == ',')
 				*cptr += 4;
 			else
@@ -65,9 +70,16 @@ static void kgdboc_unregister_kbd(void)
 		}
 	}
 }
+
+static inline void kgdboc_clear_kbd(void)
+{
+	if (kgdboc_use_kbd)
+		kbd_dbg_clear_keys(); /* Release all pressed keys */
+}
 #else /* ! CONFIG_KDB_KEYBOARD */
 #define kgdboc_register_kbd(x) 0
 #define kgdboc_unregister_kbd()
+#define kgdboc_clear_kbd()
 #endif /* ! CONFIG_KDB_KEYBOARD */
 
 static int kgdboc_option_setup(char *opt)
@@ -231,6 +243,7 @@ static void kgdboc_post_exp_handler(void)
 		dbg_restore_graphics = 0;
 		con_debug_leave();
 	}
+	kgdboc_clear_kbd();
 }
 
 static struct kgdb_io kgdboc_io_ops = {
include/linux/kbd_kern.h +1 -0
index 506ad20..ae87c0a 100644
@@ -144,6 +144,7 @@ struct console;
 int getkeycode(unsigned int scancode);
 int setkeycode(unsigned int scancode, unsigned int keycode);
 void compute_shiftstate(void);
+void kbd_dbg_clear_keys(void);
 
 /* defkeymap.c */
 
Signature · 1 line
1.6.3.3
Quoted 1 line

From 43eb157cdf4213e8b7792746e7d11afec2309205 Mon Sep 17 00:00:00 2001

From: Maxim Levitsky <[email protected]>
Date: Wed, 22 Sep 2010 10:07:05 -0700
Subject: [PATCH 2/3] keyboard,kdb: inject SYN events in kbd_clear_keys_helper

The kbd_clear_keys_helper injects the keyup events alright, but it doesn't inject SYN events, and therefore X evdev driver doesn't pick these injected events untill next SYN event.

---
 drivers/char/keyboard.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/char/keyboard.c +1 -0
index 0c6c641..7df6af5 100644
@@ -368,6 +368,7 @@ static int kbd_clear_keys_helper(struct input_handle *handle, void *data)
 {
 	unsigned int *keycode = data;
 	input_inject_event(handle, EV_KEY, *keycode, 0);
+	input_inject_event(handle, EV_SYN, SYN_REPORT, 0);
 	return 0;
 }
 
Signature · 1 line
1.6.3.3
Quoted 1 line

From 33dea0e730e03814f0cd71c604185ba1c7fad51d Mon Sep 17 00:00:00 2001

From: Jason Wessel <[email protected]>
Date: Tue, 5 Oct 2010 14:38:36 -0500
Subject: [PATCH 3/3] sysrq,keyboard: properly deal with alt-sysrq in sysrq input filter

This patch addresses 2 problems:

1) You should still be able to use alt-PrintScreen to capture a grab of a single window when the sysrq filter is active.

2) The sysrq filter should reset the low level key mask so that future key presses will not show up as a repeated key. The problem was that when you executed alt-sysrq g and then resumed the kernel, you would have to press 'g' twice to get it working again.

---
 drivers/char/sysrq.c |   64 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 61 insertions(+), 3 deletions(-)
drivers/char/sysrq.c +61 -3

89 lines not on this page · raw message

Signature · 1 line
1.6.3.3
#22 lore raw
Quoted 25 lines · Jason Wessel
Quoted 24 lines · Dmitry Torokhov
Quoted 22 lines · Maxim Levitsky
Quoted 20 lines · Jason Wessel
Quoted 18 lines · Maxim Levitsky
Quoted 18 lines

[Dropped nouveau list, because this is offtopic there]

I pretty much got to the bottom of this.
There are 2 separate issues:

1. SysRq handler is now a input 'filter', which means that it can 'eat' input events, so they don't show up on input bus.
It does so while sysrq key is down.
So sysrq and 'g' events never reach the kernel kbd driver and therefore the hack to release them doesn't work.

2. The kbd_clear_keys_helper injects the keyup events alright, but it doesn't inject SYN events, and therefore X evdev driver doesn't pick these injected events untill next SYN event.

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

This patch makes key release work in expense of showing sysrq key to userspace, which isn't that good, because now Alt+SysRQ causes a screen capture by default.
In my opinion the sysrq filter should stay.
We should just make kdb hook into atkbd and do the key release there.
This should both result in cleaner/more robust code, and make this issue disappear. I'll look at doing that.

Nope, still same problem.
Maybe more keys were released, but still
pressing Alt+SysRQ+g second time doesn't break to the debugger.

I pulled your kgdb-next branch which does contain these patches.

Best regards,
Maxim Levitsky

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3. Spend less time writing and rewriting code and more time creating great experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb

#23 lore raw

sysrq filter and stuck keys [ was Re: [Nouveau] [PATCH] drm/nouveau/kms: Implement KDB debug hooks for nouveau KMS.]

Quoted 6 lines · Maxim Levitsky

Nope, still same problem.
Maybe more keys were released, but still
pressing Alt+SysRQ+g second time doesn't break to the debugger.

Thanks for trying this out Maxim.

I have to wonder if part of the problem is the way that raw events can propagate directly via the old keyboard interface vs the input layer. I had noticed something somewhat similar with an xorg.conf which appeared to be using both the raw keyboard and the input layer for input. I was having all sorts of problems until I changed the xorg.conf settings to use the input layer. I noticed that even pressing the up arrow in an xterm was invoking the screen shot mechanism for example.

Perhaps you can provide some more data to see if this is a similar problem or not.

On the Fedora 13 test system I made sure the following were commented out in the xorg.conf file.

# InputDevice "Keyboard0" "CoreKeyboard"

# Option "AllowEmptyInput" "off"

This had resolved the issue at least for the system with the Intel graphics chip and non-usb keyboard.

The next step might be to have you run with an instrumented kernel if this is not the issue, and of course if you are willing to help further debug this.

Thanks,
Jason.

#24 lore raw

Re: sysrq filter and stuck keys [ was Re: [Nouveau] [PATCH] drm/nouveau/kms: Implement KDB debug hooks for nouveau KMS.]

Quoted 18 lines · Jason Wessel
Quoted 6 lines · Maxim Levitsky

Nope, still same problem.
Maybe more keys were released, but still
pressing Alt+SysRQ+g second time doesn't break to the debugger.

Thanks for trying this out Maxim.

I have to wonder if part of the problem is the way that raw events can propagate directly via the old keyboard interface vs the input layer. I had noticed something somewhat similar with an xorg.conf which appeared to be using both the raw keyboard and the input layer for input. I was having all sorts of problems until I changed the xorg.conf settings to use the input layer. I noticed that even pressing the up arrow in an xterm was invoking the screen shot mechanism for example.

Quoted 2 lines

Perhaps you can provide some more data to see if this is a similar problem or not.

Jardon, I already found the root cause of the problem. First of all, note that I use xorg's evdev driver. The in-kernel tty kbd driver is only used for virtual consoles.

The root cause is that in-kernel kbd driver beeing a client of the input subsystem just doesn't see the sysrq keys because they are filtered, therefore it can't release them.

The right solution is to somehow hook at the atkbd driver , tell it that kbd tampered with its hardware, and make it release the keys.

But that is easy to say, not that easy to do...

the in-kernel kbd driver just isn't the right place for the job.

Best regards,
Maxim Levitsky

#25 lore raw

Re: sysrq filter and stuck keys [ was Re: [Nouveau] [PATCH] drm/nouveau/kms: Implement KDB debug hooks for nouveau KMS.]

Quoted 5 lines · Maxim Levitsky

Jason, I already found the root cause of the problem. First of all, note that I use xorg's evdev driver. The in-kernel tty kbd driver is only used for virtual consoles.

I would like to clarify where you observed the problem. Was it only on the tty console in X or both places?

Quoted 5 lines

The root cause is that in-kernel kbd driver beeing a client of the input subsystem just doesn't see the sysrq keys because they are filtered, therefore it can't release them.

With the 3 patches to the input layer in kgdb-next I cannot duplicate the problem at all. If I remove the last patch in the series, and use the tty console, I can definitely see the behavior you mention. I had added a change to the sysrq input filter (which is consumes the key strokes) that also resets the key mask in the tty keyboard driver

Specifically in

+ /* Clear handled keys from being flagged as a
repeated stroke */
+ __clear_bit(code, handle->dev->key);

Else drivers that use these bits for autorepeat (like the atkbd driver) will end up with stuck keys.

Quoted 4 lines

The right solution is to somehow hook at the atkbd driver , tell it that kbd tampered with its hardware, and make it release the keys.

I don't think we need to do that because the input filter should be able to actually "properly" filter state to all its clients. As a last resort of course the HW state could be tracked and updated, but ideally I'd like to avoid it.

Jason.