Input: mousedev - add a schedule point in mousedev_write()
Sasha Levin
maintainerPATCH 1/4 Input: mousedev - add a schedule point in mousedev_write()
From: Eric Dumazet <[email protected]>
[ Upstream commit f74c371fe72a4f820d287db8067683fb533e4ede ]
syzbot was able to trigger rcu stalls by calling write() with large number of bytes.
Add a cond_resched() in the loop to avoid this.
--- drivers/input/mousedev.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/mousedev.c +1 -0
@@ -701,6 +701,7 @@ static ssize_t mousedev_write(struct file *file, const char __user *buffer,mousedev_generate_response (client, c);spin_unlock_irq (&client->packet_lock); +cond_resched (); }kill_fasync (&client->fasync,SIGIO ,POLL_IN );
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 2/4 Input: evdev - add a schedule point in evdev_write()
From: Dmitry Torokhov <[email protected]>
[ Upstream commit 36d2582ff235b4e01ad64a734c877a52dc762d9c ]
Large writes to evdev interface may cause rcu stalls. Let's add cond_resched() to the loop to avoid this.
--- drivers/input/evdev.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/evdev.c +1 -0
@@ -450,6 +450,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer,input_inject_event (&evdev->handle, event.type, event.code, event.value); +cond_resched (); } out:
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 3/4 Input: uinput - add a schedule point in uinput_inject_events()
In reply to Sasha LevinFrom: Dmitry Torokhov <[email protected]>
[ Upstream commit cecf10704899467a787975e3d94a1f0129b9688e ]
Large writes to uinput interface may cause rcu stalls. Let's add cond_resched() to the loop to avoid this.
--- drivers/input/misc/uinput.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/misc/uinput.c +1 -0
@@ -456,6 +456,7 @@ static ssize_t uinput_inject_events(struct uinput_device *udev,input_event (udev->dev, ev.type, ev.code, ev.value); bytes +=input_event_size (); +cond_resched (); }return bytes;
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 4/4 fs/fat/fatent.c: add cond_resched() to fat_count_free_clusters()
In reply to Sasha LevinFrom: Khazhismel Kumykov <[email protected]>
[ Upstream commit ac081c3be3fae6d0cc3e1862507fca3862d30b67 ]
On non-preempt kernels this loop can take a long time (more than 50 ticks) processing through entries.
--- fs/fat/fatent.c | 1 + 1 file changed, 1 insertion(+)
fs/fat/fatent.c +1 -0
@@ -684,6 +684,7 @@ int fat_count_free_clusters(struct super_block *sb)if (ops->ent_get (&fatent) ==FAT_ENT_FREE ) free++; }while (fat_ent_next (sbi, &fatent)); +cond_resched (); } sbi->free_clusters = free; sbi->free_clus_valid =1 ;
Signature · 1 line
2.17.1