forked from rpms/kernel
		
	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