linux/drivers/char
David Howells 65f27f3844 WorkStruct: Pass the work_struct pointer instead of context data
Pass the work_struct pointer to the work function rather than context data.
The work function can use container_of() to work out the data.

For the cases where the container of the work_struct may go away the moment the
pending bit is cleared, it is made possible to defer the release of the
structure by deferring the clearing of the pending bit.

To make this work, an extra flag is introduced into the management side of the
work_struct.  This governs auto-release of the structure upon execution.

Ordinarily, the work queue executor would release the work_struct for further
scheduling or deallocation by clearing the pending bit prior to jumping to the
work function.  This means that, unless the driver makes some guarantee itself
that the work_struct won't go away, the work function may not access anything
else in the work_struct or its container lest they be deallocated..  This is a
problem if the auxiliary data is taken away (as done by the last patch).

However, if the pending bit is *not* cleared before jumping to the work
function, then the work function *may* access the work_struct and its container
with no problems.  But then the work function must itself release the
work_struct by calling work_release().

In most cases, automatic release is fine, so this is the default.  Special
initiators exist for the non-auto-release case (ending in _NAR).


Signed-Off-By: David Howells <dhowells@redhat.com>
2006-11-22 14:55:48 +00:00
..
agp Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart 2006-10-21 13:39:44 -07:00
drm drm: ioremap balanced with iounmap for drivers/char/drm 2006-10-25 09:55:34 -07:00
ftape [PATCH] ftape: fix printk format warnings 2006-11-20 09:42:05 -08:00
hw_random Remove all inclusions of <linux/config.h> 2006-10-04 03:38:54 -04:00
ip2 [PATCH] i2Output always takes kernel data now 2006-10-11 11:17:07 -07:00
ipmi [PATCH] ipmi: use platform_device_add() instead of platform_device_register() to register device allocated dynamically 2006-11-16 11:43:37 -08:00
mwave IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
pcmcia IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
rio [PATCH] Char: correct pci_get_device changes 2006-10-21 13:35:05 -07:00
tpm [PATCH] tpm: fix error handling 2006-10-11 11:14:22 -07:00
watchdog [WATCHDOG] sc1200wdt.c pnp unregister fix. 2006-10-29 22:09:32 +01:00
.gitignore [MIPS] Remove IT8172-based platforms, ITE 8172G and Globespan IVR support. 2006-10-03 17:59:17 +01:00
ChangeLog
Kconfig [PATCH] mspec driver build fix 2006-11-13 07:40:42 -08:00
Makefile [MIPS] Remove IT8172-based platforms, ITE 8172G and Globespan IVR support. 2006-10-03 17:59:17 +01:00
amiserial.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
applicom.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
applicom.h
briq_panel.c Remove all inclusions of <linux/config.h> 2006-10-04 03:38:54 -04:00
cd1865.h
consolemap.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
cp437.uni
cs5535_gpio.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
cyclades.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
decserial.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
defkeymap.c_shipped
defkeymap.map
digi.h
digi1.h
digiFep1.h
digiPCI.h
ds1286.c [PATCH] proper flags type of spin_lock_irqsave() 2006-10-01 00:39:21 -07:00
ds1302.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
ds1620.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
dsp56k.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
dtlk.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
ec3104_keyb.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
efirtc.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
epca.c [PATCH] epca: prevent panic on tty_register_driver() failure 2006-10-17 08:18:48 -07:00
epca.h [PATCH] char: kill unneeded memsets 2006-10-04 07:55:13 -07:00
epcaconfig.h
esp.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
generic_nvram.c [PATCH] powerpc: Kill _machine and hard-coded platform numbers 2006-03-28 23:15:54 +11:00
generic_serial.c [PATCH] char: kill unneeded memsets 2006-10-04 07:55:13 -07:00
genrtc.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
hangcheck-timer.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
hpet.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
hvc_console.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
hvc_console.h [POWERPC] Make the hvc_console output buffer size settable 2006-07-13 18:53:32 +10:00
hvc_iseries.c Merge branch 'master' of git://oak/home/sfr/kernels/iseries/work 2006-10-04 15:02:27 +10:00
hvc_rtas.c [POWERPC] Make the hvc_console output buffer size settable 2006-07-13 18:53:32 +10:00
hvc_vio.c [POWERPC] The two vio HVC backends clash 2006-09-25 13:30:51 +10:00
hvcs.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
hvsi.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
i8k.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
ip27-rtc.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
isicom.c [PATCH] Char: isicom, fix close bug 2006-11-14 16:02:02 -08:00
istallion.c [PATCH] trivial iomem annotations: istallion 2006-10-10 15:37:22 -07:00
keyboard.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
lcd.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
lcd.h
lp.c [PATCH] There is no devfs, there has never been a devfs, we have always been at war with... 2006-09-29 09:18:10 -07:00
mbcs.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
mbcs.h
mem.c Include proper header file for PFN_DOWN() 2006-10-13 08:42:10 -07:00
misc.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
mmtimer.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
moxa.c [PATCH] Char: correct pci_get_device changes 2006-10-21 13:35:05 -07:00
mspec.c [PATCH] mspec driver build fix 2006-11-13 07:40:42 -08:00
mxser.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
mxser.h [PATCH] Typo fixes 2006-03-28 09:16:08 -08:00
n_hdlc.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
n_r3964.c [PATCH] R3964: fix GFP_KERNEL allocations in timer function 2006-06-25 10:01:17 -07:00
n_tty.c [PATCH] remove TTY_DONT_FLIP 2006-06-28 14:59:05 -07:00
nsc_gpio.c Remove all inclusions of <linux/config.h> 2006-10-04 03:38:54 -04:00
nvram.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
nwbutton.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
nwbutton.h IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
nwflash.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
pc8736x_gpio.c [PATCH] drivers/char/pc8736x_gpio.c: remove unused static functions 2006-09-29 09:18:05 -07:00
ppdev.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
pty.c [PATCH] const struct tty_operations 2006-10-02 07:57:14 -07:00
random.c WorkStruct: Pass the work_struct pointer instead of context data 2006-11-22 14:55:48 +00:00
raw.c [PATCH] Streamline generic_file_* interfaces and filemap cleanups 2006-10-01 00:39:28 -07:00
riscom8.c Various drivers' irq handlers: kill dead code, needless casts 2006-10-06 15:00:58 -04:00
riscom8.h
riscom8_reg.h
rocket.c [PATCH] const struct tty_operations 2006-10-02 07:57:14 -07:00
rocket.h
rocket_int.h
rtc.c [RTC] Consistently use of tabs for formatting. 2006-10-09 23:20:47 +01:00
scan_keyb.c
scan_keyb.h
scc.h [PATCH] m68k: static vs. extern in scc.h 2006-01-12 09:09:00 -08:00
scx200_gpio.c [PATCH] scx200_gpio export cleanups 2006-09-29 09:18:06 -07:00
selection.c [PATCH] tty locking on resize 2006-09-29 09:18:12 -07:00
ser_a2232.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
ser_a2232.h
ser_a2232fw.ax
ser_a2232fw.h
serial167.c [PATCH] serial167 __user annotations, NULL noise removal 2006-10-15 11:00:58 -07:00
snsc.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
snsc.h [IA64-SGI] Handle SC env. powerdown events 2006-01-26 13:32:26 -08:00
snsc_event.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
sonypi.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
specialix.c [PATCH] drivers/char/specialix.c: fix the baud conversion 2006-10-17 08:18:44 -07:00
specialix_io8.h
stallion.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
sx.c [PATCH] sx: fix user-visible typo (devic) 2006-10-17 08:18:45 -07:00
sx.h
sxboards.h
sxwindow.h
synclink.c [PATCH] synclink: remove PAGE_SIZE reference 2006-10-17 08:18:42 -07:00
synclink_gt.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
synclinkmp.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
sysrq.c WorkStruct: Pass the work_struct pointer instead of context data 2006-11-22 14:55:48 +00:00
tb0219.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
tipar.c [PATCH] pr_debug: tipar: repair nonexistant pr_debug argument use 2006-10-03 08:04:19 -07:00
tlclk.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
toshiba.c [PATCH] make more file_operation structs static 2006-07-03 15:26:59 -07:00
tty_io.c WorkStruct: Pass the work_struct pointer instead of context data 2006-11-22 14:55:48 +00:00
tty_ioctl.c [PATCH] Fix locking for tty drivers when doing urgent characters 2006-09-29 09:18:24 -07:00
vc_screen.c [PATCH] There is no devfs, there has never been a devfs, we have always been at war with... 2006-09-29 09:18:10 -07:00
viocons.c [POWERPC] Fix viocons for irq breakage 2006-10-07 10:10:27 +10:00
viotape.c [POWERPC] iseries: Small viotape cleanup allowed by devfs removal 2006-07-13 18:56:00 +10:00
vme_scc.c [PATCH] m68k pt_regs fixes 2006-10-07 10:51:14 -07:00
vr41xx_giu.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
vt.c WorkStruct: Pass the work_struct pointer instead of context data 2006-11-22 14:55:48 +00:00
vt_ioctl.c [PATCH] vt: Make vt_pid a struct pid (making it pid wrap around safe). 2006-10-02 07:57:14 -07:00