Linux 3.3-rc1-git6 (upstream 6bc2b95ee602659c1be6fac0f6aadeb0c5c29a5d)
- Add patch from Kay Sievers for udlfb device removal - utrace patch to allow calling internal functions from atomic context from Oleg Nesterov
This commit is contained in:
parent
d47884a9de
commit
cf9048c9c4
12
kernel.spec
12
kernel.spec
@ -87,7 +87,7 @@ Summary: The Linux kernel
|
|||||||
# The rc snapshot level
|
# The rc snapshot level
|
||||||
%define rcrev 1
|
%define rcrev 1
|
||||||
# The git snapshot level
|
# The git snapshot level
|
||||||
%define gitrev 5
|
%define gitrev 6
|
||||||
# Set rpm version accordingly
|
# Set rpm version accordingly
|
||||||
%define rpmversion 3.%{upstream_sublevel}.0
|
%define rpmversion 3.%{upstream_sublevel}.0
|
||||||
%endif
|
%endif
|
||||||
@ -741,6 +741,8 @@ Patch21087: fs-Inval-cache-for-parent-block-device-if-fsync-called-on-part.patch
|
|||||||
|
|
||||||
Patch21091: kmemleak.patch
|
Patch21091: kmemleak.patch
|
||||||
|
|
||||||
|
Patch21092: udlfb-remove-sysfs-framebuffer-device-with-USB-disconnect.patch
|
||||||
|
|
||||||
# compat-wireless patches
|
# compat-wireless patches
|
||||||
Patch50000: compat-wireless-config-fixups.patch
|
Patch50000: compat-wireless-config-fixups.patch
|
||||||
Patch50001: compat-wireless-pr_fmt-warning-avoidance.patch
|
Patch50001: compat-wireless-pr_fmt-warning-avoidance.patch
|
||||||
@ -1432,6 +1434,8 @@ ApplyPatch KVM-x86-fix-missing-checks-in-syscall-emulation.patch
|
|||||||
|
|
||||||
ApplyPatch kmemleak.patch
|
ApplyPatch kmemleak.patch
|
||||||
|
|
||||||
|
ApplyPatch udlfb-remove-sysfs-framebuffer-device-with-USB-disconnect.patch
|
||||||
|
|
||||||
#rhbz 783211
|
#rhbz 783211
|
||||||
ApplyPatch fs-Inval-cache-for-parent-block-device-if-fsync-called-on-part.patch
|
ApplyPatch fs-Inval-cache-for-parent-block-device-if-fsync-called-on-part.patch
|
||||||
|
|
||||||
@ -2281,6 +2285,12 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jan 30 2012 Josh Boyer <jwboyer@redhat.com> - 3.3.0-0.rc1.git6.1
|
||||||
|
- Linux 3.3-rc1-git6 (upstream 6bc2b95ee602659c1be6fac0f6aadeb0c5c29a5d)
|
||||||
|
- Add patch from Kay Sievers for udlfb device removal
|
||||||
|
- utrace patch to allow calling internal functions from atomic context from
|
||||||
|
Oleg Nesterov
|
||||||
|
|
||||||
* Mon Jan 30 2012 John W. Linville <linville@redhat.com>
|
* Mon Jan 30 2012 John W. Linville <linville@redhat.com>
|
||||||
- ath9k: use WARN_ON_ONCE in ath_rc_get_highest_rix
|
- ath9k: use WARN_ON_ONCE in ath_rc_get_highest_rix
|
||||||
|
|
||||||
|
118
udlfb-remove-sysfs-framebuffer-device-with-USB-disconnect.patch
Normal file
118
udlfb-remove-sysfs-framebuffer-device-with-USB-disconnect.patch
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
From 92a9c19a89af2ca219fbb040a0059f414a4b7223 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kay Sievers <kay.sievers@vrfy.org>
|
||||||
|
Date: Sat, 28 Jan 2012 19:57:46 +0000
|
||||||
|
Subject: [PATCH] udlfb: remove sysfs framebuffer device with USB
|
||||||
|
.disconnect()
|
||||||
|
|
||||||
|
The USB graphics card driver delays the unregistering of the framebuffer
|
||||||
|
device to a workqueue, which breaks the userspace visible remove uevent
|
||||||
|
sequence. Recent userspace tools started to support USB graphics card
|
||||||
|
hotplug out-of-the-box and rely on proper events sent by the kernel.
|
||||||
|
|
||||||
|
The framebuffer device is a direct child of the USB interface which is
|
||||||
|
removed immediately after the USB .disconnect() callback. But the fb device
|
||||||
|
in /sys stays around until its final cleanup, at a time where all the parent
|
||||||
|
devices have been removed already.
|
||||||
|
|
||||||
|
To work around that, we remove the sysfs fb device directly in the USB
|
||||||
|
.disconnect() callback and leave only the cleanup of the internal fb
|
||||||
|
data to the delayed work.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
|
||||||
|
add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
|
||||||
|
add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/graphics/fb0 (graphics)
|
||||||
|
remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
|
||||||
|
remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
|
||||||
|
remove /2-1.2:1.0/graphics/fb0 (graphics)
|
||||||
|
|
||||||
|
After:
|
||||||
|
add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
|
||||||
|
add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
|
||||||
|
add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/graphics/fb1 (graphics)
|
||||||
|
remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/graphics/fb1 (graphics)
|
||||||
|
remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
|
||||||
|
remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
|
||||||
|
|
||||||
|
Cc: stable@vger.kernel.org
|
||||||
|
Tested-by: Bernie Thompson <bernie@plugable.com>
|
||||||
|
Acked-by: Bernie Thompson <bernie@plugable.com>
|
||||||
|
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
|
||||||
|
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
|
||||||
|
---
|
||||||
|
drivers/video/fbmem.c | 18 +++++++++++++++++-
|
||||||
|
drivers/video/udlfb.c | 2 +-
|
||||||
|
include/linux/fb.h | 1 +
|
||||||
|
3 files changed, 19 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
|
||||||
|
index ac9141b..c6ce416 100644
|
||||||
|
--- a/drivers/video/fbmem.c
|
||||||
|
+++ b/drivers/video/fbmem.c
|
||||||
|
@@ -1665,6 +1665,7 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
|
||||||
|
if (ret)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
+ unlink_framebuffer(fb_info);
|
||||||
|
if (fb_info->pixmap.addr &&
|
||||||
|
(fb_info->pixmap.flags & FB_PIXMAP_DEFAULT))
|
||||||
|
kfree(fb_info->pixmap.addr);
|
||||||
|
@@ -1672,7 +1673,6 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
|
||||||
|
registered_fb[i] = NULL;
|
||||||
|
num_registered_fb--;
|
||||||
|
fb_cleanup_device(fb_info);
|
||||||
|
- device_destroy(fb_class, MKDEV(FB_MAJOR, i));
|
||||||
|
event.info = fb_info;
|
||||||
|
fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event);
|
||||||
|
|
||||||
|
@@ -1681,6 +1681,22 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int unlink_framebuffer(struct fb_info *fb_info)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ i = fb_info->node;
|
||||||
|
+ if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ if (fb_info->dev) {
|
||||||
|
+ device_destroy(fb_class, MKDEV(FB_MAJOR, i));
|
||||||
|
+ fb_info->dev = NULL;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(unlink_framebuffer);
|
||||||
|
+
|
||||||
|
void remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||||
|
const char *name, bool primary)
|
||||||
|
{
|
||||||
|
diff --git a/drivers/video/udlfb.c b/drivers/video/udlfb.c
|
||||||
|
index a197731..a40c05e 100644
|
||||||
|
--- a/drivers/video/udlfb.c
|
||||||
|
+++ b/drivers/video/udlfb.c
|
||||||
|
@@ -1739,7 +1739,7 @@ static void dlfb_usb_disconnect(struct usb_interface *interface)
|
||||||
|
for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++)
|
||||||
|
device_remove_file(info->dev, &fb_device_attrs[i]);
|
||||||
|
device_remove_bin_file(info->dev, &edid_attr);
|
||||||
|
-
|
||||||
|
+ unlink_framebuffer(info);
|
||||||
|
usb_set_intfdata(interface, NULL);
|
||||||
|
|
||||||
|
/* if clients still have us open, will be freed on last close */
|
||||||
|
diff --git a/include/linux/fb.h b/include/linux/fb.h
|
||||||
|
index c18122f..a395b8c 100644
|
||||||
|
--- a/include/linux/fb.h
|
||||||
|
+++ b/include/linux/fb.h
|
||||||
|
@@ -1003,6 +1003,7 @@ extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf,
|
||||||
|
/* drivers/video/fbmem.c */
|
||||||
|
extern int register_framebuffer(struct fb_info *fb_info);
|
||||||
|
extern int unregister_framebuffer(struct fb_info *fb_info);
|
||||||
|
+extern int unlink_framebuffer(struct fb_info *fb_info);
|
||||||
|
extern void remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||||
|
const char *name, bool primary);
|
||||||
|
extern int fb_prepare_logo(struct fb_info *fb_info, int rotate);
|
||||||
|
--
|
||||||
|
1.7.6.5
|
||||||
|
|
70
utrace.patch
70
utrace.patch
@ -4683,3 +4683,73 @@ index 0000000..c817a46
|
|||||||
+ seq_printf(m, "Utrace:\t%lx\n", p->utrace_flags);
|
+ seq_printf(m, "Utrace:\t%lx\n", p->utrace_flags);
|
||||||
+}
|
+}
|
||||||
|
|
||||||
|
Add the new UTRACE_ATTACH_ATOMIC flag for utrace_attach_task().
|
||||||
|
If it is set, UTRACE_ATTACH_CREATE uses GFP_ATOMIC for memory
|
||||||
|
allocations and thus it can be used in atomic context.
|
||||||
|
|
||||||
|
Suggested-by: Mark Wielaard <mjw@redhat.com>
|
||||||
|
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||||
|
---
|
||||||
|
include/linux/utrace.h | 1 +
|
||||||
|
kernel/utrace.c | 12 ++++++++----
|
||||||
|
2 files changed, 9 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/linux/utrace.h b/include/linux/utrace.h
|
||||||
|
index f37373b..46959af 100644
|
||||||
|
--- a/include/linux/utrace.h
|
||||||
|
+++ b/include/linux/utrace.h
|
||||||
|
@@ -317,6 +317,7 @@ static inline enum utrace_syscall_action utrace_syscall_action(u32 action)
|
||||||
|
#define UTRACE_ATTACH_MATCH_MASK 0x000f
|
||||||
|
#define UTRACE_ATTACH_CREATE 0x0010 /* Attach a new engine. */
|
||||||
|
#define UTRACE_ATTACH_EXCLUSIVE 0x0020 /* Refuse if existing match. */
|
||||||
|
+#define UTRACE_ATTACH_ATOMIC 0x0040 /* For _CREATE, don't sleep */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct utrace_engine - per-engine structure
|
||||||
|
diff --git a/kernel/utrace.c b/kernel/utrace.c
|
||||||
|
index c817a46..a169e1b 100644
|
||||||
|
--- a/kernel/utrace.c
|
||||||
|
+++ b/kernel/utrace.c
|
||||||
|
@@ -113,9 +113,9 @@ void task_utrace_unlock(struct task_struct *task)
|
||||||
|
*
|
||||||
|
* This returns false only in case of a memory allocation failure.
|
||||||
|
*/
|
||||||
|
-static bool utrace_task_alloc(struct task_struct *task)
|
||||||
|
+static bool utrace_task_alloc(struct task_struct *task, gfp_t gfp_flags)
|
||||||
|
{
|
||||||
|
- struct utrace *utrace = kmem_cache_zalloc(utrace_cachep, GFP_KERNEL);
|
||||||
|
+ struct utrace *utrace = kmem_cache_zalloc(utrace_cachep, gfp_flags);
|
||||||
|
if (unlikely(!utrace))
|
||||||
|
return false;
|
||||||
|
spin_lock_init(&utrace->lock);
|
||||||
|
@@ -295,6 +295,7 @@ struct utrace_engine *utrace_attach_task(
|
||||||
|
{
|
||||||
|
struct utrace *utrace = task_utrace_struct(target);
|
||||||
|
struct utrace_engine *engine;
|
||||||
|
+ gfp_t gfp_flags;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!(flags & UTRACE_ATTACH_CREATE)) {
|
||||||
|
@@ -317,13 +318,16 @@ struct utrace_engine *utrace_attach_task(
|
||||||
|
*/
|
||||||
|
return ERR_PTR(-EPERM);
|
||||||
|
|
||||||
|
+ gfp_flags = (flags & UTRACE_ATTACH_ATOMIC)
|
||||||
|
+ ? GFP_ATOMIC : GFP_KERNEL;
|
||||||
|
+
|
||||||
|
if (!utrace) {
|
||||||
|
- if (unlikely(!utrace_task_alloc(target)))
|
||||||
|
+ if (unlikely(!utrace_task_alloc(target, gfp_flags)))
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
utrace = task_utrace_struct(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
- engine = kmem_cache_alloc(utrace_engine_cachep, GFP_KERNEL);
|
||||||
|
+ engine = kmem_cache_alloc(utrace_engine_cachep, gfp_flags);
|
||||||
|
if (unlikely(!engine))
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
--
|
||||||
|
1.5.5.1
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user