2.6.32.29-longterm review
Subsystems (47)
cover 2.6.32.29-longterm review
This is the start of the longterm review cycle for the 2.6.32.29 release. There are 115 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Friday, Feb 18, 2011 00:00:00 UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/longterm-review/patch-2.6.32.29-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
Documentation/kernel-parameters.txt | 5 + Makefile | 2 +- arch/ia64/include/asm/system.h | 4 - arch/parisc/kernel/firmware.c | 13 +- arch/powerpc/include/asm/system.h | 4 - arch/powerpc/kernel/cpu_setup_6xx.S | 40 ++-- arch/powerpc/sysdev/fsl_rio.c | 1 - arch/s390/include/asm/system.h | 1 - arch/s390/include/asm/vdso.h | 2 +- arch/x86/Kconfig | 11 + arch/x86/include/asm/mmu_context.h | 5 +- arch/x86/kernel/cpu/mtrr/main.c | 10 +- arch/x86/kernel/tsc.c | 8 + drivers/ata/pata_mpc52xx.c | 2 +- drivers/char/hvc_iucv.c | 6 +- drivers/char/tpm/tpm.c | 28 ++- drivers/char/tpm/tpm.h | 2 + drivers/char/tpm/tpm_tis.c | 4 +- drivers/gpu/drm/Kconfig | 3 + drivers/gpu/drm/i915/intel_lvds.c | 8 + drivers/gpu/drm/radeon/radeon_atombios.c | 16 +- drivers/gpu/drm/radeon/radeon_display.c | 4 + drivers/hwmon/via686a.c | 14 +- drivers/i2c/i2c-core.c | 14 +- drivers/input/mouse/bcm5974.c | 40 +++ drivers/input/serio/i8042-x86ia64io.h | 21 ++ drivers/input/serio/i8042.c | 6 +- drivers/md/dm-mpath.c | 12 - drivers/md/dm.c | 5 +- drivers/md/md.c | 5 +- drivers/media/radio/radio-aimslab.c | 23 +-- drivers/media/video/em28xx/em28xx-cards.c | 4 +- drivers/net/wireless/ath/ath9k/ath9k.h | 4 +- drivers/net/wireless/hostap/hostap_cs.c | 10 +- drivers/net/wireless/iwlwifi/iwl-agn.c | 15 +- drivers/net/wireless/iwlwifi/iwl-helpers.h | 6 + drivers/net/wireless/p54/txrx.c | 2 +- drivers/net/wireless/rt2x00/rt73usb.c | 1 + drivers/pci/pci-stub.c | 3 + drivers/power/ds2760_battery.c | 2 +- drivers/rtc/rtc-cmos.c | 16 +- drivers/scsi/libsas/sas_scsi_host.c | 1 + drivers/scsi/mpt2sas/mpt2sas_base.c | 19 +- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 3 - drivers/scsi/sd.c | 9 +- drivers/serial/8250.c | 3 +- drivers/staging/comedi/drivers/jr3_pci.c | 7 + drivers/staging/comedi/drivers/ni_labpc.c | 3 +- drivers/staging/hv/blkvsc_drv.c | 1 + drivers/staging/hv/netvsc_drv.c | 1 + drivers/staging/usbip/vhci_hcd.c | 14 - drivers/usb/class/cdc-acm.c | 1 + drivers/usb/core/hub.c | 26 ++ drivers/usb/gadget/printer.c | 14 +- drivers/usb/host/ehci-hcd.c | 27 ++- drivers/usb/host/ehci-pci.c | 39 +++ drivers/usb/host/ehci-sched.c | 79 ++++++ drivers/usb/host/ehci.h | 1 + drivers/usb/serial/ch341.c | 10 + drivers/usb/serial/cp210x.c | 16 +- drivers/usb/serial/digi_acceleport.c | 10 - drivers/usb/serial/ftdi_sio.c | 39 +++- drivers/usb/serial/ftdi_sio_ids.h | 32 ++- drivers/usb/serial/generic.c | 20 ++ drivers/usb/serial/io_edgeport.c | 4 +- drivers/usb/serial/keyspan_pda.c | 17 -- drivers/usb/serial/option.c | 23 ++- drivers/usb/serial/pl2303.c | 13 + drivers/usb/serial/pl2303.h | 2 + drivers/usb/serial/spcp8x5.c | 6 +- drivers/usb/serial/ti_usb_3410_5052.c | 2 +- drivers/usb/storage/unusual_cypress.h | 5 + drivers/usb/storage/unusual_devs.h | 32 +++ drivers/virtio/virtio_pci.c | 20 +-- fs/nfs/direct.c | 34 ++- include/drm/drm_pciids.h | 1 - include/linux/hardirq.h | 9 +- include/linux/ieee80211.h | 2 +- include/linux/klist.h | 2 +- include/linux/sched.h | 39 ++-- include/linux/usb/serial.h | 3 + init/Kconfig | 80 ++---- init/calibrate.c | 6 +- kernel/capability.c | 1 - kernel/cred-internals.h | 21 -- kernel/cred.c | 3 - kernel/exit.c | 1 - kernel/ksysfs.c | 8 - kernel/ptrace.c | 2 +- kernel/sched.c | 392 +++++++++++++++++---------- kernel/sched_debug.c | 5 - kernel/sched_fair.c | 56 +++- kernel/sched_features.h | 5 + kernel/sched_rt.c | 34 ++- kernel/smp.c | 30 +++ kernel/softirq.c | 64 +++-- kernel/sys.c | 5 - kernel/user.c | 318 +---------------------- net/sched/cls_cgroup.c | 2 +- security/selinux/hooks.c | 5 +- security/selinux/nlmsgtab.c | 2 + sound/core/hrtimer.c | 5 +- sound/pci/au88x0/au88x0_pcm.c | 24 ++- sound/pci/hda/hda_eld.c | 2 +- sound/pci/hda/patch_conexant.c | 8 +- sound/soc/blackfin/bf5xx-ac97.c | 4 +- sound/soc/codecs/wm8990.c | 10 +- sound/usb/usx2y/us122l.c | 41 ++-- 108 files changed, 1189 insertions(+), 916 deletions(-)
PATCH 1/115 staging: usbip: remove double giveback of URB
2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: =?UTF-8?q?M=C3=A1rton=20N=C3=A9meth?= <[email protected]>
commit 7571f089d7522a95c103558faf313c7af8856ceb upstream.
In the vhci_urb_dequeue() function the TCP connection is checked twice. Each time when the TCP connection is closed the URB is unlinked and given back. Remove the second attempt of unlinking and giving back of the URB completely.
This patch fixes the bug described at https://bugzilla.kernel.org/show_bug.cgi?id=24872 .
--- drivers/staging/usbip/vhci_hcd.c | 14 -------------- 1 file changed, 14 deletions(-)
drivers/staging/usbip/vhci_hcd.c +0 -14
@@ -798,20 +798,6 @@ static int vhci_urb_dequeue(struct usb_hspin_unlock_irqrestore (&vdev->priv_lock, flags2); } - -if (!vdev->ud.tcp_socket) { -/* tcp connection is closed */ -usbip_uinfo ("vhci_hcd: vhci_urb_dequeue() gives back urb %p\n" , - urb); - -usb_hcd_unlink_urb_from_ep (hcd, urb); - -spin_unlock_irqrestore (&the_controller->lock, flags); -usb_hcd_giveback_urb (vhci_to_hcd (the_controller), urb, - urb->status); -spin_lock_irqsave (&the_controller->lock, flags); - } -spin_unlock_irqrestore (&the_controller->lock, flags);usbip_dbg_vhci_hc ("leave\n" );
PATCH 2/115 USB: EHCI: ASPM quirk of ISOC on AMD SB800
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alex He <[email protected]>
commit 05570297ecbe834b1756b522412b68eaffb9ab11 upstream.
When ASPM PM Feature is enabled on UMI link, devices that use ISOC stream of data transfer may be exposed to longer latency causing less than optimal per- formance of the device. The longer latencies are normal and are due to link wake time coming out of low power state which happens frequently to save power when the link is not active.
The following code will make exception for certain features of ASPM to be by passed and keep the logic normal state only when the ISOC device is connected and active. This change will allow the device to run at optimal performance yet minimize the impact on overall power savings.
--- drivers/usb/host/ehci-hcd.c | 8 ++++ drivers/usb/host/ehci-pci.c | 32 +++++++++++++++++ drivers/usb/host/ehci-sched.c | 79 ++++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/ehci.h | 1 4 files changed, 120 insertions(+)
drivers/usb/host/ehci-hcd.c +8 -0
@@ -103,6 +103,9 @@ MODULE_PARM_DESC (ignore_oc, "ignore bog#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) +/* for ASPM quirk of ISOC on AMD SB800 */ +static struct pci_dev *amd_nb_dev; +/*-------------------------------------------------------------------------*/ #include "ehci.h"
@@ -502,6 +505,11 @@ static void ehci_stop (struct usb_hcd *hspin_unlock_irq (&ehci->lock);ehci_mem_cleanup (ehci); +if (amd_nb_dev) { +pci_dev_put (amd_nb_dev); + amd_nb_dev =NULL ; + } +#ifdef EHCI_STATS ehci_dbg (ehci, "irq normal %ld err %ld reclaim %ld (lost %ld)\n", ehci->stats.normal, ehci->stats.error, ehci->stats.reclaim,
drivers/usb/host/ehci-pci.c +32 -0
@@ -41,6 +41,35 @@ static int ehci_pci_reinit(struct ehci_hreturn 0 ; } +static int ehci_quirk_amd_SB800 (struct ehci_hcd *ehci) +{ +struct pci_dev *amd_smbus_dev; +u8 rev =0 ; + + amd_smbus_dev =pci_get_device (PCI_VENDOR_ID_ATI ,0x4385 ,NULL ); +if (!amd_smbus_dev) +return 0 ; + +pci_read_config_byte (amd_smbus_dev,PCI_REVISION_ID , &rev); +if (rev <0x40 ) { +pci_dev_put (amd_smbus_dev); + amd_smbus_dev =NULL ; +return 0 ; + } + +if (!amd_nb_dev) + amd_nb_dev =pci_get_device (PCI_VENDOR_ID_AMD ,0x1510 ,NULL ); +if (!amd_nb_dev) +ehci_err (ehci,"QUIRK: unable to get AMD NB device\n" ); + +ehci_info (ehci,"QUIRK: Enable AMD SB800 L1 fix\n" ); + +pci_dev_put (amd_smbus_dev); + amd_smbus_dev =NULL ; + +return 1 ; +} +/* called during probe() after chip reset completes */ static int ehci_pci_setup (struct usb_hcd *hcd) {
@@ -99,6 +128,9 @@ static int ehci_pci_setup(struct usb_hcd/* cache this readonly data; minimize chip reads */ ehci->hcs_params =ehci_readl (ehci, &ehci->caps->hcs_params); +if (ehci_quirk_amd_SB800 (ehci)) + ehci->amd_l1_fix =1 ; + retval =ehci_halt (ehci);if (retval)return retval;
drivers/usb/host/ehci-sched.c +79 -0
109 lines not on this page · raw message
drivers/usb/host/ehci.h +1 -0
@@ -130,6 +130,7 @@ struct ehci_hcd { /* one per controlle unsigned has_amcc_usb23:1; unsigned need_io_watchdog:1; unsigned broken_periodic:1; + unsigned amd_l1_fix:1;/* required for usb32 quirk */ #define OHCI_CTRL_HCFS (3 << 6)
PATCH 3/115 rt2x00: add device id for windy31 usb device
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Greg Kroah-Hartman <[email protected]>
commit 9c4cf6d94fb362c27a24df5223ed6e327eb7279a upstream.
This patch adds the device id for the windy31 USB device to the rt73usb driver.
Thanks to Ralf Flaxa for reporting this and providing testing and a sample device.
drivers/net/wireless/rt2x00/rt73usb.c +1 -0
@@ -2446,6 +2446,7 @@ static struct usb_device_id rt73usb_device_table[] = { { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) }, + { USB_DEVICE(0x0812, 0x3101), USB_DEVICE_DATA(&rt73usb_ops) },/* Qcom */ { USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) },
PATCH 4/115 ALSA: snd-usb-us122l: Fix missing NULL checks
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Karsten Wiese <[email protected]>
commit cdce2db74e156fbd9a2dc3c7b246166f8b70955b upstream.
Fix missing NULL checks in usb_stream_hwdep_poll() and usb_stream_hwdep_ioctl(). Wake up poll waiters before returning from usb_stream_hwdep_ioctl().
sound/usb/usx2y/us122l.c +20 -21
@@ -273,29 +273,26 @@ static unsigned int usb_stream_hwdep_poll(struct snd_hwdep *hw, struct file *file, poll_table *wait) { struct us122l *us122l = hw->private_data; -struct usb_stream *s = us122l->sk.s;unsigned *polled;unsigned int mask;poll_wait (file, &us122l->sk.sleep, wait); -switch (s->state) { -case usb_stream_ready: -if (us122l->first == file) - polled = &s->periods_polled; -else - polled = &us122l->second_periods_polled; -if (*polled != s->periods_done) { - *polled = s->periods_done; - mask =POLLIN |POLLOUT |POLLWRNORM ; -break ; + mask =POLLIN |POLLOUT |POLLWRNORM |POLLERR ; +if (mutex_trylock (&us122l->mutex)) { +struct usb_stream *s = us122l->sk.s; +if (s && s->state == usb_stream_ready) { +if (us122l->first == file) + polled = &s->periods_polled; +else + polled = &us122l->second_periods_polled; +if (*polled != s->periods_done) { + *polled = s->periods_done; + mask =POLLIN |POLLOUT |POLLWRNORM ; + }else + mask =0 ; } -/* Fall through */ - mask =0 ; -break ; -default : - mask =POLLIN |POLLOUT |POLLWRNORM |POLLERR ; -break ; +mutex_unlock (&us122l->mutex); }return mask; }
@@ -381,6 +378,7 @@ static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, {struct usb_stream_config *cfg;struct us122l *us122l = hw->private_data; +struct usb_stream *s;unsigned min_period_frames;int err =0 ;bool high_speed;
@@ -426,18 +424,18 @@ static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,snd_power_wait (hw->card,SNDRV_CTL_POWER_D0 );mutex_lock (&us122l->mutex); + s = us122l->sk.s;if (!us122l->master) us122l->master = file;else if (us122l->master != file) { -if (memcmp (cfg, &us122l->sk.s->cfg,sizeof (*cfg))) { +if (!s ||memcmp (cfg, &s->cfg,sizeof (*cfg))) { err = -EIO ; goto unlock; } us122l->slave = file; } -if (!us122l->sk.s || -memcmp (cfg, &us122l->sk.s->cfg,sizeof (*cfg)) || - us122l->sk.s->state == usb_stream_xrun) { +if (!s ||memcmp (cfg, &s->cfg,sizeof (*cfg)) || + s->state == usb_stream_xrun) {us122l_stop (us122l);if (!us122l_start (us122l, cfg->sample_rate, cfg->period_frames)) err = -EIO ;
@@ -448,6 +446,7 @@ unlock:mutex_unlock (&us122l->mutex); free:kfree (cfg); +wake_up_all (&us122l->sk.sleep);return err; }
PATCH 5/115 hwmon: (via686a) Initialize fan_div values
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Jean Delvare <[email protected]>
commit f790674d3f87df6390828ac21a7d1530f71b59c8 upstream.
Functions set_fan_min() and set_fan_div() assume that the fan_div values have already been read from the register. The driver currently doesn't initialize them at load time, they are only set when function via686a_update_device() is called. This means that set_fan_min() and set_fan_div() misbehave if, for example, "sensors -s" is called before any monitoring application (e.g. "sensors") is has been run.
Fix the problem by always initializing the fan_div values at device bind time.
--- drivers/hwmon/via686a.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/hwmon/via686a.c +11 -3
@@ -687,6 +687,13 @@ static int __devexit via686a_remove(strureturn 0 ; } +static void via686a_update_fan_div (struct via686a_data *data) +{ +int reg =via686a_read_value (data,VIA686A_REG_FANDIV ); + data->fan_div[0 ] = (reg >>4 ) &0x03 ; + data->fan_div[1 ] = reg >>6 ; +} +static void __devinit via686a_init_device (struct via686a_data *data) {u8 reg;
@@ -700,6 +707,9 @@ static void __devinit via686a_init_devicvia686a_write_value (data,VIA686A_REG_TEMP_MODE , (reg & ~VIA686A_TEMP_MODE_MASK ) |VIA686A_TEMP_MODE_CONTINUOUS ); + +/* Pre-read fan clock divisor values */ +via686a_update_fan_div (data); }static struct via686a_data *via686a_update_device (struct device *dev)
@@ -751,9 +761,7 @@ static struct via686a_data *via686a_upda (via686a_read_value (data,VIA686A_REG_TEMP_LOW23 ) &0xc0 ) >>6 ; - i =via686a_read_value (data,VIA686A_REG_FANDIV ); - data->fan_div[0 ] = (i >>4 ) &0x03 ; - data->fan_div[1 ] = i >>6 ; +via686a_update_fan_div (data); data->alarms =via686a_read_value (data, VIA686A_REG_ALARM1) |
PATCH 6/115 USB: serial: handle Data Carrier Detect changes
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Libor Pechacek <[email protected]>
commit d14fc1a74e846d7851f24fc9519fe87dc12a1231 upstream.
Alan's commit 335f8514f200e63d689113d29cb7253a5c282967 introduced .carrier_raised function in several drivers. That also means tty_port_block_til_ready can now suspend the process trying to open the serial port when Carrier Detect is low and put it into tty_port.open_wait queue. We need to wake up the process when Carrier Detect goes high and trigger TTY hangup when CD goes low.
Some of the devices do not report modem status line changes, or at least we don't understand the status message, so for those we remove .carrier_raised again.
--- drivers/usb/serial/ch341.c | 10 ++++++++++ drivers/usb/serial/cp210x.c | 13 +------------ drivers/usb/serial/digi_acceleport.c | 10 ---------- drivers/usb/serial/generic.c | 20 ++++++++++++++++++++ drivers/usb/serial/keyspan_pda.c | 17 ----------------- drivers/usb/serial/pl2303.c | 11 +++++++++++ drivers/usb/serial/spcp8x5.c | 6 +++++- include/linux/usb/serial.h | 3 +++ 8 files changed, 50 insertions(+), 40 deletions(-)
drivers/usb/serial/ch341.c +10 -0
@@ -479,12 +479,22 @@ static void ch341_read_int_callback(struif (actual_length >=4 ) {struct ch341_private *priv =usb_get_serial_port_data (port);unsigned long flags; +u8 prev_line_status = priv->line_status;spin_lock_irqsave (&priv->lock, flags); priv->line_status = (~(data[2 ])) &CH341_BITS_MODEM_STAT ;if ((data[1 ] &CH341_MULT_STAT )) priv->multi_status_change =1 ;spin_unlock_irqrestore (&priv->lock, flags); + +if ((priv->line_status ^ prev_line_status) &CH341_BIT_DCD ) { +struct tty_struct *tty =tty_port_tty_get (&port->port); +if (tty) +usb_serial_handle_dcd_change (port, tty, + priv->line_status &CH341_BIT_DCD ); +tty_kref_put (tty); + } +wake_up_interruptible (&priv->delta_msr_wait); }
drivers/usb/serial/cp210x.c +1 -12
@@ -51,7 +51,6 @@ static void cp210x_break_ctl(struct tty_static int cp210x_startup (struct usb_serial *);static void cp210x_disconnect (struct usb_serial *);static void cp210x_dtr_rts (struct usb_serial_port *p,int on); -static int cp210x_carrier_raised (struct usb_serial_port *p);static int debug;
@@ -165,8 +164,7 @@ static struct usb_serial_driver cp210x_d .tiocmset = cp210x_tiocmset, .attach = cp210x_startup, .disconnect = cp210x_disconnect, - .dtr_rts = cp210x_dtr_rts, - .carrier_raised = cp210x_carrier_raised + .dtr_rts = cp210x_dtr_rts };/* Config request types */
@@ -800,15 +798,6 @@ static int cp210x_tiocmget (struct tty_sreturn result; } -static int cp210x_carrier_raised (struct usb_serial_port *p) -{ -unsigned int control; -cp210x_get_config (p,CP210X_GET_MDMSTS , &control,1 ); -if (control &CONTROL_DCD ) -return 1 ; -return 0 ; -} -static void cp210x_break_ctl (struct tty_struct *tty,int break_state) {struct usb_serial_port *port = tty->driver_data;
drivers/usb/serial/digi_acceleport.c +0 -10
@@ -455,7 +455,6 @@ static int digi_write_room(struct tty_ststatic int digi_chars_in_buffer (struct tty_struct *tty);static int digi_open (struct tty_struct *tty,struct usb_serial_port *port);static void digi_close (struct usb_serial_port *port); -static int digi_carrier_raised (struct usb_serial_port *port);static void digi_dtr_rts (struct usb_serial_port *port,int on);static int digi_startup_device (struct usb_serial *serial);static int digi_startup (struct usb_serial *serial);
@@ -511,7 +510,6 @@ static struct usb_serial_driver digi_acc .open = digi_open, .close = digi_close, .dtr_rts = digi_dtr_rts, - .carrier_raised = digi_carrier_raised, .write = digi_write, .write_room = digi_write_room, .write_bulk_callback = digi_write_bulk_callback,
@@ -1338,14 +1336,6 @@ static void digi_dtr_rts(struct usb_seridigi_set_modem_signals (port, on * (TIOCM_DTR |TIOCM_RTS ),1 ); } -static int digi_carrier_raised (struct usb_serial_port *port) -{ -struct digi_port *priv =usb_get_serial_port_data (port); -if (priv->dp_modem_signals &TIOCM_CD ) -return 1 ; -return 0 ; -} -static int digi_open (struct tty_struct *tty,struct usb_serial_port *port) {int ret;
drivers/usb/serial/generic.c +20 -0
@@ -578,6 +578,26 @@ int usb_serial_handle_break(struct usb_s }EXPORT_SYMBOL_GPL (usb_serial_handle_break); +/** +* usb_serial_handle_dcd_change - handle a change of carrier detect state +* @port: usb_serial_port structure for the open port +* @tty: tty_struct structure for the port +* @status: new carrier detect status, nonzero if active +*/ +void usb_serial_handle_dcd_change (struct usb_serial_port *usb_port, +struct tty_struct *tty,unsigned int status) +{ +struct tty_port *port = &usb_port->port; + +dbg ("%s - port %d, status %d" , __func__, usb_port->number, status); + +if (status) +wake_up_interruptible (&port->open_wait); +else if (tty && !C_CLOCAL (tty)) +tty_hangup (tty); +} +EXPORT_SYMBOL_GPL (usb_serial_handle_dcd_change); +int usb_serial_generic_resume (struct usb_serial *serial) {struct usb_serial_port *port;
drivers/usb/serial/keyspan_pda.c +0 -17
@@ -663,22 +663,6 @@ static void keyspan_pda_dtr_rts(struct u } } -static int keyspan_pda_carrier_raised (struct usb_serial_port *port) -{ -struct usb_serial *serial = port->serial; -unsigned char modembits; - -/* If we can read the modem status and the DCD is low then -carrier is not raised yet */ -if (keyspan_pda_get_modem_info (serial, &modembits) >=0 ) { -if (!(modembits & (1 >>6 ))) -return 0 ; - } -/* Carrier raised, or we failed (eg disconnected) so -progress accordingly */ -return 1 ; -} -static int keyspan_pda_open (struct tty_struct *tty,struct usb_serial_port *port)
@@ -854,7 +838,6 @@ static struct usb_serial_driver keyspan_ .id_table = id_table_std, .num_ports = 1, .dtr_rts = keyspan_pda_dtr_rts, - .carrier_raised = keyspan_pda_carrier_raised, .open = keyspan_pda_open, .close = keyspan_pda_close, .write = keyspan_pda_write,
drivers/usb/serial/pl2303.c +11 -0
@@ -955,9 +955,11 @@ static void pl2303_update_line_status(st {struct pl2303_private *priv =usb_get_serial_port_data (port); +struct tty_struct *tty;unsigned long flags;u8 status_idx =UART_STATE ;u8 length =UART_STATE +1 ; +u8 prev_line_status;u16 idv, idp; idv =le16_to_cpu (port->serial->dev->descriptor.idVendor);
@@ -979,11 +981,20 @@ static void pl2303_update_line_status(st/* Save off the uart status for others to look at */ spin_lock_irqsave (&priv->lock, flags); + prev_line_status = priv->line_status; priv->line_status = data[status_idx];spin_unlock_irqrestore (&priv->lock, flags);if (priv->line_status &UART_BREAK_ERROR )usb_serial_handle_break (port);wake_up_interruptible (&priv->delta_msr_wait); + + tty =tty_port_tty_get (&port->port); +if (!tty) +return ; +if ((priv->line_status ^ prev_line_status) &UART_DCD ) +usb_serial_handle_dcd_change (port, tty, + priv->line_status &UART_DCD ); +tty_kref_put (tty); }static void pl2303_read_int_callback (struct urb *urb)
drivers/usb/serial/spcp8x5.c +5 -1
@@ -137,7 +137,7 @@ struct spcp8x5_usb_ctrl_arg {/* how come ??? */ #define UART_STATE 0x08 -#define UART_STATE_TRANSIENT_MASK 0x74 +#define UART_STATE_TRANSIENT_MASK 0x75#define UART_DCD 0x01#define UART_DSR 0x02#define UART_BREAK_ERROR 0x04
@@ -734,6 +734,10 @@ static void spcp8x5_read_bulk_callback(stty_insert_flip_char (tty, data[i], tty_flag);tty_flip_buffer_push (tty); } + +if (status &UART_DCD ) +usb_serial_handle_dcd_change (port, tty, + priv->line_status &MSR_STATUS_LINE_DCD );tty_kref_put (tty);/* Schedule the next read _if_ we are still open */
include/linux/usb/serial.h +3 -0
@@ -326,6 +326,9 @@ extern int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch);extern int usb_serial_handle_break (struct usb_serial_port *port); +extern void usb_serial_handle_dcd_change (struct usb_serial_port *usb_port, +struct tty_struct *tty, +unsigned int status);extern int usb_serial_bus_register (struct usb_serial_driver *device);
PATCH 7/115 USB: CP210x Add two device IDs
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Craig Shelley <[email protected]>
commit faea63f7ccfddfb8fc19798799fcd38c58415172 upstream.
Device Ids added for IRZ Automation Teleport SG-10 GSM/GPRS Modem and DekTec DTA Plus VHF/UHF Booster/Attenuator.
--- drivers/usb/serial/cp210x.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/cp210x.c +2 -0
@@ -110,7 +110,9 @@ static struct usb_device_id id_table [] { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ { USB_DEVICE(0x10C4, 0x8382) }, /* Cygnal Integrated Products, Inc. */ { USB_DEVICE(0x10C4, 0x83A8) }, /* Amber Wireless AMB2560 */ + { USB_DEVICE(0x10C4, 0x83D8) }, /* DekTec DTA Plus VHF/UHF Booster/Attenuator */ { USB_DEVICE(0x10C4, 0x8411) }, /* Kyocera GPS Module */ + { USB_DEVICE(0x10C4, 0x8418) }, /* IRZ Automation Teleport SG-10 GSM/GPRS Modem */ { USB_DEVICE(0x10C4, 0x846E) }, /* BEI USB Sensor Interface (VCP) */ { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
PATCH 8/115 USB: CP210x Removed incorrect device ID
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Craig Shelley <[email protected]>
commit 9926c0df7b31b2128eebe92e0e2b052f380ea464 upstream.
Device ID removed 0x10C4/0x8149 for West Mountain Radio Computerized Battery Analyzer. This device is actually based on a SiLabs C8051Fxxx, see http://www.etheus.net/SiUSBXp_Linux_Driver for further info.
--- drivers/usb/serial/cp210x.c | 1 - 1 file changed, 1 deletion(-)
drivers/usb/serial/cp210x.c +0 -1
@@ -87,7 +87,6 @@ static struct usb_device_id id_table [] { USB_DEVICE(0x10C4, 0x8115) }, /* Arygon NFC/Mifare Reader */ { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */ { USB_DEVICE(0x10C4, 0x813F) }, /* Tams Master Easy Control */ - { USB_DEVICE(0x10C4, 0x8149) }, /* West Mountain Radio Computerized Battery Analyzer */ { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */
PATCH 9/115 USB: usb-storage: unusual_devs update for Cypress ATACB
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Richard Schütz <[email protected]>
commit cae41118f50ef0c431e13159df6d7dd8bbd54004 upstream.
New device ID added for unusual Cypress ATACB device.
--- drivers/usb/storage/unusual_cypress.h | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/storage/unusual_cypress.h +5 -0
@@ -31,4 +31,9 @@ UNUSUAL_DEV( 0x04b4, 0x6831, 0x0000, 0x "Cypress ISD-300LP", US_SC_CYP_ATACB, US_PR_DEVICE, NULL, 0), +UNUSUAL_DEV( 0x14cd, 0x6116, 0x0000, 0x9999, + "Super Top", + "USB 2.0 SATA BRIDGE", + US_SC_CYP_ATACB, US_PR_DEVICE, NULL, 0), +#endif /* defined(CONFIG_USB_STORAGE_CYPRESS_ATACB) || ... */
PATCH 10/115 USB: usb-storage: unusual_devs update for TrekStor DataStation maxi g.u external hard drive enclosure
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: =?UTF-8?q?Richard=20Sch=C3=BCtz?= <[email protected]>
commit 7e1e7bd9dbd469267b6e6de1bf8d71a7d65ce86a upstream.
The TrekStor DataStation maxi g.u external hard drive enclosure uses a JMicron USB to SATA chip which needs the US_FL_IGNORE_RESIDUE flag to work properly.
--- drivers/usb/storage/unusual_devs.h | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/usb/storage/unusual_devs.h +9 -0
@@ -1880,6 +1880,15 @@ UNUSUAL_DEV( 0x1908, 0x1320, 0x0000, 0x0 US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_BAD_SENSE ), +/* Patch by Richard Sch�tz <[email protected]> +* This external hard drive enclosure uses a JMicron chip which +* needs the US_FL_IGNORE_RESIDUE flag to work properly. */ +UNUSUAL_DEV (0x1e68 ,0x001b ,0x0000 ,0x0000 , +"TrekStor GmbH & Co. KG" , +"DataStation maxi g.u" , +US_SC_DEVICE ,US_PR_DEVICE ,NULL , +US_FL_IGNORE_RESIDUE |US_FL_SANE_SENSE ), + UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001, "ST", "2A",
PATCH 11/115 USB: usb-storage: unusual_devs entry for CamSport Evo
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alan Stern <[email protected]>
commit 12f68c480c7155a66bd2a76ab2fef28dd5f93fa2 upstream.
This patch (as1438) adds an unusual_devs entry for the MagicPixel FW_Omega2 chip, used in the CamSport Evo camera. The firmware incorrectly reports a vendor-specific bDeviceClass.
--- drivers/usb/storage/unusual_devs.h | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/usb/storage/unusual_devs.h +9 -0
@@ -1043,6 +1043,15 @@ UNUSUAL_DEV( 0x084d, 0x0011, 0x0110, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_BULK32), +/* Reported by <[email protected]> +* The device reports a vendor-specific device class, requiring an +* explicit vendor/product match. +*/ +UNUSUAL_DEV (0x0851 ,0x1542 ,0x0002 ,0x0002 , +"MagicPixel" , +"FW_Omega2" , + US_SC_DEVICE, US_PR_DEVICE, NULL, 0), +/* Andrew Lunn <[email protected]> * PanDigital Digital Picture Frame. Does not like ALLOW_MEDIUM_REMOVAL * on LUN 4.
PATCH 12/115 USB: usb-storage: unusual_devs entry for Coby MP3 player
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alan Stern <[email protected]>
commit 3ea3c9b5a8464ec8223125f95e5dddb3bfd02a39 upstream.
This patch (as1444) adds an unusual_devs entry for an MP3 player from Coby electronics. The device has two nasty bugs.
--- drivers/usb/storage/unusual_devs.h | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/usb/storage/unusual_devs.h +7 -0
@@ -1898,6 +1898,13 @@ UNUSUAL_DEV( 0x1e68, 0x001b, 0x0000, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_IGNORE_RESIDUE | US_FL_SANE_SENSE ), +/* Reported by Jasper Mackenzie <[email protected]> */ +UNUSUAL_DEV (0x1e74 ,0x4621 ,0x0000 ,0x0000 , +"Coby Electronics" , +"MP3 Player" , +US_SC_DEVICE ,US_PR_DEVICE ,NULL , +US_FL_BULK_IGNORE_TAG |US_FL_MAX_SECTORS_64 ), + UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001, "ST", "2A",
PATCH 13/115 USB: serial: Updated support for ICOM devices
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Pieter Maes <[email protected]>
commit a9d61bc49188e32d2ae9cf0f683cde3e1744feef upstream.
I found the original patch on the db0fhn repeater wiki (couldn't find the email of the origial author) I guess it was never commited.
I updated and added some Icom HAM-radio devices to the ftdi driver. Added extra comments to make clear what devices it are.
--- drivers/usb/serial/ftdi_sio.c | 12 +++++++++++- drivers/usb/serial/ftdi_sio_ids.h | 20 ++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-)
drivers/usb/serial/ftdi_sio.c +11 -1
@@ -681,7 +681,17 @@ static struct usb_device_id id_table_com { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) }, - { USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) }, + { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
drivers/usb/serial/ftdi_sio_ids.h +16 -4
@@ -576,11 +576,23 @@#define OCT_US101_PID 0x0421/* OCT US101 USB to RS-232 */ /* -* Icom ID-1 digital transceiver +* Definitions for Icom Inc. devices */ - -#define ICOM_ID1_VID 0x0C26 -#define ICOM_ID1_PID 0x0004 +#define ICOM_VID 0x0C26/* Icom vendor ID */ +/* Note: ID-1 is a communications tranceiver for HAM-radio operators */ +#define ICOM_ID_1_PID 0x0004/* ID-1 USB to RS-232 */ +/* Note: OPC is an Optional cable to connect an Icom Tranceiver */ +#define ICOM_OPC_U_UC_PID 0x0018/* OPC-478UC, OPC-1122U cloning cable */ +/* Note: ID-RP* devices are Icom Repeater Devices for HAM-radio */ +#define ICOM_ID_RP2C1_PID 0x0009/* ID-RP2C Asset 1 to RS-232 */ +#define ICOM_ID_RP2C2_PID 0x000A/* ID-RP2C Asset 2 to RS-232 */ +#define ICOM_ID_RP2D_PID 0x000B/* ID-RP2D configuration port*/ +#define ICOM_ID_RP2VT_PID 0x000C/* ID-RP2V Transmit config port */ +#define ICOM_ID_RP2VR_PID 0x000D/* ID-RP2V Receive config port */ +#define ICOM_ID_RP4KVT_PID 0x0010/* ID-RP4000V Transmit config port */ +#define ICOM_ID_RP4KVR_PID 0x0011/* ID-RP4000V Receive config port */ +#define ICOM_ID_RP2KVT_PID 0x0012/* ID-RP2000V Transmit config port */ +#define ICOM_ID_RP2KVR_PID 0x0013/* ID-RP2000V Receive config port */ /* * GN Otometrics (http://www.otometrics.com)
PATCH 14/115 USB: adding USB support for Cinterions HC2x, EU3 and PH8 products
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Nicolaus Colberg <[email protected]>
commit aa52b3a92918039b273fc9d1994bd34227c40269 upstream.
/drivers/usb/serial/option.c: Adding support for Cinterion's HC25, HC28, HC28J, EU3-E, EU3-P and PH8 by correcting/adding Cinterion's and Siemens' Vendor IDs as well as Product IDs and USB_DEVICE tuples
--- drivers/usb/serial/option.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
drivers/usb/serial/option.c +21 -2
@@ -369,7 +369,16 @@ static int option_resume(struct usb_ser#define HAIER_VENDOR_ID 0x201e#define HAIER_PRODUCT_CE100 0x2009 -#define CINTERION_VENDOR_ID 0x0681 +/* Cinterion (formerly Siemens) products */ +#define SIEMENS_VENDOR_ID 0x0681 +#define CINTERION_VENDOR_ID 0x1e2d +#define CINTERION_PRODUCT_HC25_MDM 0x0047 +#define CINTERION_PRODUCT_HC25_MDMNET 0x0040 +#define CINTERION_PRODUCT_HC28_MDM 0x004C +#define CINTERION_PRODUCT_HC28_MDMNET 0x004A/* same for HC28J */ +#define CINTERION_PRODUCT_EU3_E 0x0051 +#define CINTERION_PRODUCT_EU3_P 0x0052 +#define CINTERION_PRODUCT_PH8 0x0053/* Olivetti products */ #define OLIVETTI_VENDOR_ID 0x0b3c
@@ -895,7 +904,17 @@ static struct usb_device_id option_ids[] { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100F) }, { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1011)}, { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012)}, - { USB_DEVICE(CINTERION_VENDOR_ID, 0x0047) }, +/* Cinterion */ + { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, + { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, + { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) }, + { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, + { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, + { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) }, + { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDMNET) }, + { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, /* HC28 enumerates with Siemens or Cinterion VID depending on FW revision */ + { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ { } /* Terminating entry */
PATCH 15/115 USB: EHCI: ASPM quirk of ISOC on AMD Hudson
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alex He <[email protected]>
commit baab93afc2844b68d57b0dcca5e1d34c5d7cf411 upstream.
AMD Hudson also needs the same ASPM quirk as SB800
--- drivers/usb/host/ehci-pci.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-)
drivers/usb/host/ehci-pci.c +20 -13
@@ -41,28 +41,35 @@ static int ehci_pci_reinit(struct ehci_hreturn 0 ; } -static int ehci_quirk_amd_SB800 (struct ehci_hcd *ehci) +static int ehci_quirk_amd_hudson (struct ehci_hcd *ehci) {struct pci_dev *amd_smbus_dev;u8 rev =0 ; amd_smbus_dev =pci_get_device (PCI_VENDOR_ID_ATI ,0x4385 ,NULL ); -if (!amd_smbus_dev) -return 0 ; - -pci_read_config_byte (amd_smbus_dev,PCI_REVISION_ID , &rev); -if (rev <0x40 ) { -pci_dev_put (amd_smbus_dev); - amd_smbus_dev =NULL ; -return 0 ; +if (amd_smbus_dev) { +pci_read_config_byte (amd_smbus_dev,PCI_REVISION_ID , &rev); +if (rev <0x40 ) { +pci_dev_put (amd_smbus_dev); + amd_smbus_dev =NULL ; +return 0 ; + } + }else { + amd_smbus_dev =pci_get_device (PCI_VENDOR_ID_AMD ,0x780b ,NULL ); +if (!amd_smbus_dev) +return 0 ; +pci_read_config_byte (amd_smbus_dev,PCI_REVISION_ID , &rev); +if (rev <0x11 || rev >0x18 ) { +pci_dev_put (amd_smbus_dev); + amd_smbus_dev =NULL ; +return 0 ; + } }if (!amd_nb_dev) amd_nb_dev =pci_get_device (PCI_VENDOR_ID_AMD ,0x1510 ,NULL ); -if (!amd_nb_dev) -ehci_err (ehci,"QUIRK: unable to get AMD NB device\n" ); -ehci_info (ehci,"QUIRK: Enable AMD SB800 L1 fix\n" ); +ehci_info (ehci,"QUIRK: Enable exception for AMD Hudson ASPM\n" );pci_dev_put (amd_smbus_dev); amd_smbus_dev =NULL ;
@@ -128,7 +135,7 @@ static int ehci_pci_setup(struct usb_hcd/* cache this readonly data; minimize chip reads */ ehci->hcs_params =ehci_readl (ehci, &ehci->caps->hcs_params); -if (ehci_quirk_amd_SB800 (ehci)) +if (ehci_quirk_amd_hudson (ehci)) ehci->amd_l1_fix =1 ; retval =ehci_halt (ehci);
PATCH 16/115 USB: EHCI: fix DMA deallocation bug
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alan Stern <[email protected]>
commit f75593ceaa08e6d27aec1a5de31cded19e850dd1 upstream.
This patch (as1440) fixes a bug in ehci-hcd. ehci->periodic_size is used to compute the size in a dma_alloc_coherent() call, but then it gets changed later on. As a result, the corresponding call to dma_free_coherent() passes a different size from the original allocation. Fix the problem by adjusting ehci->periodic_size before carrying out any of the memory allocations.
--- drivers/usb/host/ehci-hcd.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
drivers/usb/host/ehci-hcd.c +12 -7
@@ -545,6 +545,8 @@ static int ehci_init(struct usb_hcd *hcd ehci->iaa_watchdog.function = ehci_iaa_watchdog; ehci->iaa_watchdog.data = (unsigned long ) ehci; + hcc_params =ehci_readl (ehci, &ehci->caps->hcc_params); +/* * hw default: 1K periodic list heads, one per frame. * periodic_size can shrink by USBCMD update if hcc_params allows.
@@ -552,11 +554,20 @@ static int ehci_init(struct usb_hcd *hcd ehci->periodic_size =DEFAULT_I_TDPS ;INIT_LIST_HEAD (&ehci->cached_itd_list);INIT_LIST_HEAD (&ehci->cached_sitd_list); + +if (HCC_PGM_FRAMELISTLEN (hcc_params)) { +/* periodic schedule size can be smaller than default */ +switch (EHCI_TUNE_FLS ) { +case 0 : ehci->periodic_size =1024 ;break ; +case 1 : ehci->periodic_size =512 ;break ; +case 2 : ehci->periodic_size =256 ;break ; +default :BUG (); + } + }if ((retval =ehci_mem_init (ehci,GFP_KERNEL )) <0 )return retval;/* controllers may cache some of the periodic schedule ... */ - hcc_params =ehci_readl (ehci, &ehci->caps->hcc_params);if (HCC_ISOC_CACHE (hcc_params))// full frame cache ehci->i_thresh =8 ;else // N microframes cached
@@ -605,12 +616,6 @@ static int ehci_init(struct usb_hcd *hcd/* periodic schedule size can be smaller than default */ temp &= ~(3 <<2 ); temp |= (EHCI_TUNE_FLS <<2 ); -switch (EHCI_TUNE_FLS ) { -case 0 : ehci->periodic_size =1024 ;break ; -case 1 : ehci->periodic_size =512 ;break ; -case 2 : ehci->periodic_size =256 ;break ; -default :BUG (); - } } ehci->command = temp;
PATCH 17/115 USB: g_printer: fix bug in module parameter definitions
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alan Stern <[email protected]>
commit ad84e4a9efb7c8ed322bafb6ebdb9c3a49a3d3a8 upstream.
This patch (as1442) fixes a bug in g_printer: Module parameters should not be marked "__initdata" if they are accessible in sysfs (i.e., if the mode value in the module_param() macro is nonzero). Otherwise attempts to access the parameters will cause addressing violations.
Character-string module parameters must not be marked "__initdata" if the module can be unloaded, because the kernel needs to access the parameter variable at unload time in order to free the dynamically-allocated string.
--- drivers/usb/gadget/printer.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/usb/gadget/printer.c +7 -7
@@ -130,31 +130,31 @@ static struct printer_dev usb_printer_ga* parameters are in UTF-8 (superset of ASCII's 7 bit characters). */ -static ushort __initdata idVendor; +static ushort idVendor;module_param (idVendor, ushort,S_IRUGO );MODULE_PARM_DESC (idVendor,"USB Vendor ID" ); -static ushort __initdata idProduct; +static ushort idProduct;module_param (idProduct, ushort,S_IRUGO );MODULE_PARM_DESC (idProduct,"USB Product ID" ); -static ushort __initdata bcdDevice; +static ushort bcdDevice;module_param (bcdDevice, ushort,S_IRUGO );MODULE_PARM_DESC (bcdDevice,"USB Device version (BCD)" ); -static char *__initdata iManufacturer; +static char *iManufacturer;module_param (iManufacturer, charp,S_IRUGO );MODULE_PARM_DESC (iManufacturer,"USB Manufacturer string" ); -static char *__initdata iProduct; +static char *iProduct;module_param (iProduct, charp,S_IRUGO );MODULE_PARM_DESC (iProduct,"USB Product string" ); -static char *__initdata iSerialNum; +static char *iSerialNum;module_param (iSerialNum, charp,S_IRUGO );MODULE_PARM_DESC (iSerialNum,"1" ); -static char *__initdata iPNPstring; +static char *iPNPstring;module_param (iPNPstring, charp,S_IRUGO );MODULE_PARM_DESC (iPNPstring,"MFG:linux;MDL:g_printer;CLS:PRINTER;SN:1;" );
PATCH 18/115 USB: io_edgeport: fix the reported firmware major and minor
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Bjørn Mork <[email protected]>
commit 271c1150b4f8e1685e5a8cbf76e329ec894481da upstream.
The major and minor number saved in the product_info structure were copied from the address instead of the data, causing an inconsistency in the reported versions during firmware loading:
usb 4-1: firmware: requesting edgeport/down.fw /usr/src/linux/drivers/usb/serial/io_edgeport.c: downloading firmware version (930) 1.16.4 [..]
/usr/src/linux/drivers/usb/serial/io_edgeport.c: edge_startup - time 3 4328191260
/usr/src/linux/drivers/usb/serial/io_edgeport.c: FirmwareMajorVersion 0.0.4
This can cause some confusion whether firmware loaded successfully or not.
--- drivers/usb/serial/io_edgeport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/serial/io_edgeport.c +2 -2
@@ -2935,8 +2935,8 @@ static void load_application_firmware(stdbg ("%s %d.%d.%d" , fw_info, rec->data[0 ], rec->data[1 ], build); - edge_serial->product_info.FirmwareMajorVersion = fw->data[0 ]; - edge_serial->product_info.FirmwareMinorVersion = fw->data[1 ]; + edge_serial->product_info.FirmwareMajorVersion = rec->data[0 ]; + edge_serial->product_info.FirmwareMinorVersion = rec->data[1 ]; edge_serial->product_info.FirmwareBuildNumber =cpu_to_le16 (build); for (rec = ihex_next_binrec(rec); rec;
PATCH 19/115 USB: ti_usb: fix module removal
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Ionut Nicu <[email protected]>
commit b14de3857227cd978f515247853fd15cc2425d3e upstream.
If usb_deregister() is called after usb_serial_deregister() when the device is plugged in, the following Oops occurs:
[ 95.337377] BUG: unable to handle kernel NULL pointer dereference at 00000010 [ 95.338236] IP: [<c0776b2d>] klist_put+0x12/0x62 [ 95.338356] *pdpt = 000000003001a001 *pde = 0000000000000000 [ 95.338356] Oops: 0000 [#1] SMP [ 95.340499] last sysfs file: /sys/devices/pci0000:00/0000:00:1d.2/usb8/idVendor [ 95.340499] Modules linked in: ti_usb_3410_5052(-) usbserial cpufreq_ondemand acpi_cpufreq mperf iptable_nat nf_nat iptable_mangle ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 ip6table_filter ip6_tables ipv6 uinput arc4 ecb iwlagn iwlcore mac80211 cfg80211 microcode pcspkr acer_wmi joydev wmi sky2 [last unloaded: scsi_wait_scan] [ 95.341908] [ 95.341908] Pid: 1532, comm: modprobe Not tainted 2.6.37-rc7+ #6 Eiger /Aspire 5930 [ 95.341908] EIP: 0060:[<c0776b2d>] EFLAGS: 00010246 CPU: 0 [ 95.341908] EIP is at klist_put+0x12/0x62 [ 95.341908] EAX: 00000000 EBX: eedc0c84 ECX: c09c21b4 EDX: 00000001 [ 95.341908] ESI: 00000000 EDI: efaa0c1c EBP: f214fe2c ESP: f214fe1c [ 95.341908] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 95.341908] Process modprobe (pid: 1532, ti=f214e000 task=efaaf080 task.ti=f214e000) [ 95.341908] Stack: [ 95.341908] f214fe24 eedc0c84 efaaf080 efaa0c1c f214fe34 c0776ba8 f214fe5c c0776c76 [ 95.341908] c09c21b4 c09c21b4 eedc0c84 efaaf080 00000000 c0634398 eafe2d1c f7b515f0 [ 95.341908] f214fe6c c0631b5c eafe2d50 eafe2d1c f214fe7c c0631ba2 eafe2d1c eafe2c00 [ 95.341908] Call Trace: [ 95.341908] [<c0776ba8>] ? klist_del+0xd/0xf [ 95.341908] [<c0776c76>] ? klist_remove+0x48/0x74 [ 95.341908] [<c0634398>] ? devres_release_all+0x49/0x51 [ 95.341908] [<c0631b5c>] ? __device_release_driver+0x7b/0xa4 [ 95.341908] [<c0631ba2>] ? device_release_driver+0x1d/0x28 [ 95.341908] [<c06317c4>] ? bus_remove_device+0x92/0xa1 [ 95.341908] [<c062f3d8>] ? device_del+0xf9/0x13e [ 95.341908] [<f7b06146>] ? usb_serial_disconnect+0xd9/0x116 [usbserial] [ 95.341908] [<c0681e3f>] ? usb_disable_interface+0x32/0x40 [ 95.341908] [<c0683972>] ? usb_unbind_interface+0x48/0xfd [ 95.341908] [<c0631b43>] ? __device_release_driver+0x62/0xa4 [ 95.341908] [<c06320b9>] ? driver_detach+0x62/0x81 [ 95.341908] [<c0631a41>] ? bus_remove_driver+0x8f/0xae [ 95.341908] [<c063214c>] ? driver_unregister+0x50/0x57 [ 95.341908] [<c0682f95>] ? usb_deregister+0x77/0x84 [ 95.341908] [<f7b505b6>] ? ti_exit+0x26/0x28 [ti_usb_3410_5052] [ 95.341908] [<c046a307>] ? sys_delete_module+0x181/0x1de [ 95.341908] [<c04e2727>] ? path_put+0x1a/0x1d [ 95.341908] [<c047f4c5>] ? audit_syscall_entry+0x116/0x138 [ 95.341908] [<c04094df>] ? sysenter_do_call+0x12/0x28 [ 95.341908] Code: 00 83 7d f0 00 74 09 85 f6 74 05 89 f0 ff 55 f0 8b 43 04 5a 5b 5e 5f 5d c3 55 89 e5 57 56 53 89 c3 83 ec 04 8b 30 83 e6 fe 89 f0 <8b> 7e 10 88 55 f0 e8 47 26 01 00 8a 55 f0 84 d2 74 17 f6 03 01 [ 95.341908] EIP: [<c0776b2d>] klist_put+0x12/0x62 SS:ESP 0068:f214fe1c [ 95.341908] CR2: 0000000000000010 [ 95.342357] ---[ end trace 8124d00ad871ad18 ]---
--- drivers/usb/serial/ti_usb_3410_5052.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/serial/ti_usb_3410_5052.c +1 -1
@@ -366,9 +366,9 @@ failed_1port: static void __exit ti_exit(void) { +usb_deregister (&ti_usb_driver);usb_serial_deregister (&ti_1port_device);usb_serial_deregister (&ti_2port_device); -usb_deregister (&ti_usb_driver); }
PATCH 20/115 USB: Storage: Add unusual_devs entry for VTech Kidizoom
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Nick Holloway <[email protected]>
commit c25f6b1591b158f7ae3b9132367d0fa6d632e70e upstream.
This device suffers from the off-by-one error when reporting the capacity, so add entry with US_FL_FIX_CAPACITY.
--- drivers/usb/storage/unusual_devs.h | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/usb/storage/unusual_devs.h +7 -0
@@ -1410,6 +1410,13 @@ UNUSUAL_DEV( 0x0fca, 0x0006, 0x0001, 0x US_FL_IGNORE_DEVICE ), #endif +/* Submitted by Nick Holloway */ +UNUSUAL_DEV (0x0f88 ,0x042e ,0x0100 ,0x0100 , +"VTech" , +"Kidizoom" , +US_SC_DEVICE ,US_PR_DEVICE ,NULL , +US_FL_FIX_CAPACITY ), +/* Reported by Michael Stattmann <[email protected]> */ UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, "Sony Ericsson",
PATCH 21/115 USB: ftdi_sio: add ST Micro Connect Lite uart support
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Jean-Christophe PLAGNIOL-VILLARD <[email protected]>
commit 6ec2f46c4b4abf48c88c0ae7c476f347b97e1105 upstream.
on ST Micro Connect Lite we have 4 port
Part A and B for the JTAG
Port C Uart
Port D for PIO
--- drivers/usb/serial/ftdi_sio.c | 26 ++++++++++++++++++++++++++ drivers/usb/serial/ftdi_sio_ids.h | 6 ++++++ 2 files changed, 32 insertions(+)
drivers/usb/serial/ftdi_sio.c +26 -0
@@ -104,6 +104,7 @@ struct ftdi_sio_quirk {static int ftdi_jtag_probe (struct usb_serial *serial);static int ftdi_mtxorb_hack_setup (struct usb_serial *serial);static int ftdi_NDI_device_setup (struct usb_serial *serial); +static int ftdi_stmclite_probe (struct usb_serial *serial);static void ftdi_USB_UIRT_setup (struct ftdi_private *priv);static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv);
@@ -127,6 +128,10 @@ static struct ftdi_sio_quirk ftdi_HE_TIR .port_probe = ftdi_HE_TIRA1_setup, }; +static struct ftdi_sio_quirk ftdi_stmclite_quirk = { + .probe = ftdi_stmclite_probe, +}; +/* * The 8U232AM has the same API as the sio except for: * - it can support MUCH higher baudrates; up to:
@@ -815,6 +820,8 @@ static struct usb_device_id id_table_com { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) }, { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), + .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, { }, /* Optional parameter entry */ { } /* Terminating entry */ };
@@ -1748,6 +1755,25 @@ static int ftdi_jtag_probe(struct usb_se }/* +* First and second port on STMCLiteadaptors is reserved for JTAG interface +* and the forth port for pio +*/ +static int ftdi_stmclite_probe (struct usb_serial *serial) +{ +struct usb_device *udev = serial->dev; +struct usb_interface *interface = serial->interface; + +dbg ("%s" , __func__); + +if (interface == udev->actconfig->interface[2 ]) +return 0 ; + +dev_info (&udev->dev,"Ignoring serial port reserved for JTAG\n" ); + +return -ENODEV ; +} + +/* * The Matrix Orbital VK204-25-USB has an invalid IN endpoint. * We have to correct it if we want to read from it. */
drivers/usb/serial/ftdi_sio_ids.h +6 -0
@@ -1041,6 +1041,12 @@#define WHT_PID 0x0004/* Wireless Handheld Terminal */ /* +* STMicroelectonics +*/ +#define ST_VID 0x0483 +#define ST_STMCLT1030_PID 0x3747/* ST Micro Connect Lite STMCLT1030 */ + +/* * Papouch products (http://www.papouch.com/) * Submitted by Folkert van Heusden */
PATCH 22/115 USB: cdc-acm: Adding second ACM channel support for Nokia N8
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Arvid Ephraim Picciani <[email protected]>
commit 721d92fc6373dee15846216f9d178ec240ec0fd7 upstream.
This adds the N8 to the list of devices in cdc-acm, in order to get the secondary ACM device exposed.
In the spirit of:
http://kerneltrap.org/mailarchive/linux-usb/2010/9/4/6264554
--- drivers/usb/class/cdc-acm.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/class/cdc-acm.c +1 -0
@@ -1596,6 +1596,7 @@ static struct usb_device_id acm_ids[] = { NOKIA_PCSUITE_ACM_INFO(0x0154), }, /* Nokia 5800 XpressMusic */ { NOKIA_PCSUITE_ACM_INFO(0x04ce), }, /* Nokia E90 */ { NOKIA_PCSUITE_ACM_INFO(0x01d4), }, /* Nokia E55 */ + { NOKIA_PCSUITE_ACM_INFO(0x0302), }, /* Nokia N8 */ { SAMSUNG_PCSUITE_ACM_INFO(0x6651), }, /* Samsung GTi8510 (INNOV8) *//* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */
PATCH 23/115 USB: ftdi_sio: Add VID=0x0647, PID=0x0100 for Acton Research spectrograph
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Michael Williamson <[email protected]>
commit 28fe2eb0162a1d23370dd99ff7d0e35632b1ee91 upstream.
Add the USB Vendor ID and Product ID for a Acton Research Corp. spectrograph device with a FTDI chip for serial I/O.
--- drivers/usb/serial/ftdi_sio.c | 1 + drivers/usb/serial/ftdi_sio_ids.h | 6 ++++++ 2 files changed, 7 insertions(+)
drivers/usb/serial/ftdi_sio.c +1 -0
@@ -625,6 +625,7 @@ static struct usb_device_id id_table_com { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) }, { USB_DEVICE(TTI_VID, TTI_QL355P_PID) }, { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, + { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) }, { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
drivers/usb/serial/ftdi_sio_ids.h +6 -0
@@ -518,6 +518,12 @@#define RATOC_PRODUCT_ID_USB60F 0xb020/* +* Acton Research Corp. +*/ +#define ACTON_VID 0x0647/* Vendor ID */ +#define ACTON_SPECTRAPRO_PID 0x0100 + +/* * Contec products (http://www.contec.com) * Submitted by Daniel Sangorrin */
PATCH 24/115 USB: prevent buggy hubs from crashing the USB stack
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alan Stern <[email protected]>
commit d199c96d41d80a567493e12b8e96ea056a1350c1 upstream.
If anyone comes across a high-speed hub that (by mistake or by design) claims to have no Transaction Translators, plugging a full- or low-speed device into it will cause the USB stack to crash. This patch (as1446) prevents the problem by ignoring such devices, since the kernel has no way to communicate with them.
--- drivers/usb/core/hub.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/core/hub.c +5 -0
@@ -2683,6 +2683,11 @@ hub_port_init (struct usb_hub *hub, stru udev->ttport = hdev->ttport; }else if (udev->speed !=USB_SPEED_HIGH && hdev->speed ==USB_SPEED_HIGH ) { +if (!hub->tt.hub) { +dev_err (&udev->dev,"parent hub has no TT\n" ); + retval = -EINVAL ; + goto fail; + } udev->tt = &hub->tt; udev->ttport = port1; }
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Am 16.02.2011 02:44, schrieb Greg KH:
Quoted 1 line
2.6.32-longterm review patch. If anyone has any objections, please let us know.
This patch killed the MUSB-host-functionality here (on a BeagleBoard).
Regards,
Alexander
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Am 23.02.2011 09:06, schrieb Alexander Holler:
Quoted 5 lines
Am 16.02.2011 02:44, schrieb Greg KH:
Quoted 2 lines
2.6.32-longterm review patch. If anyone has any objections, please let us know.
This patch killed the MUSB-host-functionality here (on a BeagleBoard).
Sorry, haven't seen at first, that the question was for 2.6.32. I had to revert this patch for 2.6.37.1. Without the revert I've got endless messages that the "parent hub has no TT".
I've configured musb in gadget-mode and I'm loading g_zero to use a bt-dongle attached to the OTG-(MUSB-)port.
Quoted 3 lines
Regards,
Alexander
Alan Stern
maintainerRe: [024/115] USB: prevent buggy hubs from crashing the USB stack
Quoted 17 lines · Alexander Holler
Am 23.02.2011 09:06, schrieb Alexander Holler:
Quoted 5 lines
Am 16.02.2011 02:44, schrieb Greg KH:
Quoted 2 lines
2.6.32-longterm review patch. If anyone has any objections, please let us know.
This patch killed the MUSB-host-functionality here (on a BeagleBoard).
Sorry, haven't seen at first, that the question was for 2.6.32. I had to revert this patch for 2.6.37.1. Without the revert I've got endless messages that the "parent hub has no TT".
I've configured musb in gadget-mode and I'm loading
g_zeroto use a bt-dongle attached to the OTG-(MUSB-)port.Quoted 3 lines
Regards,
Alexander
Quoted 27 lines · Michael Jones
Hi all,
My OMAP37 board started choking on my USB mouse when I updated from 2.6.37 to 2.6.38rc5. I've tracked it down to commit
d199c96d41d80a567493e12b8e96ea056a1350c1, "USB: prevent buggy hubs from crashing the USB stack." If I revert this commit, my mouse works again. Otherwise, I get the message:usb 1-1: new low speed USB device using musb-hdrc and address 33 usb 1-1: parent hub has no TT
repeatedly (with 'address' incrementing).
I'm using the musb-hdrc driver for the OTG USB port in host mode.
some relevant config:
CONFIG_USB_EHCI_HCD_OMAP=yCONFIG_USB_MUSB_HDRC=yCONFIG_USB_MUSB_OMAP2PLUS=yCONFIG_USB_MUSB_HOST=yCONFIG_USB_MUSB_HDRC_HCD=yCONFIG_USB_INVENTRA_DMA=y# lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Quoted 5 lines
Any thoughts on how to get around this besides just reverting the commit? Did anybody already encounter this?
thanks,
Michael
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the hcd->has_tt flag.
Felipe, you should know where it belongs. It should be easy enough to add.
Alan Stern
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Hi,
Quoted 5 lines · Alan Stern
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
Signature · 1 line
balbi
Quoted 1 line
From
65315c60a17f83e69d01888babe4445097c8ead0Mon Sep 17 00:00:00 2001
From: Felipe Balbi <[email protected]>
Date: Thu, 24 Feb 2011 10:36:53 +0200
Subject: [PATCH] usb: musb: core: set has_tt flag
Organization: Texas Instruments\n
MUSB is a non-standard host implementation which can handle all speeds with the same core. We need to set has_tt flag after commit d199c96d41d80a567493e12b8e96ea056a1350c1 (USB: prevent buggy hubs from crashing the USB stack) in order for MUSB HCD to continue working.
--- drivers/usb/musb/musb_core.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/usb/musb/musb_core.c +1 -0
@@ -1864,6 +1864,7 @@ allocate_instance(struct device *dev,INIT_LIST_HEAD (&musb->out_bulk); hcd->uses_new_polling =1 ; + hcd->has_tt =1 ; musb->vbuserr_retry =VBUSERR_RETRY_COUNT ; musb->a_wait_bcon =OTG_TIME_A_WAIT_BCON ;
Signature · 1 line
1.7.4.rc2
Alexander Holler
Tested-byRe: [024/115] USB: prevent buggy hubs from crashing the USB stack
Hello,
Am 24.02.2011 09:57, schrieb Felipe Balbi:
Quoted 11 lines
Hi,
Quoted 5 lines · Alan Stern
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
I can do, I'm using exactly the same patch since yesterday. ;)
Regards,
Alexander
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Hi,
Quoted 7 lines · Alexander Holler
Quoted 7 lines · Alan Stern
Quoted 5 lines
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Quoted 6 lines
Quoted 2 lines
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
I can do, I'm using exactly the same patch since yesterday. ;)
Tested-by Alexander Holler <[email protected]>
Thanks a lot Alex, Greg, can you still take this to -rc ? Do you need a pull request or you can take this one patch ?
Signature · 5 lines
balbi -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Quoted 13 lines · Felipe Balbi
Hi,
Quoted 10 lines · Alexander Holler
Quoted 9 lines · Alan Stern
Quoted 5 lines
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
Quoted 6 lines
Quoted 3 lines
I can do, I'm using exactly the same patch since yesterday. ;)
Tested-by Alexander Holler <[email protected]>Thanks a lot Alex, Greg, can you still take this to -rc ? Do you need a pull request or you can take this one patch ?
Wait, where does this need to go? For the final 2.6.38 release and then also for .37-stable?
Or just .37-stable?
confused.
And no, I don't need a pull request, I can handle one patch through email :)
thanks,
greg k-h
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Quoted 24 lines · Greg KH
Quoted 13 lines · Felipe Balbi
Hi,
Quoted 10 lines · Alexander Holler
Quoted 9 lines · Alan Stern
Quoted 5 lines
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
Quoted 6 lines
Quoted 3 lines
I can do, I'm using exactly the same patch since yesterday. ;)
Tested-by Alexander Holler <[email protected]>Thanks a lot Alex, Greg, can you still take this to -rc ? Do you need a pull request or you can take this one patch ?
Wait, where does this need to go? For the final 2.6.38 release and then also for .37-stable?
Quoted 6 lines
Or just .37-stable?
confused.
And no, I don't need a pull request, I can handle one patch through email :)
final .38 and .37-stable :-) Thanks Greg :-)
Signature · 1 line
balbi
Alan Stern
maintainerRe: [024/115] USB: prevent buggy hubs from crashing the USB stack
Quoted 25 lines · Felipe Balbi
Quoted 24 lines · Greg KH
Quoted 13 lines · Felipe Balbi
Hi,
Quoted 10 lines · Alexander Holler
Quoted 9 lines · Alan Stern
Quoted 5 lines
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
Quoted 6 lines
Quoted 3 lines
I can do, I'm using exactly the same patch since yesterday. ;)
Tested-by Alexander Holler <[email protected]>Thanks a lot Alex, Greg, can you still take this to -rc ? Do you need a pull request or you can take this one patch ?
Wait, where does this need to go? For the final 2.6.38 release and then also for .37-stable?
Quoted 8 lines
Quoted 6 lines
Or just .37-stable?
confused.
And no, I don't need a pull request, I can handle one patch through email :)
final .38 and .37-stable :-) Thanks Greg :-)
It's important that this patch appear in .37-stable at the same time as the $SUBJECT patch. If that means delaying $SUBJECT for one release, so be it -- it was not a very important change.
Alan Stern
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Hello,
Am 24.02.2011 18:57, schrieb Alan Stern:
Quoted 3 lines
It's important that this patch appear in .37-stable at the same time as the $SUBJECT patch. If that means delaying $SUBJECT for one release, so be it -- it was not a very important change.
Too late, 2.6.37.1 is already broken. But the patch could be still applied to 2.6.32-longterm, at least the message I've replied to asked about objections for that version.
Regards,
Alexander
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Quoted 11 lines · Alexander Holler
Hello,
Am 24.02.2011 18:57, schrieb Alan Stern:
Quoted 3 lines
It's important that this patch appear in .37-stable at the same time as the $SUBJECT patch. If that means delaying $SUBJECT for one release, so be it -- it was not a very important change.
Too late, 2.6.37.1 is already broken. But the patch could be still applied to 2.6.32-longterm, at least the message I've replied to asked about objections for that version.
It's too late for that release as well, as it's already included in the last .32 stable release. I'll revert it there also for now.
thanks,
greg k-h
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
In reply to Alan SternQuoted 31 lines · Alan Stern
Quoted 29 lines · Felipe Balbi
Quoted 28 lines · Greg KH
Quoted 13 lines · Felipe Balbi
Hi,
Quoted 10 lines · Alexander Holler
Quoted 9 lines · Alan Stern
Quoted 5 lines
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
Quoted 6 lines
Quoted 3 lines
I can do, I'm using exactly the same patch since yesterday. ;)
Tested-by Alexander Holler <[email protected]>Thanks a lot Alex, Greg, can you still take this to -rc ? Do you need a pull request or you can take this one patch ?
Wait, where does this need to go? For the final 2.6.38 release and then also for .37-stable?
Or just .37-stable?
confused.
Quoted 8 lines
Quoted 4 lines
Quoted 2 lines
And no, I don't need a pull request, I can handle one patch through email :)
final .38 and .37-stable :-) Thanks Greg :-)
It's important that this patch appear in .37-stable at the same time as the $SUBJECT patch. If that means delaying $SUBJECT for one release, so be it -- it was not a very important change.
Ok, I'll drop this from the next .37-stable release until this happens.
thanks for letting me know.
greg k-h
Re: [024/115] USB: prevent buggy hubs from crashing the USB stack
Quoted 35 lines · Greg KH
Quoted 34 lines · Alan Stern
Quoted 32 lines · Felipe Balbi
Quoted 30 lines · Greg KH
Quoted 13 lines · Felipe Balbi
Hi,
Quoted 10 lines · Alexander Holler
Quoted 9 lines · Alan Stern
Quoted 5 lines
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
Quoted 6 lines
Quoted 3 lines
I can do, I'm using exactly the same patch since yesterday. ;)
Tested-by Alexander Holler <[email protected]>Thanks a lot Alex, Greg, can you still take this to -rc ? Do you need a pull request or you can take this one patch ?
Wait, where does this need to go? For the final 2.6.38 release and then also for .37-stable?
Or just .37-stable?
confused.
And no, I don't need a pull request, I can handle one patch through email :)
Quoted 7 lines
Quoted 5 lines
Quoted 1 line
final .38 and .37-stable :-) Thanks Greg :-)
It's important that this patch appear in .37-stable at the same time as the $SUBJECT patch. If that means delaying $SUBJECT for one release, so be it -- it was not a very important change.
Ok, I'll drop this from the next .37-stable release until this happens.
Oops, wait, that's going to be hard as it's already in 2.6.37.1.
Oh, I guess I can revert it for the .2 release in a few hours, and then add it back in for .3...
I'll go do that.
thanks,
greg k-h
Michael Jones
Tested-byRe: [024/115] USB: prevent buggy hubs from crashing the USB stack
In reply to Felipe BalbiQuoted 12 lines · Felipe Balbi
Hi,
Quoted 5 lines · Alan Stern
In both cases, it appears that the problem is caused by the fact that the musb host-controller driver doesn't set the
hcd->has_ttflag.Felipe, you should know where it belongs. It should be easy enough to add.
Sure Alan, it's attached to this mail. Compile tested only though. Michael, would you care to give your tested-by ?
Alexander already did, but I can do now, too. Thanks for the fix.
MATRIX VISION GmbH, Talstrasse 16, DE-71570 Oppenweiler
Registergericht: Amtsgericht Stuttgart, HRB 271090
Geschaeftsfuehrer: Gerhard Thullner, Werner Armingeon, Uwe Furtner
PATCH 25/115 staging: comedi: add support for newer jr3 1-channel pci board
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Ruben Smits <[email protected]>
commit 6292817d58637f85dd623cfe563c7f5ec4f4c470 upstream.
add DEVICE_ID to table
--- drivers/staging/comedi/drivers/jr3_pci.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/staging/comedi/drivers/jr3_pci.c +7 -0
@@ -52,6 +52,7 @@ Devices: [JR3] PCI force sensor board (j#define PCI_VENDOR_ID_JR3 0x1762#define PCI_DEVICE_ID_JR3_1_CHANNEL 0x3111 +#define PCI_DEVICE_ID_JR3_1_CHANNEL_NEW 0x1111#define PCI_DEVICE_ID_JR3_2_CHANNEL 0x3112#define PCI_DEVICE_ID_JR3_3_CHANNEL 0x3113#define PCI_DEVICE_ID_JR3_4_CHANNEL 0x3114
@@ -71,6 +72,8 @@ static DEFINE_PCI_DEVICE_TABLE(jr3_pci_p {PCI_VENDOR_ID_JR3 ,PCI_DEVICE_ID_JR3_1_CHANNEL , PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, { +PCI_VENDOR_ID_JR3 ,PCI_DEVICE_ID_JR3_1_CHANNEL_NEW , + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_JR3 ,PCI_DEVICE_ID_JR3_2_CHANNEL , PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, { PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_3_CHANNEL,
@@ -807,6 +810,10 @@ static int jr3_pci_attach(struct comedi_ devpriv->n_channels =1 ; }break ; +case PCI_DEVICE_ID_JR3_1_CHANNEL_NEW :{ + devpriv->n_channels =1 ; + } +break ;case PCI_DEVICE_ID_JR3_2_CHANNEL :{ devpriv->n_channels =2 ; }
PATCH 26/115 staging: comedi: ni_labpc: Use shared IRQ for PCMCIA card
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Ian Abbott <[email protected]>
commit d1ce318496f5943d2cc5e20171fc383a59a1421f upstream.
The ni_labpc driver module only requests a shared IRQ for PCI devices, requesting a non-shared IRQ for non-PCI devices.
As this module is also used by the ni_labpc_cs module for certain National Instruments PCMCIA cards, it also needs to request a shared IRQ for PCMCIA devices, otherwise you get a IRQ mismatch with the CardBus controller.
--- drivers/staging/comedi/drivers/ni_labpc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/staging/comedi/drivers/ni_labpc.c +2 -1
@@ -528,7 +528,8 @@ int labpc_common_attach(struct comedi_de/* grab our IRQ */ if (irq) { isr_flags =0 ; -if (thisboard->bustype == pci_bustype) +if (thisboard->bustype == pci_bustype + || thisboard->bustype == pcmcia_bustype) isr_flags |=IRQF_SHARED ;if (request_irq (irq, labpc_interrupt, isr_flags, driver_labpc.driver_name, dev)) {
PATCH 27/115 Staging: hv: fix sysfs symlink on hv block device
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Ky Srinivasan <[email protected]>
commit 268eff909afaca93188d2d14554cbf824f6a0e41 upstream.
The block device does not create the proper symlink in sysfs because we forgot to set up the gendisk structure properly. This patch fixes the issue.
--- drivers/staging/hv/blkvsc_drv.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/hv/blkvsc_drv.c +1 -0
@@ -378,6 +378,7 @@ static int blkvsc_probe(struct device *d blkdev->gd->first_minor =0 ; blkdev->gd->fops = &block_ops; blkdev->gd->private_data = blkdev; + blkdev->gd->driverfs_dev = &(blkdev->device_ctx->device);sprintf (blkdev->gd->disk_name,"hd%c" ,'a' + devnum);blkvsc_do_inquiry (blkdev);
PATCH 28/115 staging: hv: Enable sending GARP packet after live migration
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Haiyang Zhang <[email protected]>
commit 7c161d0b900ea9bd9fc5ea5d3fa9916e9eb0dd88 upstream.
The hv_netvsc gets RNDIS_STATUS_MEDIA_CONNECT event after the VM is live migrated. Adding call to netif_notify_peers() for this event to send GARP (Gratuitous ARP) to notify network peers. Otherwise, the VM's network connection may stop after a live migration.
This patch should also be applied to stable kernel 2.6.32 and later.
--- drivers/staging/hv/netvsc_drv.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/hv/netvsc_drv.c +1 -0
@@ -296,6 +296,7 @@ static void netvsc_linkstatus_callback(sif (status ==1 ) {netif_carrier_on (net);netif_wake_queue (net); +netif_notify_peers (net); }else {netif_carrier_off (net);netif_stop_queue (net);
PATCH 29/115 hvc_iucv: allocate memory buffers for IUCV in zone DMA
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Hendrik Brueckner <[email protected]>
commit 91a970d9889c7d6f451ee91ed361d0f0119d3778 upstream.
The device driver must allocate memory for IUCV buffers with GFP_DMA, because IUCV cannot address memory above 2GB (31bit addresses only).
Because the IUCV ignores the higher bits of the address, sending and receiving IUCV data with this driver might cause memory corruptions.
--- drivers/char/hvc_iucv.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/char/hvc_iucv.c +4 -2
@@ -139,6 +139,8 @@ struct hvc_iucv_private *hvc_iucv_get_pr* * This function allocates a new struct iucv_tty_buffer element and, optionally, * allocates an internal data buffer with the specified size @size. +* The internal data buffer is always allocated with GFP_DMA which is +* required for receiving and sending data with IUCV. * Note: The total message size arises from the internal buffer size and the * members of the iucv_tty_msg structure. * The function returns NULL if memory allocation has failed.
@@ -154,7 +156,7 @@ static struct iucv_tty_buffer *alloc_ttyif (size >0 ) { bufp->msg.length =MSG_SIZE (size); - bufp->mbuf =kmalloc (bufp->msg.length, flags); + bufp->mbuf =kmalloc (bufp->msg.length, flags |GFP_DMA );if (!bufp->mbuf) {mempool_free (bufp, hvc_iucv_mempool);return NULL ;
@@ -237,7 +239,7 @@ static int hvc_iucv_write(struct hvc_iucif (!rb->mbuf) {/* message not yet received ... */ /* allocate mem to store msg data; if no memory is available * then leave the buffer on the list and re-try later */ - rb->mbuf =kmalloc (rb->msg.length,GFP_ATOMIC ); + rb->mbuf =kmalloc (rb->msg.length,GFP_ATOMIC |GFP_DMA );if (!rb->mbuf)return -ENOMEM ;
PATCH 30/115 iwlagn: enable only rfkill interrupt when device is down
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Stanislaw Gruszka <[email protected]>
commit 554d1d027b19265c4aa3f718b3126d2b86e09a08 upstream.
Since commit 6cd0b1cb872b3bf9fc5de4536404206ab74bafdd "iwlagn: fix hw-rfkill while the interface is down", we enable interrupts when device is not ready to receive them. However hardware, when it is in some inconsistent state, can generate other than rfkill interrupts and crash the system. I can reproduce crash with "kernel BUG at drivers/net/wireless/iwlwifi/iwl-agn.c:1010!" message, when forcing firmware restarts.
To fix only enable rfkill interrupt when down device and after probe. I checked patch on laptop with 5100 device, rfkill change is still passed to user space when device is down.
--- drivers/net/wireless/iwlwifi/iwl-agn.c | 9 +++++---- drivers/net/wireless/iwlwifi/iwl-helpers.h | 6 ++++++ 2 files changed, 11 insertions(+), 4 deletions(-)
drivers/net/wireless/iwlwifi/iwl-agn.c +5 -4
@@ -2358,9 +2358,10 @@ static void iwl_mac_stop(struct ieee8021flush_workqueue (priv->workqueue); -/* enable interrupts again in order to receive rfkill changes */ +/* User space software may expect getting rfkill changes +* even if interface is down */ iwl_write32 (priv,CSR_INT ,0xFFFFFFFF ); -iwl_enable_interrupts (priv); +iwl_enable_rfkill_int (priv);IWL_DEBUG_MAC80211 (priv,"leave\n" ); }
@@ -3060,14 +3061,14 @@ static int iwl_pci_probe(struct pci_dev* 8. Setup and register mac80211 **********************************/ -/* enable interrupts if needed: hw bug w/a */ +/* enable rfkill interrupt: hw bug w/a */ pci_read_config_word (priv->pci_dev,PCI_COMMAND , &pci_cmd);if (pci_cmd &PCI_COMMAND_INTX_DISABLE ) { pci_cmd &= ~PCI_COMMAND_INTX_DISABLE ;pci_write_config_word (priv->pci_dev,PCI_COMMAND , pci_cmd); } -iwl_enable_interrupts (priv); +iwl_enable_rfkill_int (priv); err =iwl_setup_mac (priv);if (err)
drivers/net/wireless/iwlwifi/iwl-helpers.h +6 -0
@@ -160,6 +160,12 @@ static inline void iwl_disable_interruptIWL_DEBUG_ISR (priv,"Disabled interrupts\n" ); } +static inline void iwl_enable_rfkill_int (struct iwl_priv *priv) +{ +IWL_DEBUG_ISR (priv,"Enabling rfkill interrupt\n" ); +iwl_write32 (priv,CSR_INT_MASK ,CSR_INT_BIT_RF_KILL ); +} +static inline void iwl_enable_interrupts (struct iwl_priv *priv) {IWL_DEBUG_ISR (priv,"Enabling interrupts\n" );
PATCH 31/115 ath9k: Fix bug in delimiter padding computation
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Vasanthakumar Thiagarajan <[email protected]>
commit 39ec2997c374b528cdbf65099b6d6b8593a67f7f upstream.
There is a roundng error in delimiter padding computation which causes severe throughput drop with some of AR9003.
--- drivers/net/wireless/ath/ath9k/ath9k.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/ath/ath9k/ath9k.h +2 -2
@@ -214,8 +214,8 @@ void ath_descdma_cleanup(struct ath_soft/* returns delimiter padding required given the packet length */ #define ATH_AGGR_GET_NDELIM (_len) \ - (((((_len) + ATH_AGGR_DELIM_SZ) < ATH_AGGR_MINPLEN) ? \ - (ATH_AGGR_MINPLEN - (_len) - ATH_AGGR_DELIM_SZ) : 0) >> 2) + (((_len) >= ATH_AGGR_MINPLEN) ? 0 : \ + DIV_ROUND_UP(ATH_AGGR_MINPLEN - (_len), ATH_AGGR_DELIM_SZ))#define BAW_WITHIN (_start, _bawsz, _seqno) \ ((((_seqno) - (_start)) & 4095) < (_bawsz))
PATCH 32/115 correct vdso version string
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Martin Schwidefsky <[email protected]>
commit 13c6680acb3df25722858566b42759215ea5d2e0 upstream.
The glibc vdso code for s390 uses the version string 2.6.29, the kernel uses the version string 2.6.26. No wonder the vdso code is never used. The first kernel version to contain the vdso code is 2.6.29 which makes this the correct version.
--- arch/s390/include/asm/vdso.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/include/asm/vdso.h +1 -1
@@ -7,7 +7,7 @@#define VDSO32_LBASE 0#define VDSO64_LBASE 0 -#define VDSO_VERSION_STRING LINUX_2.6.26 +#define VDSO_VERSION_STRING LINUX_2.6.29#ifndef __ASSEMBLY__
PATCH 33/115 fix medium error problems with some arrays which can cause data corruption
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: James Bottomley <[email protected]>
commit a8733c7baf457b071528e385a0b7d4aaec79287c upstream.
Our current handling of medium error assumes that data is returned up to the bad sector. This assumption holds good for all disk devices, all DIF arrays and most ordinary arrays. However, an LSI array engine was recently discovered which reports a medium error without returning any data. This means that when we report good data up to the medium error, we've reported junk originally in the buffer as good. Worse, if the read consists of requested data plus a readahead, and the error occurs in readahead, we'll just strip off the readahead and report junk up to userspace as good data with no error.
The fix for this is to have the error position computation take into account the amount of data returned by the driver using the scsi residual data. Unfortunately, not every driver fills in this data, but for those who don't, it's set to zero, which means we'll think a full set of data was transferred and the behaviour will be identical to the prior behaviour of the code (believe the buffer up to the error sector). All modern drivers seem to set the residual, so that should fix up the LSI failure/corruption case.
--- drivers/scsi/sd.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/scsi/sd.c +8 -1
@@ -1040,6 +1040,12 @@ static unsigned int sd_completed_bytes(su64 end_lba =blk_rq_pos (scmd->request) + (scsi_bufflen (scmd) /512 );u64 bad_lba;int info_valid; +/* +* resid is optional but mostly filled in. When it's unused, +* its value is zero, so we assume the whole buffer transferred +*/ +unsigned int transferred =scsi_bufflen (scmd) -scsi_get_resid (scmd); +unsigned int good_bytes;if (!blk_fs_request (scmd->request))return 0 ;
@@ -1073,7 +1079,8 @@ static unsigned int sd_completed_bytes(s/* This computation should always be done in terms of * the resolution of the device's medium. */ -return (bad_lba - start_lba) * scmd->device->sector_size; + good_bytes = (bad_lba - start_lba) * scmd->device->sector_size; +return min (good_bytes, transferred); }/**
PATCH 34/115 libsas: fix runaway error handler problem
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: James Bottomley <[email protected]>
commit 9ee91f7fb550a4c82f82d9818e42493484c754af upstream.
libsas makes use of scsi_schedule_eh() but forgets to clear the host_eh_scheduled flag in its error handling routine. Because of this, the error handler thread never gets to sleep; it's constantly awake and trying to run the error routine leading to console spew and inability to run anything else (at least on a UP system). The fix is to clear the flag as we splice the work queue.
--- drivers/scsi/libsas/sas_scsi_host.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/libsas/sas_scsi_host.c +1 -0
@@ -648,6 +648,7 @@ void sas_scsi_recover_host(struct Scsi_Hspin_lock_irqsave (shost->host_lock, flags);list_splice_init (&shost->eh_cmd_q, &eh_work_q); + shost->host_eh_scheduled =0 ;spin_unlock_irqrestore (shost->host_lock, flags);SAS_DPRINTK ("Enter %s\n" , __func__);
PATCH 35/115 mpt2sas: Fix device removal handshake for zoned devices
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Kashyap, Desai <[email protected]>
commit 4dc2757a2e9a9d1f2faee4fc6119276fc0061c16 upstream.
When zoning end devices, the driver is not sending device removal handshake alogrithm to firmware. This results in controller firmware not sending sas topology add events the next time the device is added. The fix is the driver should be doing the device removal handshake even though the PHYSTATUS_VACANT bit is set in the PhyStatus of the event data. The current design is avoiding the handshake when the VACANT bit is set in the phy status.
--- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 3 --- 1 file changed, 3 deletions(-)
drivers/scsi/mpt2sas/mpt2sas_scsih.c +0 -3
@@ -2585,9 +2585,6 @@ _scsih_check_topo_delete_events(struct Mu16 handle;for (i =0 ; i < event_data->NumEntries; i++) { -if (event_data->PHY[i].PhyStatus & -MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT ) -continue ; handle =le16_to_cpu (event_data->PHY[i].AttachedDevHandle);if (!handle)continue ;
PATCH 36/115 mpt2sas: Correct resizing calculation for max_queue_depth
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Kashyap, Desai <[email protected]>
commit 11e1b961ab067ee3acaf723531da4d3f23e1d6f7 upstream.
The ioc->hba_queue_depth is not properly resized when the controller firmware reports that it supports more outstanding IO than what can be fit inside the reply descriptor pool depth. This is reproduced by setting the controller global credits larger than 30,000. The bug results in an incorrect sizing of the queues. The fix is to resize the queue_size by dividing queue_diff by two.
--- drivers/scsi/mpt2sas/mpt2sas_base.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/scsi/mpt2sas/mpt2sas_base.c +3 -3
@@ -1947,9 +1947,9 @@ _base_allocate_memory_pools(struct MPT2S/* adjust hba_queue_depth, reply_free_queue_depth, * and queue_size */ - ioc->hba_queue_depth -= queue_diff; - ioc->reply_free_queue_depth -= queue_diff; - queue_size -= queue_diff; + ioc->hba_queue_depth -= (queue_diff /2 ); + ioc->reply_free_queue_depth -= (queue_diff /2 ); + queue_size = facts->MaxReplyDescriptorPostQueueDepth; } ioc->reply_post_queue_depth = queue_size;
PATCH 37/115 mpt2sas: Kernel Panic during Large Topology discovery
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Kashyap, Desai <[email protected]>
commit 4224489f45b503f0a1f1cf310f76dc108f45689a upstream.
There was a configuration page timing out during the initial port enable at driver load time. The port enable would fail, and this would result in the driver unloading itself, meanwhile the driver was accessing freed memory in another context resulting in the panic. The fix is to prevent access to freed memory once the driver had issued the diag reset which woke up the sleeping port enable process. The routine _base_reset_handler was reorganized so the last sleeping process woken up was the port_enable.
--- drivers/scsi/mpt2sas/mpt2sas_base.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/scsi/mpt2sas/mpt2sas_base.c +11 -2
@@ -3595,6 +3595,8 @@ mpt2sas_base_detach(struct MPT2SAS_ADAPTstatic void _base_reset_handler (struct MPT2SAS_ADAPTER *ioc,int reset_phase) { +mpt2sas_scsih_reset_handler (ioc, reset_phase); +mpt2sas_ctl_reset_handler (ioc, reset_phase);switch (reset_phase) {case MPT2_IOC_PRE_RESET : dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
@@ -3625,8 +3627,6 @@ _base_reset_handler(struct MPT2SAS_ADAPT "MPT2_IOC_DONE_RESET\n", ioc->name, __func__));break ; } -mpt2sas_scsih_reset_handler (ioc, reset_phase); -mpt2sas_ctl_reset_handler (ioc, reset_phase); }/**
@@ -3680,6 +3680,7 @@ mpt2sas_base_hard_reset_handler(struct M {int r;unsigned long flags; +u8 pe_complete = ioc->wait_for_port_enable_to_complete;dtmprintk (ioc,printk (MPT2SAS_DEBUG_FMT "%s: enter\n" , ioc->name, __func__));
@@ -3701,6 +3702,14 @@ mpt2sas_base_hard_reset_handler(struct Mif (r) goto out;_base_reset_handler (ioc,MPT2_IOC_AFTER_RESET ); + +/* If this hard reset is called while port enable is active, then +* there is no reason to call make_ioc_operational +*/ +if (pe_complete) { + r = -EFAULT ; + goto out; + } r =_base_make_ioc_operational (ioc, sleep_flag);if (!r)_base_reset_handler (ioc,MPT2_IOC_DONE_RESET );
PATCH 38/115 radio-aimslab.c: Fix gcc 4.5+ bug
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
commit e3c92215198cb6aa00ad38db2780faa6b72e0a3f upstream.
gcc 4.5+ doesn't properly evaluate some inlined expressions. A previous patch were proposed by Andrew Morton using noinline. However, the entire inlined function is bogus, so let's just remove it and be happy.
--- drivers/media/radio/radio-aimslab.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-)
drivers/media/radio/radio-aimslab.c +6 -17
@@ -31,7 +31,6 @@#include <linux/module.h> /* Modules */ #include <linux/init.h> /* Initdata */ #include <linux/ioport.h> /* request_region */ -#include <linux/delay.h> /* udelay */ #include <linux/videodev2.h> /* kernel radio structs */ #include <linux/version.h> /* for KERNEL_VERSION MACRO */ #include <linux/io.h> /* outb, outb_p */
@@ -71,27 +70,17 @@ static struct rtrack rtrack_card;/* local things */ -static void sleep_delay (long n) -{ -/* Sleep nicely for 'n' uS */ -int d = n /msecs_to_jiffies (1000 ); -if (!d) -udelay (n); -else -msleep (jiffies_to_msecs (d)); -} -static void rt_decvol (struct rtrack *rt) {outb (0x58 , rt->io);/* volume down + sigstr + on */ -sleep_delay (100000 ); +msleep (100 );outb (0xd8 , rt->io);/* volume steady + sigstr + on */ }static void rt_incvol (struct rtrack *rt) {outb (0x98 , rt->io);/* volume up + sigstr + on */ -sleep_delay (100000 ); +msleep (100 );outb (0xd8 , rt->io);/* volume steady + sigstr + on */ }
@@ -120,7 +109,7 @@ static int rt_setvol(struct rtrack *rt,if (vol ==0 ) {/* volume = 0 means mute the card */ outb (0x48 , rt->io);/* volume down but still "on" */ -sleep_delay (2000000 );/* make sure it's totally down */ +msleep (2000 );/* make sure it's totally down */ outb (0xd0 , rt->io);/* volume steady, off */ rt->curvol =0 ;/* track the volume state! */ mutex_unlock (&rt->lock);
@@ -155,7 +144,7 @@ static void send_0_byte(struct rtrack *routb_p (128 +64 +16 +8 +1 , rt->io);/* on + wr-enable + data low */ outb_p (128 +64 +16 +8 +2 +1 , rt->io);/* clock */ } -sleep_delay (1000 ); +msleep (1 ); }static void send_1_byte (struct rtrack *rt)
@@ -169,7 +158,7 @@ static void send_1_byte(struct rtrack *routb_p (128 +64 +16 +8 +4 +2 +1 , rt->io);/* clock */ } -sleep_delay (1000 ); +msleep (1 ); }static int rt_setfreq (struct rtrack *rt,unsigned long freq)
@@ -423,7 +412,7 @@ static int __init rtrack_init(void)/* this ensures that the volume is all the way down */ outb (0x48 , rt->io);/* volume down but still "on" */ -sleep_delay (2000000 );/* make sure it's totally down */ +msleep (2000 );/* make sure it's totally down */ outb (0xc0 , rt->io);/* steady volume, mute card */ return 0 ;
PATCH 39/115 em28xx: Fix audio input for Terratec Grabby
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
commit a3fa904ec79b94f0db7faed010ff94d42f7d1d47 upstream.
The audio input line was wrong. Fix it.
--- drivers/media/video/em28xx/em28xx-cards.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/media/video/em28xx/em28xx-cards.c +2 -2
@@ -1525,11 +1525,11 @@ struct em28xx_board em28xx_boards[] = { .input = { { .type = EM28XX_VMUX_COMPOSITE1, .vmux = SAA7115_COMPOSITE0, - .amux = EM28XX_AMUX_VIDEO2, + .amux = EM28XX_AMUX_LINE_IN, }, { .type = EM28XX_VMUX_SVIDEO, .vmux = SAA7115_SVIDEO3, - .amux = EM28XX_AMUX_VIDEO2, + .amux = EM28XX_AMUX_LINE_IN, } }, }, [EM2860_BOARD_TERRATEC_AV350] = {
PATCH 40/115 ALSA : au88x0 - Limit number of channels to fix Oops via OSS emu
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Raymond Yau <[email protected]>
commit d9ab344336f74c012f6643ed3d1ad8ca0136de3b upstream.
Fix playback/capture channels patch to change supported playback channels of au8830 to 1,2,4 and capture channels to 1,2. This prevent oops when oss emulation use SNDCTL_DSP_CHANNELS to set 3 Channels
--- sound/pci/au88x0/au88x0_pcm.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
sound/pci/au88x0/au88x0_pcm.c +20 -4
@@ -42,11 +42,7 @@ static struct snd_pcm_hardware snd_vorte .rate_min = 5000, .rate_max = 48000, .channels_min = 1, -#ifdef CHIP_AU8830 - .channels_max = 4, -#else .channels_max = 2, -#endif .buffer_bytes_max = 0x10000, .period_bytes_min = 0x1, .period_bytes_max = 0x1000,
@@ -115,6 +111,17 @@ static struct snd_pcm_hardware snd_vorte .periods_max = 64, };#endif +#ifdef CHIP_AU8830 +static unsigned int au8830_channels[3 ] = { +1 ,2 ,4 , +}; + +static struct snd_pcm_hw_constraint_list hw_constraints_au8830_channels = { + .count =ARRAY_SIZE (au8830_channels), + .list = au8830_channels, + .mask =0 , +}; +#endif /* open callback */ static int snd_vortex_pcm_open (struct snd_pcm_substream *substream) {
@@ -156,6 +163,15 @@ static int snd_vortex_pcm_open(struct snif (VORTEX_PCM_TYPE (substream->pcm) ==VORTEX_PCM_ADB ||VORTEX_PCM_TYPE (substream->pcm) ==VORTEX_PCM_I2S ) runtime->hw = snd_vortex_playback_hw_adb; +#ifdef CHIP_AU8830 +if (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK && +VORTEX_PCM_TYPE (substream->pcm) ==VORTEX_PCM_ADB ) { + runtime->hw.channels_max =4 ; +snd_pcm_hw_constraint_list (runtime,0 , +SNDRV_PCM_HW_PARAM_CHANNELS , + &hw_constraints_au8830_channels); + } +#endif substream->runtime->private_data =NULL ; }#ifndef CHIP_AU8810
PATCH 41/115 ALSA: HDA: Fix dmesg output of HDMI supported bits
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: David Henningsson <[email protected]>
commit d757534ed15387202e322854cd72dc58bbb975de upstream.
This typo caused the dmesg output of the supported bits of HDMI to be cut off early.
--- sound/pci/hda/hda_eld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/hda_eld.c +1 -1
@@ -383,7 +383,7 @@ static void hdmi_show_short_audio_desc(ssnd_print_pcm_rates (a->rates, buf,sizeof (buf));if (a->format ==AUDIO_CODING_TYPE_LPCM ) -snd_print_pcm_bits (a->sample_bits, buf2 +8 ,sizeof (buf2 -8 )); +snd_print_pcm_bits (a->sample_bits, buf2 +8 ,sizeof (buf2) -8 );else if (a->max_bitrate)snprintf (buf2,sizeof (buf2),", max bitrate = %d" , a->max_bitrate);
PATCH 42/115 ALSA: hda - Fix memory leaks in conexant jack arrays
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Takashi Iwai <[email protected]>
commit 70f7db11c45a313b23922cacf248c613c3b2144c upstream.
The Conexant codec driver adds the jack arrays in init callback which may be called also in each PM resume. This results in the addition of new jack element at each time.
The fix is to check whether the requested jack is already present in the array.
Reference: Novell bug 668929
https://bugzilla.novell.com/show_bug.cgi?id=668929
--- sound/pci/hda/patch_conexant.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
sound/pci/hda/patch_conexant.c +7 -1
@@ -366,10 +366,16 @@ static int conexant_add_jack(struct hda_struct conexant_spec *spec;struct conexant_jack *jack;const char *name; -int err; +int i, err; spec = codec->spec;snd_array_init (&spec->jacks,sizeof (*jack),32 ); + + jack = spec->jacks.list; +for (i =0 ; i < spec->jacks.used; i++, jack++) +if (jack->nid == nid) +return 0 ;/* already present */ + jack =snd_array_new (&spec->jacks); name = (type ==SND_JACK_HEADPHONE ) ?"Headphone" :"Mic" ;
PATCH 43/115 Input: i8042 - introduce notimeout blacklist for Dell Vostro V13
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Jiri Kosina <[email protected]>
commit f8313ef1f448006207f12c107123522c8bc00f15 upstream.
i8042 controller present in Dell Vostro V13 errorneously signals spurious timeouts.
Introduce i8042.notimeout parameter for ignoring i8042-signalled timeouts and apply this quirk automatically for Dell Vostro V13, based on DMI match.
In addition to that, this machine also needs to be added to nomux blacklist.
--- Documentation/kernel-parameters.txt | 1 + drivers/input/serio/i8042-x86ia64io.h | 21 +++++++++++++++++++++ drivers/input/serio/i8042.c | 6 +++++- 3 files changed, 27 insertions(+), 1 deletion(-)
Documentation/kernel-parameters.txt +1 -0
@@ -878,6 +878,7 @@ and is between 256 and 4096 characters. i8042.panicblink= [HW] Frequency with which keyboard LEDs should blink when kernel panics (default is 0.5 sec) + i8042.notimeout [HW] Ignore timeout condition signalled by conroller i8042.reset [HW] Reset the controller during init and cleanup i8042.unlock [HW] Unlock (ignore) the keylock
drivers/input/serio/i8042-x86ia64io.h +21 -0
@@ -416,6 +416,13 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), }, }, + { + /* Dell Vostro V13 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), + }, + }, { } };
@@ -537,6 +544,17 @@ static const struct dmi_system_id __init };#endif +static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { + { +/* Dell Vostro V13 */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro V13" ), + }, + }, + { } +}; +/* * Some Wistron based laptops need us to explicitly enable the 'Dritek * keyboard extension' to make their extra keys start generating scancodes.
@@ -866,6 +884,9 @@ static int __init i8042_platform_init(voif (dmi_check_system (i8042_dmi_nomux_table)) i8042_nomux = true; +if (dmi_check_system (i8042_dmi_notimeout_table)) + i8042_notimeout = true; +if (dmi_check_system (i8042_dmi_dritek_table)) i8042_dritek = true;#endif /* CONFIG_X86 */
drivers/input/serio/i8042.c +5 -1
@@ -64,6 +64,10 @@ static unsigned int i8042_blink_frequencmodule_param_named (panicblink, i8042_blink_frequency, uint,0600 );MODULE_PARM_DESC (panicblink,"Frequency with which keyboard LEDs should blink when kernel panics" ); +static bool i8042_notimeout; +module_param_named (notimeout, i8042_notimeout, bool,0 ); +MODULE_PARM_DESC (notimeout,"Ignore timeouts signalled by i8042" ); +#ifdef CONFIG_X86 static bool i8042_dritek;module_param_named (dritek, i8042_dritek, bool,0 );
@@ -434,7 +438,7 @@ static irqreturn_t i8042_interrupt(int i }else { dfl = ((str &I8042_STR_PARITY ) ?SERIO_PARITY :0 ) | - ((str &I8042_STR_TIMEOUT ) ?SERIO_TIMEOUT :0 ); + ((str &I8042_STR_TIMEOUT && !i8042_notimeout) ?SERIO_TIMEOUT :0 ); port_no = (str &I8042_STR_AUXDATA ) ?I8042_AUX_PORT_NO :I8042_KBD_PORT_NO ;
PATCH 44/115 input: bcm5974: Add support for MacBookAir3
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Edgar (gimli) Hucek <[email protected]>
commit 6021afcf19d8c6f5db6d11cadcfb6a22d0c28a48 upstream.
This patch adds support for the MacBookAir3,1 and MacBookAir3,2 models.
--- drivers/input/mouse/bcm5974.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
drivers/input/mouse/bcm5974.c +40 -0
@@ -55,6 +55,14 @@#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 +/* MacbookAir3,2 (unibody), aka wellspring5 */ +#define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f +#define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240 +#define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241 +/* MacbookAir3,1 (unibody), aka wellspring4 */ +#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242 +#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243 +#define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244#define BCM5974_DEVICE (prod) { \ .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \
@@ -80,6 +88,14 @@ static const struct usb_device_id bcm597BCM5974_DEVICE (USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI ),BCM5974_DEVICE (USB_DEVICE_ID_APPLE_WELLSPRING3_ISO ),BCM5974_DEVICE (USB_DEVICE_ID_APPLE_WELLSPRING3_JIS ), +/* MacbookAir3,2 */ +BCM5974_DEVICE (USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI ), +BCM5974_DEVICE (USB_DEVICE_ID_APPLE_WELLSPRING4_ISO ), +BCM5974_DEVICE (USB_DEVICE_ID_APPLE_WELLSPRING4_JIS ), +/* MacbookAir3,1 */ +BCM5974_DEVICE (USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI ), +BCM5974_DEVICE (USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO ), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS), /* Terminating entry */ {} };
@@ -233,6 +249,30 @@ static const struct bcm5974_config bcm59 { DIM_X, DIM_X / SN_COORD, -4460, 5166 }, { DIM_Y, DIM_Y / SN_COORD, -75, 6700 } }, + { +USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI , +USB_DEVICE_ID_APPLE_WELLSPRING4_ISO , +USB_DEVICE_ID_APPLE_WELLSPRING4_JIS , +HAS_INTEGRATED_BUTTON , +0x84 ,sizeof (struct bt_data ), +0x81 ,TYPE2 ,FINGER_TYPE2 ,FINGER_TYPE2 +SIZEOF_ALL_FINGERS , + { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 }, + { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 }, + { DIM_X, DIM_X / SN_COORD, -4620, 5140 }, + { DIM_Y, DIM_Y / SN_COORD, -150, 6600 } + }, + { +USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI , +USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO , +USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS , +HAS_INTEGRATED_BUTTON , +0x84 ,sizeof (struct bt_data ), +0x81 ,TYPE2 ,FINGER_TYPE2 ,FINGER_TYPE2 +SIZEOF_ALL_FINGERS , + { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 }, + { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 }, + { DIM_X, DIM_X / SN_COORD, -4616, 5112 }, + { DIM_Y, DIM_Y / SN_COORD, -142, 5234 } + }, {} };
PATCH 45/115 ALSA: hrtimer: handle delayed timer interrupts
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Clemens Ladisch <[email protected]>
commit b1d4f7f4bdcf9915c41ff8cfc4425c84dabb1fde upstream.
If a timer interrupt was delayed too much, hrtimer_forward_now() will forward the timer expiry more than once. When this happens, the additional number of elapsed ALSA timer ticks must be passed to snd_timer_interrupt() to prevent the ALSA timer from falling behind.
This mostly fixes MIDI slowdown problems on highly-loaded systems with badly behaved interrupt handlers.
--- sound/core/hrtimer.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/core/hrtimer.c +3 -2
@@ -44,12 +44,13 @@ static enum hrtimer_restart snd_hrtimer_ { struct snd_hrtimer *stime = container_of(hrt, struct snd_hrtimer, hrt);struct snd_timer *t = stime->timer; +unsigned long oruns;if (!atomic_read (&stime->running))return HRTIMER_NORESTART ; -hrtimer_forward_now (hrt,ns_to_ktime (t->sticks * resolution)); -snd_timer_interrupt (stime->timer, t->sticks); + oruns =hrtimer_forward_now (hrt,ns_to_ktime (t->sticks * resolution)); +snd_timer_interrupt (stime->timer, t->sticks * oruns);if (!atomic_read (&stime->running))return HRTIMER_NORESTART ;
PATCH 46/115 ASoC: WM8990: msleep() takes milliseconds not jiffies
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Dimitris Papastamos <[email protected]>
commit 7ebcf5d6021a696680ee77d9162a2edec2d671dd upstream.
--- sound/soc/codecs/wm8990.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
sound/soc/codecs/wm8990.c +5 -5
@@ -1185,7 +1185,7 @@ static int wm8990_set_bias_level(struct WM8990_VMIDTOG);/* Delay to allow output caps to discharge */ -msleep (msecs_to_jiffies (300 )); +msleep (300 );/* Disable VMIDTOG */ snd_soc_write(codec, WM8990_ANTIPOP2, WM8990_SOFTST |
@@ -1197,17 +1197,17 @@ static int wm8990_set_bias_level(struct/* Enable outputs */ snd_soc_write (codec,WM8990_POWER_MANAGEMENT_1 ,0x1b00 ); -msleep (msecs_to_jiffies (50 )); +msleep (50 );/* Enable VMID at 2x50k */ snd_soc_write (codec,WM8990_POWER_MANAGEMENT_1 ,0x1f02 ); -msleep (msecs_to_jiffies (100 )); +msleep (100 );/* Enable VREF */ snd_soc_write (codec,WM8990_POWER_MANAGEMENT_1 ,0x1f03 ); -msleep (msecs_to_jiffies (600 )); +msleep (600 );/* Enable BUFIOEN */ snd_soc_write(codec, WM8990_ANTIPOP2, WM8990_SOFTST |
@@ -1252,7 +1252,7 @@ static int wm8990_set_bias_level(struct/* Disable VMID */ snd_soc_write (codec,WM8990_POWER_MANAGEMENT_1 ,0x1f01 ); -msleep (msecs_to_jiffies (300 )); +msleep (300 );/* Enable all output discharge bits */ snd_soc_write(codec, WM8990_ANTIPOP1, WM8990_DIS_LLINE |
PATCH 47/115 ASoC: Blackfin AC97: fix build error after multi-component update
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Mike Frysinger <[email protected]>
commit e9c2048915048d605fd76539ddd96f00d593e1eb upstream.
We need to tweak how we query the active capture/playback state after the recent overhauls of common code.
--- sound/soc/blackfin/bf5xx-ac97.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/blackfin/bf5xx-ac97.c +2 -2
@@ -260,9 +260,9 @@ static int bf5xx_ac97_suspend(struct sndpr_debug ("%s : sport %d\n" , __func__, dai->id);if (!dai->active)return 0 ; -if (dai->capture.active) +if (dai->capture_active)sport_rx_stop (sport); -if (dai->playback.active) +if (dai->playback_active)sport_tx_stop (sport);return 0 ; }
PATCH 48/115 NFS: Fix "kernel BUG at fs/aio.c:554!"
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Chuck Lever <[email protected]>
commit 839f7ad6932d95f4d5ae7267b95c574714ff3d5b upstream.
Nick Piggin reports:
Quoted 16 lines
I'm getting use after frees in aio code in NFS
[ 2703.396766] Call Trace: [ 2703.396858] [<ffffffff8100b057>] ? native_sched_clock+0x27/0x80 [ 2703.396959] [<ffffffff8108509e>] ? put_lock_stats+0xe/0x40 [ 2703.397058] [<ffffffff81088348>] ? lock_release_holdtime+0xa8/0x140 [ 2703.397159] [<ffffffff8108a2a5>] lock_acquire+0x95/0x1b0 [ 2703.397260] [<ffffffff811627db>] ? aio_put_req+0x2b/0x60 [ 2703.397361] [<ffffffff81039701>] ? get_parent_ip+0x11/0x50 [ 2703.397464] [<ffffffff81612a31>] _raw_spin_lock_irq+0x41/0x80 [ 2703.397564] [<ffffffff811627db>] ? aio_put_req+0x2b/0x60 [ 2703.397662] [<ffffffff811627db>] aio_put_req+0x2b/0x60 [ 2703.397761] [<ffffffff811647fe>] do_io_submit+0x2be/0x7c0 [ 2703.397895] [<ffffffff81164d0b>] sys_io_submit+0xb/0x10 [ 2703.397995] [<ffffffff8100307b>] system_call_fastpath+0x16/0x1b
Quoted 3 lines
Adding some tracing, it is due to nfs completing the request then returning something other than
-EIOCBQUEUED, soaio.calso completes the request.
To address this, prevent the NFS direct I/O engine from completing async iocbs when the forward path returns an error without starting any I/O.
This fix appears to survive ^C during both "xfstest no. 208" and "fsx -Z."
It's likely this bug has existed for a very long while, as we are seeing very similar symptoms in OEL 5. Copying stable.
--- fs/nfs/direct.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-)
fs/nfs/direct.c +20 -14
@@ -401,15 +401,18 @@ static ssize_t nfs_direct_read_schedule_ pos += vec->iov_len; } +/* +* If no bytes were started, return the error, and let the +* generic layer handle the completion. +*/ +if (requested_bytes ==0 ) { +nfs_direct_req_release (dreq); +return result <0 ? result : -EIO ; + } +if (put_dreq (dreq))nfs_direct_complete (dreq); - -if (requested_bytes !=0 ) -return 0 ; - -if (result <0 ) -return result; -return -EIO ; +return 0 ; } static ssize_t nfs_direct_read(struct kiocb *iocb, const struct iovec *iov,
@@ -829,15 +832,18 @@ static ssize_t nfs_direct_write_schedule pos += vec->iov_len; } +/* +* If no bytes were started, return the error, and let the +* generic layer handle the completion. +*/ +if (requested_bytes ==0 ) { +nfs_direct_req_release (dreq); +return result <0 ? result : -EIO ; + } +if (put_dreq (dreq))nfs_direct_write_complete (dreq, dreq->inode); - -if (requested_bytes !=0 ) -return 0 ; - -if (result <0 ) -return result; -return -EIO ; +return 0 ; } static ssize_t nfs_direct_write(struct kiocb *iocb, const struct iovec *iov,
PATCH 49/115 rtc-cmos: fix suspend/resume
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Paul Fox <[email protected]>
commit 2fb08e6ca9f00d1aedb3964983e9c8f84b36b807 upstream.
rtc-cmos was setting suspend/resume hooks at the device_driver level. However, the platform bus code (drivers/base/platform.c) only looks for resume hooks at the dev_pm_ops level, or within the platform_driver.
Switch rtc_cmos to use dev_pm_ops so that suspend/resume code is executed again.
Paul said:
: The user visible symptom in our (XO laptop) case was that rtcwake would : fail to wake the laptop. The RTC alarm would expire, but the wakeup : wasn't unmasked.
:
: As for severity, the impact may have been reduced because if I recall : correctly, the bug only affected platforms with CONFIG_PNP disabled.
--- drivers/rtc/rtc-cmos.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
drivers/rtc/rtc-cmos.c +9 -7
@@ -36,6 +36,7 @@#include <linux/platform_device.h> #include <linux/mod_devicetable.h> #include <linux/log2.h> +#include <linux/pm.h> /* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */ #include <asm-generic/rtc.h>
@@ -855,7 +856,7 @@ static void __exit cmos_do_remove(struct#ifdef CONFIG_PM -static int cmos_suspend (struct device *dev,pm_message_t mesg) +static int cmos_suspend (struct device *dev) {struct cmos_rtc *cmos =dev_get_drvdata (dev);unsigned char tmp;
@@ -902,7 +903,7 @@ static int cmos_suspend(struct device *d*/ static inline int cmos_poweroff (struct device *dev) { -return cmos_suspend (dev,PMSG_HIBERNATE ); +return cmos_suspend (dev); }static int cmos_resume (struct device *dev)
@@ -949,9 +950,9 @@ static int cmos_resume(struct device *dereturn 0 ; } +static SIMPLE_DEV_PM_OPS(cmos_pm_ops, cmos_suspend, cmos_resume); +#else -#define cmos_suspend NULL -#define cmos_resume NULLstatic inline int cmos_poweroff (struct device *dev) {
@@ -1087,7 +1088,7 @@ static void __exit cmos_pnp_remove(strucstatic int cmos_pnp_suspend (struct pnp_dev *pnp,pm_message_t mesg) { -return cmos_suspend (&pnp->dev, mesg); +return cmos_suspend (&pnp->dev); }static int cmos_pnp_resume (struct pnp_dev *pnp)
@@ -1167,8 +1168,9 @@ static struct platform_driver cmos_platf .shutdown = cmos_platform_shutdown, .driver = { .name = (char *) driver_name, - .suspend = cmos_suspend, - .resume = cmos_resume, +#ifdef CONFIG_PM + .pm = &cmos_pm_ops, +#endif } };
PATCH 50/115 iwlagn: Re-enable RF_KILL interrupt when down
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Don Fry <[email protected]>
commit 3dd823e6b86407aed1a025041d8f1df77e43a9c8 upstream.
With commit 554d1d027b19265c4aa3f718b3126d2b86e09a08 only one RF_KILL interrupt will be seen by the driver when the interface is down.
Re-enable the interrupt when it occurs to see all transitions.
--- drivers/net/wireless/iwlwifi/iwl-agn.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/wireless/iwlwifi/iwl-agn.c +6 -0
@@ -1044,6 +1044,9 @@ static void iwl_irq_tasklet_legacy(struc/* only Re-enable if diabled by irq */ if (test_bit (STATUS_INT_ENABLED , &priv->status))iwl_enable_interrupts (priv); +/* Re-enable RF_KILL if it occurred */ +else if (handled &CSR_INT_BIT_RF_KILL ) +iwl_enable_rfkill_int (priv);#ifdef CONFIG_IWLWIFI_DEBUG if (iwl_get_debug_level (priv) & (IWL_DL_ISR )) {
@@ -1245,6 +1248,9 @@ static void iwl_irq_tasklet(struct iwl_p/* only Re-enable if diabled by irq */ if (test_bit (STATUS_INT_ENABLED , &priv->status))iwl_enable_interrupts (priv); +/* Re-enable RF_KILL if it occurred */ +else if (handled &CSR_INT_BIT_RF_KILL ) +iwl_enable_rfkill_int (priv);spin_unlock_irqrestore (&priv->lock, flags);
PATCH 51/115 rapidio: fix hang on RapidIO doorbell queue full condition
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Thomas Taranowski <[email protected]>
commit 12a4dc43911785f51a596f771ae0701b18d436f1 upstream.
In fsl_rio_dbell_handler() the code currently simply acknowledges the QFI queue full interrupt, but does nothing to resolve the queue full condition. Instead, it jumps to the end of the isr. When a queue full condition occurs, the isr is then re-entered immediately and continually, forever.
The fix is to just fall through and read out current doorbell entries.
--- arch/powerpc/sysdev/fsl_rio.c | 1 - 1 file changed, 1 deletion(-)
arch/powerpc/sysdev/fsl_rio.c +0 -1
@@ -832,7 +832,6 @@ fsl_rio_dbell_handler(int irq, void *devif (dsr &DOORBELL_DSR_QFI ) {pr_info ("RIO: doorbell queue full\n" );out_be32 (&priv->msg_regs->dsr,DOORBELL_DSR_QFI ); - goto out; }/* XXX Need to check/dispatch until queue empty */
PATCH 52/115 PCI: pci-stub: ignore zero-length id parameters
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Tejun Heo <[email protected]>
commit 99a0fadf561e1f553c08f0a29f8b2578f55dd5f0 upstream.
pci-stub uses strsep() to separate list of ids and generates a warning message when it fails to parse an id. However, not specifying the parameter results in ids set to an empty string. strsep() happily returns the empty string as the first token and thus triggers the warning message spuriously.
Make the tokner ignore zero length ids.
--- drivers/pci/pci-stub.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/pci/pci-stub.c +3 -0
@@ -54,6 +54,9 @@ static int __init pci_stub_init(void) subdevice =PCI_ANY_ID , class=0 , class_mask=0 ;int fields; +if (!strlen (id)) +continue ; + fields =sscanf (id,"%x:%x:%x:%x:%x:%x" , &vendor, &device, &subvendor, &subdevice, &class, &class_mask);
PATCH 53/115 virtio: remove virtio-pci root device
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Milton Miller <[email protected]>
commit 8b3bb3ecf1934ac4a7005ad9017de1127e2fbd2f upstream.
We sometimes need to map between the virtio device and the given pci device. One such use is OS installer that gets the boot pci device from BIOS and needs to find the relevant block device. Since it can't, installation fails.
Instead of creating a top-level devices/virtio-pci directory, create each device under the corresponding pci device node. Symlinks to all virtio-pci devices can be found under the pci driver link in bus/pci/drivers/virtio-pci/devices, and all virtio devices under drivers/bus/virtio/devices.
--- drivers/virtio/virtio_pci.c | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-)
drivers/virtio/virtio_pci.c +2 -18
@@ -95,11 +95,6 @@ static struct pci_device_id virtio_pci_iMODULE_DEVICE_TABLE (pci, virtio_pci_id_table); -/* A PCI device has it's own struct device and so does a virtio device so -* we create a place for the virtio devices to show up in sysfs. I think it -* would make more sense for virtio to not insist on having it's own device. */ -static struct device *virtio_pci_root; -/* Convert a generic virtio device to our structure */ static struct virtio_pci_device *to_vp_device (struct virtio_device *vdev) {
@@ -628,7 +623,7 @@ static int __devinit virtio_pci_probe(stif (vp_dev ==NULL )return -ENOMEM ; - vp_dev->vdev.dev.parent = virtio_pci_root; + vp_dev->vdev.dev.parent = &pci_dev->dev; vp_dev->vdev.dev.release = virtio_pci_release_dev; vp_dev->vdev.config = &virtio_pci_config_ops; vp_dev->pci_dev = pci_dev;
@@ -715,17 +710,7 @@ static struct pci_driver virtio_pci_drivstatic int __init virtio_pci_init (void ) { -int err; - - virtio_pci_root =root_device_register ("virtio-pci" ); -if (IS_ERR (virtio_pci_root)) -return PTR_ERR (virtio_pci_root); - - err =pci_register_driver (&virtio_pci_driver); -if (err) -root_device_unregister (virtio_pci_root); - -return err; +return pci_register_driver (&virtio_pci_driver); }module_init (virtio_pci_init);
@@ -733,7 +718,6 @@ module_init(virtio_pci_init); static void __exit virtio_pci_exit(void) {pci_unregister_driver (&virtio_pci_driver); -root_device_unregister (virtio_pci_root); }module_exit (virtio_pci_exit);
PATCH 54/115 ds2760_battery: Fix calculation of time_to_empty_now
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Sven Neumann <[email protected]>
commit 86af95039b69a90db15294eb1f9c147f1df0a8ea upstream.
A check against division by zero was modified in commit b0525b48. Since this change time_to_empty_now is always reported as zero while the battery is discharging and as a negative value while the battery is charging. This is because current is negative while the battery is discharging.
Fix the check introduced by commit b0525b48 so that time_to_empty_now is reported correctly during discharge and as zero while charging.
--- drivers/power/ds2760_battery.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/power/ds2760_battery.c +1 -1
@@ -211,7 +211,7 @@ static int ds2760_battery_read_status(stif (di->rem_capacity >100 ) di->rem_capacity =100 ; -if (di->current_uA >=100L ) +if (di->current_uA <-100L ) di->life_sec = -((di->accum_current_uAh - di->empty_uAh) *36L ) / (di->current_uA /100L );else
PATCH 55/115 p54: fix sequence no. accounting off-by-one error
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Christian Lamparter <[email protected]>
commit 3b5c5827d1f80ad8ae844a8b1183f59ddb90fe25 upstream.
P54_HDR_FLAG_DATA_OUT_SEQNR is meant to tell the
firmware that "the frame's sequence number has
already been set by the application."
Whereas IEEE80211_TX_CTL_ASSIGN_SEQ is set for
frames which lack a valid sequence number and
either the driver or firmware has to assign one.
Yup, it's the exact opposite!
--- drivers/net/wireless/p54/txrx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/p54/txrx.c +1 -1
@@ -617,7 +617,7 @@ static void p54_tx_80211_header(struct pelse *burst_possible = false; -if (info->flags &IEEE80211_TX_CTL_ASSIGN_SEQ ) +if (!(info->flags &IEEE80211_TX_CTL_ASSIGN_SEQ )) *flags |=P54_HDR_FLAG_DATA_OUT_SEQNR ;if (info->flags &IEEE80211_TX_CTL_PSPOLL_RESPONSE )
PATCH 56/115 i2c: Unregister dummy devices last on adapter removal
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Jean Delvare <[email protected]>
commit 5219bf884b6e2b54e734ca1799b6f0014bb2b4b7 upstream.
Remove real devices first and dummy devices last. This gives device driver which instantiated dummy devices themselves a chance to clean them up before we do.
--- drivers/i2c/i2c-core.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
drivers/i2c/i2c-core.c +13 -1
@@ -745,6 +745,14 @@ static int i2c_do_del_adapter(struct devstatic int __unregister_client (struct device *dev,void *dummy) {struct i2c_client *client =i2c_verify_client (dev); +if (client &&strcmp (client->name,"dummy" )) +i2c_unregister_device (client); +return 0 ; +} + +static int __unregister_dummy (struct device *dev,void *dummy) +{ +struct i2c_client *client =i2c_verify_client (dev);if (client)i2c_unregister_device (client);return 0 ;
@@ -793,8 +801,12 @@ int i2c_del_adapter(struct i2c_adapter * }/* Detach any active clients. This can't fail, thus we do not -checking the returned value. */ +* check the returned value. This is a two-pass process, because +* we can't remove the dummy devices during the first pass: they +* could have been instantiated by real devices wishing to clean +* them up properly, so we give them a chance to do that first. */ res =device_for_each_child (&adap->dev,NULL , __unregister_client); + res =device_for_each_child (&adap->dev,NULL , __unregister_dummy);#ifdef CONFIG_I2C_COMPAT class_compat_remove_link(i2c_adapter_compat_class, &adap->dev,
PATCH 57/115 serial: unbreak billionton CF card
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Pavel Machek <[email protected]>
commit d0694e2aeb815042aa0f3e5036728b3db4446f1d upstream.
Unbreak Billionton CF bluetooth card. This actually fixes a regression on zaurus.
--- drivers/serial/8250.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/serial/8250.c +2 -1
@@ -255,7 +255,8 @@ static const struct serial8250_config ua .fifo_size = 128, .tx_loadsz = 128, .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, - .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, +/* UART_CAP_EFR breaks billionon CF bluetooth card. */ + .flags = UART_CAP_FIFO | UART_CAP_SLEEP, }, [PORT_RSA] = { .name = "RSA",
PATCH 58/115 ptrace: use safer wake up on ptrace_detach()
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Tejun Heo <[email protected]>
commit 01e05e9a90b8f4c3997ae0537e87720eb475e532 upstream.
The wake_up_process() call in ptrace_detach() is spurious and not interlocked with the tracee state. IOW, the tracee could be running or sleeping in any place in the kernel by the time wake_up_process() is called. This can lead to the tracee waking up unexpectedly which can be dangerous.
The wake_up is spurious and should be removed but for now reduce its toxicity by only waking up if the tracee is in TRACED or STOPPED state.
This bug can possibly be used as an attack vector. I don't think it will take too much effort to come up with an attack which triggers oops somewhere. Most sleeps are wrapped in condition test loops and should be safe but we have quite a number of places where sleep and wakeup conditions are expected to be interlocked. Although the window of opportunity is tiny, ptrace can be used by non-privileged users and with some loading the window can definitely be extended and exploited.
--- kernel/ptrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/ptrace.c +1 -1
@@ -314,7 +314,7 @@ int ptrace_detach(struct task_struct *ch child->exit_code = data; dead =__ptrace_detach (current, child);if (!child->exit_state) -wake_up_process (child); +wake_up_state (child,TASK_TRACED |TASK_STOPPED ); }write_unlock_irq (&tasklist_lock);
PATCH 59/115 x86, mtrr: Avoid MTRR reprogramming on BP during boot on UP platforms
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Suresh Siddha <[email protected]>
commit f7448548a9f32db38f243ccd4271617758ddfe2c upstream.
Markus Kohn ran into a hard hang regression on an acer aspire 1310, when acpi is enabled. git bisect showed the following commit as the bad one that introduced the boot regression.
commit d0af9eed5aa91b6b7b5049cae69e5ea956fd85c3 Author: Suresh Siddha <[email protected]> Date: Wed Aug 19 18:05:36 2009 -0700 x86, pat/mtrr: Rendezvous all the cpus for MTRR/PAT init
Because of the UP configuration of that platform, native_smp_prepare_cpus() bailed out (in smp_sanity_check()) before doing the set_mtrr_aps_delayed_init()
Further down the boot path, native_smp_cpus_done() will call the delayed MTRR initialization for the AP's (mtrr_aps_init()) with mtrr_aps_delayed_init not set. This resulted in the boot processor reprogramming its MTRR's to the values seen during the start of the OS boot. While this is not needed ideally, this shouldn't have caused any side-effects. This is because the reprogramming of MTRR's (set_mtrr_state() that gets called via set_mtrr()) will check if the live register contents are different from what is being asked to write and will do the actual write only if they are different.
BP's mtrr state is read during the start of the OS boot and typically nothing would have changed when we ask to reprogram it on BP again because of the above scenario on an UP platform. So on a normal UP platform no reprogramming of BP MTRR MSR's happens and all is well.
However, on this platform, bios seems to be modifying the fixed mtrr range registers between the start of OS boot and when we double check the live registers for reprogramming BP MTRR registers. And as the live registers are modified, we end up reprogramming the MTRR's to the state seen during the start of the OS boot.
During ACPI initialization, something in the bios (probably smi handler?) don't like this fact and results in a hard lockup.
We didn't see this boot hang issue on this platform before the commit d0af9eed5aa91b6b7b5049cae69e5ea956fd85c3, because only the AP's (if any) will program its MTRR's to the value that BP had at the start of the OS boot.
Fix this issue by checking mtrr_aps_delayed_init before continuing further in the mtrr_aps_init(). Now, only AP's (if any) will program its MTRR's to the BP values during boot.
Addresses https://bugzilla.novell.com/show_bug.cgi?id=623393
[ By the way, this behavior of the bios modifying MTRR's after the start
of the OS boot is not common and the kernel is not prepared to handle this situation well. Irrespective of this issue, during suspend/resume, linux kernel will try to reprogram the BP's MTRR values to the values seen during the start of the OS boot. So suspend/resume might be already broken on this platform for all linux kernel versions. ]
LKML-Reference: <[email protected]>
--- arch/x86/kernel/cpu/mtrr/main.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
arch/x86/kernel/cpu/mtrr/main.c +9 -1
@@ -762,13 +762,21 @@ void set_mtrr_aps_delayed_init(void) }/* -* MTRR initialization for all AP's +* Delayed MTRR initialization for all AP's */ void mtrr_aps_init (void ) {if (!use_intel ())return ; +/* +* Check if someone has requested the delay of AP MTRR initialization, +* by doing set_mtrr_aps_delayed_init(), prior to this point. If not, +* then we are done. +*/ +if (!mtrr_aps_delayed_init) +return ; +set_mtrr (~0U ,0 ,0 ,0 ); mtrr_aps_delayed_init = false; }
PATCH 60/115 fix jiffy calculations in calibrate_delay_direct to handle overflow
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Tim Deegan <[email protected]>
commit 70a062286b9dfcbd24d2e11601aecfead5cf709a upstream.
Fixes a hang when booting as dom0 under Xen, when jiffies can be quite large by the time the kernel init gets this far.
--- init/calibrate.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
init/calibrate.c +3 -3
@@ -66,7 +66,7 @@ static unsigned long __cpuinit calibrate pre_start =0 ;read_current_timer (&start); start_jiffies = jiffies; -while (jiffies <= (start_jiffies +1 )) { +while (time_before_eq (jiffies, start_jiffies +1 )) { pre_start = start;read_current_timer (&start); }
@@ -74,8 +74,8 @@ static unsigned long __cpuinit calibrate pre_end =0 ; end = post_start; -while (jiffies <= - (start_jiffies +1 +DELAY_CALIBRATION_TICKS )) { +while (time_before_eq (jiffies, start_jiffies +1 + +DELAY_CALIBRATION_TICKS )) { pre_end = end;read_current_timer (&end); }
PATCH 61/115 USB: serial: pl2303: Hybrid reader Uniform HCR331
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Simone Contini <[email protected]>
commit 18344a1cd5889d48dac67229fcf024ed300030d5 upstream.
I tried a magnetic stripe reader
(http://www.kimaldi.com/kimaldi_eng/productos/lectores_de_tarjetas/lectores_tarjeta_chip_y_dni/lector_hibrido_uniform_hcr_331)
and I see that it is interfaced with a PL2303. I wrote a patch to use your driver which simply adds the product ID for the device and it seems working fine.
From: Simone Contini <[email protected]>
--- drivers/usb/serial/pl2303.c | 1 + drivers/usb/serial/pl2303.h | 1 + 2 files changed, 2 insertions(+)
drivers/usb/serial/pl2303.c +1 -0
@@ -59,6 +59,7 @@ static struct usb_device_id id_table [] { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) }, { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
drivers/usb/serial/pl2303.h +1 -0
@@ -20,6 +20,7 @@#define PL2303_PRODUCT_ID_ALDIGA 0x0611#define PL2303_PRODUCT_ID_MMX 0x0612#define PL2303_PRODUCT_ID_GPRS 0x0609 +#define PL2303_PRODUCT_ID_HCR331 0x331a#define ATEN_VENDOR_ID 0x0557#define ATEN_VENDOR_ID2 0x0547
PATCH 62/115 drivers: update to pl2303 usb-serial to support Motorola cables
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Dario Lombardo <[email protected]>
commit 96a3e79edff6f41b0f115a82f1a39d66218077a7 upstream.
Added 0x0307 device id to support Motorola cables to the pl2303 usb serial driver. This cable has a modified chip that is a pl2303, but declares itself as 0307. Fixed by adding the right device id to the supported devices list, assigning it the code labeled PL2303_PRODUCT_ID_MOTOROLA.
--- drivers/usb/serial/pl2303.c | 1 + drivers/usb/serial/pl2303.h | 1 + 2 files changed, 2 insertions(+)
drivers/usb/serial/pl2303.c +1 -0
@@ -60,6 +60,7 @@ static struct usb_device_id id_table [] { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) }, { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
drivers/usb/serial/pl2303.h +1 -0
@@ -21,6 +21,7 @@#define PL2303_PRODUCT_ID_MMX 0x0612#define PL2303_PRODUCT_ID_GPRS 0x0609#define PL2303_PRODUCT_ID_HCR331 0x331a +#define PL2303_PRODUCT_ID_MOTOROLA 0x0307#define ATEN_VENDOR_ID 0x0557#define ATEN_VENDOR_ID2 0x0547
PATCH 63/115 klist: Fix object alignment on 64-bit.
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: David Miller <[email protected]>
commit 795abaf1e4e188c4171e3cd3dbb11a9fcacaf505 upstream.
Commit c0e69a5bbc6f ("klist.c: bit 0 in pointer can't be used as flag") intended to make sure that all klist objects were at least pointer size aligned, but used the constant "4" which only works on 32-bit.
Use "sizeof(void *)" which is correct in all cases.
--- include/linux/klist.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/klist.h +1 -1
@@ -22,7 +22,7 @@ struct klist {struct list_head k_list;void (*get)(struct klist_node *);void (*put)(struct klist_node *); -} __attribute__ ((aligned (4))); +} __attribute__ ((aligned (sizeof(void *))));#define KLIST_INIT (_name, _get, _put) \ { .k_lock = __SPIN_LOCK_UNLOCKED(_name.k_lock), \
PATCH 64/115 powerpc: Fix some 6xx/7xxx CPU setup functions
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Benjamin Herrenschmidt <[email protected]>
commit 1f1936ff3febf38d582177ea319eaa278f32c91f upstream.
Some of those functions try to adjust the CPU features, for example to remove NAP support on some revisions. However, they seem to use r5 as an index into the CPU table entry, which might have been right a long time ago but no longer is. r4 is the right register to use.
This probably caused some off behaviours on some PowerMac variants using 750cx or 7455 processor revisions.
--- arch/powerpc/kernel/cpu_setup_6xx.S | 40 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 20 deletions(-)
arch/powerpc/kernel/cpu_setup_6xx.S +20 -20
@@ -18,7 +18,7 @@ #include <asm/mmu.h> _GLOBAL(__setup_cpu_603) - mflr r4 + mflr r5 BEGIN_MMU_FTR_SECTION li r10,0 mtspr SPRN_SPRG_603_LRU,r10 /* init SW LRU tracking */
@@ -27,60 +27,60 @@ BEGIN_FTR_SECTION bl __init_fpu_registers END_FTR_SECTION_IFCLR(CPU_FTR_FPU_UNAVAILABLE) bl setup_common_caches - mtlr r4 + mtlr r5 blr _GLOBAL(__setup_cpu_604) - mflr r4 + mflr r5 bl setup_common_caches bl setup_604_hid0 - mtlr r4 + mtlr r5 blr _GLOBAL(__setup_cpu_750) - mflr r4 + mflr r5 bl __init_fpu_registers bl setup_common_caches bl setup_750_7400_hid0 - mtlr r4 + mtlr r5 blr _GLOBAL(__setup_cpu_750cx) - mflr r4 + mflr r5 bl __init_fpu_registers bl setup_common_caches bl setup_750_7400_hid0 bl setup_750cx - mtlr r4 + mtlr r5 blr _GLOBAL(__setup_cpu_750fx) - mflr r4 + mflr r5 bl __init_fpu_registers bl setup_common_caches bl setup_750_7400_hid0 bl setup_750fx - mtlr r4 + mtlr r5 blr _GLOBAL(__setup_cpu_7400) - mflr r4 + mflr r5 bl __init_fpu_registers bl setup_7400_workarounds bl setup_common_caches bl setup_750_7400_hid0 - mtlr r4 + mtlr r5 blr _GLOBAL(__setup_cpu_7410) - mflr r4 + mflr r5 bl __init_fpu_registers bl setup_7410_workarounds bl setup_common_caches bl setup_750_7400_hid0 li r3,0 mtspr SPRN_L2CR2,r3 - mtlr r4 + mtlr r5 blr _GLOBAL(__setup_cpu_745x) - mflr r4 + mflr r5 bl setup_common_caches bl setup_745x_specifics - mtlr r4 + mtlr r5 blr /* Enable caches for 603's, 604, 750 & 7400 */
@@ -194,10 +194,10 @@ setup_750cx: cror 4*cr0+eq,4*cr0+eq,4*cr1+eq cror 4*cr0+eq,4*cr0+eq,4*cr2+eq bnelr - lwz r6,CPU_SPEC_FEATURES(r5) + lwz r6,CPU_SPEC_FEATURES(r4) li r7,CPU_FTR_CAN_NAP andc r6,r6,r7 - stw r6,CPU_SPEC_FEATURES(r5) + stw r6,CPU_SPEC_FEATURES(r4) blr /* 750fx specific
@@ -225,12 +225,12 @@ BEGIN_FTR_SECTION andis. r11,r11,L3CR_L3E@h beq 1f END_FTR_SECTION_IFSET(CPU_FTR_L3CR) - lwz r6,CPU_SPEC_FEATURES(r5) + lwz r6,CPU_SPEC_FEATURES(r4) andi. r0,r6,CPU_FTR_L3_DISABLE_NAP beq 1f li r7,CPU_FTR_CAN_NAP andc r6,r6,r7 - stw r6,CPU_SPEC_FEATURES(r5) + stw r6,CPU_SPEC_FEATURES(r4) 1: mfspr r11,SPRN_HID0
PATCH 65/115 parisc : Remove broken line wrapping handling pdc_iodc_print()
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Guy Martin <[email protected]>
commit fbea668498e93bb38ac9226c7af9120a25957375 upstream.
Remove the broken line wrapping handling in pdc_iodc_print(). It is broken in 3 ways :
- It doesn't keep track of the current screen position, it just assumes that the new buffer will be printed at the begining of the screen.
- It doesn't take in account that non printable characters won't increase the current position on the screen.
- And last but not least, it triggers a kernel panic if a backspace is the first char in the provided buffer :
Backtrace: [<0000000040128ec4>] pdc_console_write+0x44/0x78 [<0000000040128f18>] pdc_console_tty_write+0x20/0x38 [<000000004032f1ac>] n_tty_write+0x2a4/0x550 [<000000004032b158>] tty_write+0x1e0/0x2d8 [<00000000401bb420>] vfs_write+0xb8/0x188 [<00000000401bb630>] sys_write+0x68/0xb8 [<0000000040104eb8>] syscall_exit+0x0/0x14
Most terminals handle the line wrapping just fine. I've confirmed that it works correctly on a C8000 with both vga and serial output.
--- arch/parisc/kernel/firmware.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-)
arch/parisc/kernel/firmware.c +1 -12
@@ -1126,15 +1126,13 @@ int pdc_iodc_print(const unsigned char *unsigned int i;unsigned long flags; -for (i =0 ; i < count && i <79 ;) { +for (i =0 ; i < count;) {switch (str[i]) {case '\n' : iodc_dbuf[i+0 ] ='\r' ; iodc_dbuf[i+1 ] ='\n' ; i +=2 ; goto print; -case '\b' :/* BS */ - i--;/* overwrite last */ default : iodc_dbuf[i] = str[i]; i++;
@@ -1142,15 +1140,6 @@ int pdc_iodc_print(const unsigned char * } } -/* if we're at the end of line, and not already inserting a newline, -* insert one anyway. iodc console doesn't claim to support >79 char -* lines. don't account for this in the return value. -*/ -if (i ==79 && iodc_dbuf[i-1 ] !='\n' ) { - iodc_dbuf[i+0 ] ='\r' ; - iodc_dbuf[i+1 ] ='\n' ; - } - print:spin_lock_irqsave (&pdc_lock, flags); real32_call(PAGE0->mem_cons.iodc_io,
PATCH 66/115 kernel/smp.c: fix smp_call_function_many() SMP race
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Anton Blanchard <[email protected]>
commit 6dc19899958e420a931274b94019e267e2396d3e upstream.
I noticed a failure where we hit the following WARN_ON in generic_smp_call_function_interrupt:
if (!cpumask_test_and_clear_cpu(cpu, data->cpumask))
continue;
data->csd.func(data->csd.info);
refs = atomic_dec_return(&data->refs);
WARN_ON(refs < 0); <-------------------------We atomically tested and cleared our bit in the cpumask, and yet the number of cpus left (ie refs) was 0. How can this be?
It turns out commit 54fdade1c3332391948ec43530c02c4794a38172 ("generic-ipi: make struct call_function_data lockless") is at fault. It removes locking from smp_call_function_many and in doing so creates a rather complicated race.
The problem comes about because:
- The smp_call_function_many interrupt handler walks call_function.queue without any locking.
- We reuse a percpu data structure in smp_call_function_many.
- We do not wait for any RCU grace period before starting the next smp_call_function_many.
Imagine a scenario where CPU A does two smp_call_functions back to back, and CPU B does an smp_call_function in between. We concentrate on how CPU C handles the calls:
CPU A CPU B CPU C CPU D
smp_call_function
smp_call_function_interrupt
walks
call_function.queue sees data from CPU A on list
smp_call_function
smp_call_function_interrupt
walks
call_function.queue sees
(stale) CPU A on list
smp_call_function int clears last ref on A list_del_rcu, unlocksmp_call_function reuses
percpu *data A
data->cpumask sees and clears bit in cpumask might be using old or new fn! decrements refs below 0
set data->refs (too late!)
The important thing to note is since the interrupt handler walks a potentially stale call_function.queue without any locking, then another cpu can view the percpu *data structure at any time, even when the owner is in the process of initialising it.
The following test case hits the WARN_ON 100% of the time on my PowerPC box (having 128 threads does help :)
#include <linux/module.h>
#include <linux/init.h>
#define ITERATIONS 100
static void do_nothing_ipi(void *dummy)
{
}
static void do_ipis(struct work_struct *dummy)
{
int i;
for (i = 0; i < ITERATIONS; i++)
smp_call_function(do_nothing_ipi, NULL, 1);
printk(KERN_DEBUG "cpu %d finished\n", smp_processor_id());
}static struct work_struct work[NR_CPUS];
static int __init testcase_init(void)
{
int cpu;
for_each_online_cpu(cpu) {
INIT_WORK(&work[cpu], do_ipis);
schedule_work_on(cpu, &work[cpu]);
}
return 0;
}static void __exit testcase_exit(void)
{
}
module_init(testcase_init)module_exit(testcase_exit)MODULE_LICENSE("GPL");MODULE_AUTHOR("Anton Blanchard");
I tried to fix it by ordering the read and the write of ->cpumask and ->refs. In doing so I missed a critical case but Paul McKenney was able to spot my bug thankfully :) To ensure we arent viewing previous iterations the interrupt handler needs to read ->refs then ->cpumask then ->refs _again_.
Thanks to Milton Miller and Paul McKenney for helping to debug this issue.
--- kernel/smp.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
kernel/smp.c +30 -0
@@ -193,6 +193,24 @@ void generic_smp_call_function_interruptlist_for_each_entry_rcu (data, &call_function.queue, csd.list) {int refs; +/* +* Since we walk the list without any locks, we might +* see an entry that was completed, removed from the +* list and is in the process of being reused. +* +* We must check that the cpu is in the cpumask before +* checking the refs, and both must be set before +* executing the callback on this cpu. +*/ + +if (!cpumask_test_cpu (cpu, data->cpumask)) +continue ; + +smp_rmb (); + +if (atomic_read (&data->refs) ==0 ) +continue ; +if (!cpumask_test_and_clear_cpu (cpu, data->cpumask))continue ;
@@ -201,6 +219,8 @@ void generic_smp_call_function_interrupt refs =atomic_dec_return (&data->refs);WARN_ON (refs <0 );if (!refs) { +WARN_ON (!cpumask_empty (data->cpumask)); +spin_lock (&call_function.lock);list_del_rcu (&data->csd.list);spin_unlock (&call_function.lock);
@@ -401,11 +421,21 @@ void smp_call_function_many(const struct data = &__get_cpu_var (cfd_data);csd_lock (&data->csd); +BUG_ON (atomic_read (&data->refs) || !cpumask_empty (data->cpumask)); data->csd.func = func; data->csd.info = info;cpumask_and (data->cpumask, mask, cpu_online_mask);cpumask_clear_cpu (this_cpu, data->cpumask); + +/* +* To ensure the interrupt handler gets an complete view +* we order the cpumask and refs writes and order the read +* of them in the interrupt handler. In addition we may +* only clear our own cpu bit from the mask. +*/ +smp_wmb (); +atomic_set (&data->refs,cpumask_weight (data->cpumask));spin_lock_irqsave (&call_function.lock, flags);
PATCH 67/115 hostap_cs: fix sleeping function called from invalid context
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Stanislaw Gruszka <[email protected]>
commit 4e5518ca53be29c1ec3c00089c97bef36bfed515 upstream.
pcmcia_request_irq() and pcmcia_enable_device() are intended to be called from process context (first function allocate memory with GFP_KERNEL, second take a mutex). We can not take spin lock and call them.
It's safe to move spin lock after pcmcia_enable_device() as we still hold off IRQ until dev->base_addr is 0 and driver will not proceed with interrupts when is not ready.
Patch resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=643758
--- drivers/net/wireless/hostap/hostap_cs.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
drivers/net/wireless/hostap/hostap_cs.c +2 -8
@@ -662,12 +662,6 @@ static int prism2_config(struct pcmcia_d link->dev_node = &hw_priv->node;/* -* Make sure the IRQ handler cannot proceed until at least -* dev->base_addr is initialized. -*/ -spin_lock_irqsave (&local->irq_init_lock, flags); - -/* * Allocate an interrupt line. Note that this does not assign a * handler to the interrupt, unless the 'Handler' member of the * irq structure is initialized.
@@ -690,9 +684,10 @@ static int prism2_config(struct pcmcia_dCS_CHECK (RequestConfiguration,pcmcia_request_configuration (link, &link->conf)); +/* IRQ handler cannot proceed until at dev->base_addr is initialized */ +spin_lock_irqsave (&local->irq_init_lock, flags); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; -spin_unlock_irqrestore (&local->irq_init_lock, flags);/* Finally, report what we've done */
@@ -724,7 +719,6 @@ static int prism2_config(struct pcmcia_dreturn ret; cs_failed: -spin_unlock_irqrestore (&local->irq_init_lock, flags);cs_error (link, last_fn, last_ret); failed:
PATCH 68/115 md: fix regression with re-adding devices to arrays with no metadata
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: NeilBrown <[email protected]>
commit bf572541ab44240163eaa2d486b06f306a31d45a upstream.
Commit 1a855a0606 (2.6.37-rc4) fixed a problem where devices were re-added when they shouldn't be but caused a regression in a less common case that means sometimes devices cannot be re-added when they should be.
In particular, when re-adding a device to an array without metadata we should always access the device, but after the above commit we didn't.
This patch sets the In_sync flag in that case so that the re-add succeeds.
This patch is suitable for any -stable kernel to which 1a855a0606 was applied.
--- drivers/md/md.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/md/md.c +3 -2
@@ -4802,9 +4802,10 @@ static int add_new_disk(mddev_t * mddev,/* set saved_raid_disk if appropriate */ if (!mddev->persistent) {if (info->state & (1 <<MD_DISK_SYNC ) && - info->raid_disk < mddev->raid_disks) + info->raid_disk < mddev->raid_disks) { rdev->raid_disk = info->raid_disk; -else +set_bit (In_sync, &rdev->flags); + }else rdev->raid_disk =-1 ; }else super_types[mddev->major_version].
PATCH 69/115 pata_mpc52xx: inherit from ata_bmdma_port_ops
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Tejun Heo <[email protected]>
commit 77c5fd19075d299fe820bb59bb21b0b113676e20 upstream.
pata_mpc52xx supports BMDMA but inherits ata_sff_port_ops which triggers BUG_ON() when a DMA command is issued. Fix it.
--- drivers/ata/pata_mpc52xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ata/pata_mpc52xx.c +1 -1
@@ -610,7 +610,7 @@ static struct scsi_host_template mpc52xx };static struct ata_port_operations mpc52xx_ata_port_ops = { - .inherits = &ata_sff_port_ops, + .inherits = &ata_bmdma_port_ops, .sff_dev_select = mpc52xx_ata_dev_select, .set_piomode = mpc52xx_ata_set_piomode, .set_dmamode = mpc52xx_ata_set_dmamode,
PATCH 70/115 TPM: Long default timeout fix
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Rajiv Andrade <[email protected]>
commit c4ff4b829ef9e6353c0b133b7adb564a68054979 upstream.
If duration variable value is 0 at this point, it's because chip->vendor.duration wasn't filled by tpm_get_timeouts() yet. This patch sets then the lowest timeout just to give enough time for tpm_get_timeouts() to further succeed.
This fix avoids long boot times in case another entity attempts to send commands to the TPM when the TPM isn't accessible.
--- drivers/char/tpm/tpm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/char/tpm/tpm.c +6 -4
@@ -353,12 +353,14 @@ unsigned long tpm_calc_ordinal_duration( tpm_protected_ordinal_duration[ordinal &TPM_PROTECTED_ORDINAL_MASK ]; -if (duration_idx !=TPM_UNDEFINED ) +if (duration_idx !=TPM_UNDEFINED ) { duration = chip->vendor.duration[duration_idx]; -if (duration <=0 ) +/* if duration is 0, it's because chip->vendor.duration wasn't */ +/* filled yet, so we set the lowest timeout just to give enough */ +/* time for tpm_get_timeouts() to succeed */ +return (duration <=0 ?HZ : duration); + }else return 2 *60 *HZ ; -else -return duration; }EXPORT_SYMBOL_GPL (tpm_calc_ordinal_duration);
PATCH 71/115 tpm_tis: Use timeouts returned from TPM
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Stefan Berger <[email protected]>
commit 9b29050f8f75916f974a2d231ae5d3cd59792296 upstream.
The current TPM TIS driver in git discards the timeout values returned from the TPM. The check of the response packet needs to consider that the return_code field is 0 on success and the size of the expected packet is equivalent to the header size + u32 length indicator for the TPM_GetCapability() result + 3 timeout indicators of type u32.
I am also adding a sysfs entry 'timeouts' showing the timeouts that are being used.
--- drivers/char/tpm/tpm.c | 18 ++++++++++++++++-- drivers/char/tpm/tpm.h | 2 ++ drivers/char/tpm/tpm_tis.c | 4 +++- 3 files changed, 21 insertions(+), 3 deletions(-)
drivers/char/tpm/tpm.c +16 -2
@@ -566,9 +566,11 @@ duration:if (rc)return ; -if (be32_to_cpu (tpm_cmd.header.out.return_code) - !=3 *sizeof (u32)) +if (be32_to_cpu (tpm_cmd.header.out.return_code) !=0 || +be32_to_cpu (tpm_cmd.header.out.length) + !=sizeof (tpm_cmd.header.out) +sizeof (u32) +3 *sizeof (u32))return ; + duration_cap = &tpm_cmd.params.getcap_out.cap.duration; chip->vendor.duration[TPM_SHORT ] =usecs_to_jiffies (be32_to_cpu (duration_cap->tpm_short));
@@ -912,6 +914,18 @@ ssize_t tpm_show_caps_1_2(struct device }EXPORT_SYMBOL_GPL (tpm_show_caps_1_2); +ssize_t tpm_show_timeouts (struct device *dev,struct device_attribute *attr, +char *buf) +{ +struct tpm_chip *chip =dev_get_drvdata (dev); + +return sprintf (buf,"%d %d %d\n" , +jiffies_to_usecs (chip->vendor.duration[TPM_SHORT ]), +jiffies_to_usecs (chip->vendor.duration[TPM_MEDIUM ]), +jiffies_to_usecs (chip->vendor.duration[TPM_LONG ])); +} +EXPORT_SYMBOL_GPL (tpm_show_timeouts); +ssize_t tpm_store_cancel (struct device *dev,struct device_attribute *attr,const char *buf,size_t count) {
drivers/char/tpm/tpm.h +2 -0
@@ -56,6 +56,8 @@ extern ssize_t tpm_show_owned(struct dev char *);extern ssize_t tpm_show_temp_deactivated (struct device *,struct device_attribute *attr,char *); +extern ssize_t tpm_show_timeouts (struct device *, +struct device_attribute *attr,char *);struct tpm_chip ;
drivers/char/tpm/tpm_tis.c +3 -1
@@ -354,6 +354,7 @@ static DEVICE_ATTR(temp_deactivated, S_I NULL); static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL); static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel); +static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL);static struct attribute *tis_attrs[] = { &dev_attr_pubek.attr,
@@ -363,7 +364,8 @@ static struct attribute *tis_attrs[] = { &dev_attr_owned.attr, &dev_attr_temp_deactivated.attr, &dev_attr_caps.attr, - &dev_attr_cancel.attr, NULL, + &dev_attr_cancel.attr, + &dev_attr_timeouts.attr, NULL, }; static struct attribute_group tis_attr_grp = {
PATCH 72/115 SELinux: define permissions for DCB netlink messages
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Eric Paris <[email protected]>
commit 350e4f31e0eaf56dfc3b328d24a11bdf42a41fb8 upstream.
Commit 2f90b865 added two new netlink message types to the netlink route socket. SELinux has hooks to define if netlink messages are allowed to be sent or received, but it did not know about these two new message types. By default we allow such actions so noone likely noticed. This patch adds the proper definitions and thus proper permissions enforcement.
--- security/selinux/nlmsgtab.c | 2 ++ 1 file changed, 2 insertions(+)
security/selinux/nlmsgtab.c +2 -0
@@ -66,6 +66,8 @@ static struct nlmsg_perm nlmsg_route_per { RTM_NEWADDRLABEL, NETLINK_ROUTE_SOCKET__NLMSG_WRITE }, { RTM_DELADDRLABEL, NETLINK_ROUTE_SOCKET__NLMSG_WRITE }, { RTM_GETADDRLABEL, NETLINK_ROUTE_SOCKET__NLMSG_READ }, + { RTM_GETDCB, NETLINK_ROUTE_SOCKET__NLMSG_READ }, + { RTM_SETDCB, NETLINK_ROUTE_SOCKET__NLMSG_WRITE }, }; static struct nlmsg_perm nlmsg_firewall_perms[] =
PATCH 73/115 SELinux: do not compute transition labels on mountpoint labeled filesystems
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Eric Paris <[email protected]>
commit 415103f9932d45f7927f4b17e3a9a13834cdb9a1 upstream.
selinux_inode_init_security computes transitions sids even for filesystems that use mount point labeling. It shouldn't do that. It should just use the mount point label always and no matter what.
This causes 2 problems. 1) it makes file creation slower than it needs to be since we calculate the transition sid and 2) it allows files to be created with a different label than the mount point!
# id -Z staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023 # sesearch --type --class file --source sysadm_t --target tmp_t Found 1 semantic te rules: type_transition sysadm_t tmp_t : file user_tmp_t;
# mount -o loop,context="system_u:object_r:tmp_t:s0" /tmp/fs /mnt/tmp
# ls -lZ /mnt/tmp drwx------. root root system_u:object_r:tmp_t:s0 lost+found # touch /mnt/tmp/file1 # ls -lZ /mnt/tmp -rw-r--r--. root root staff_u:object_r:user_tmp_t:s0 file1 drwx------. root root system_u:object_r:tmp_t:s0 lost+found
Whoops, we have a mount point labeled filesystem tmp_t with a user_tmp_t labeled file!
--- security/selinux/hooks.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
security/selinux/hooks.c +4 -1
@@ -2601,7 +2601,10 @@ static int selinux_inode_init_security(s sid = tsec->sid; newsid = tsec->create_sid; -if (!newsid || !(sbsec->flags &SE_SBLABELSUPP )) { +if ((sbsec->flags &SE_SBINITIALIZED ) && + (sbsec->behavior ==SECURITY_FS_USE_MNTPOINT )) + newsid = sbsec->mntpoint_sid; +else if (!newsid || !(sbsec->flags &SE_SBLABELSUPP )) { rc =security_transition_sid (sid, dsec->sid,inode_mode_to_security_class (inode->i_mode), &newsid);
PATCH 74/115 ieee80211: correct IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK macro
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Amitkumar Karwar <[email protected]>
commit 8d661f1e462d50bd83de87ee628aaf820ce3c66c upstream.
It is defined in include/linux/ieee80211.h. As per IEEE spec. bit6 to bit15 in block ack parameter represents buffer size. So the bitmask should be 0xFFC0.
--- include/linux/ieee80211.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/ieee80211.h +1 -1
@@ -872,7 +872,7 @@ struct ieee80211_ht_info {/* block-ack parameters */ #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 +#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
PATCH 75/115 dm: dont take i_mutex to change device size
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Mike Snitzer <[email protected]>
commit c217649bf2d60ac119afd71d938278cffd55962b upstream.
No longer needlessly hold md->bdev->bd_inode->i_mutex when changing the size of a DM device. This additional locking is unnecessary because i_size_write() is already protected by the existing critical section in dm_swap_table(). DM already has a reference on md->bdev so the associated bd_inode may be changed without lifetime concerns.
A negative side-effect of having held md->bdev->bd_inode->i_mutex was that a concurrent DM device resize and flush (via fsync) would deadlock. Dropping md->bdev->bd_inode->i_mutex eliminates this potential for deadlock. The following reproducer no longer deadlocks:
https://www.redhat.com/archives/dm-devel/2009-July/msg00284.html
--- drivers/md/dm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/md/dm.c +3 -2
@@ -1925,13 +1925,14 @@ static void event_callback(void *contextwake_up (&md->eventq); } +/* +* Protected by md->suspend_lock obtained by dm_swap_table(). +*/ static void __set_size (struct mapped_device *md,sector_t size) {set_capacity (md->disk, size); -mutex_lock (&md->bdev->bd_inode->i_mutex);i_size_write (md->bdev->bd_inode, (loff_t )size <<SECTOR_SHIFT ); -mutex_unlock (&md->bdev->bd_inode->i_mutex); } static int __bind(struct mapped_device *md, struct dm_table *t,
PATCH 76/115 dm mpath: disable blk_abort_queue
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Mike Snitzer <[email protected]>
commit 09c9d4c9b6a2b5909ae3c6265e4cd3820b636863 upstream.
Revert commit 224cb3e981f1b2f9f93dbd49eaef505d17d894c2
dm: Call blk_abort_queue on failed paths
Multipath began to use blk_abort_queue() to allow for lower latency path deactivation. This was found to cause list corruption:
the cmd gets blk_abort_queued/timedout run on it and the scsi eh somehow is able to complete and run scsi_queue_insert while scsi_request_fn is still trying to process the request.
https://www.redhat.com/archives/dm-devel/2010-November/msg00085.html
--- drivers/md/dm-mpath.c | 12 ------------ 1 file changed, 12 deletions(-)
drivers/md/dm-mpath.c +0 -12
@@ -33,7 +33,6 @@ struct pgpath {unsigned fail_count;/* Cumulative failure count */ struct dm_path path; -struct work_struct deactivate_path;struct work_struct activate_path; };
@@ -113,7 +112,6 @@ static struct workqueue_struct *kmultipastatic void process_queued_ios (struct work_struct *work);static void trigger_event (struct work_struct *work);static void activate_path (struct work_struct *work); -static void deactivate_path (struct work_struct *work);/*-----------------------------------------------
@@ -126,7 +124,6 @@ static struct pgpath *alloc_pgpath(void)if (pgpath) { pgpath->is_active =1 ; -INIT_WORK (&pgpath->deactivate_path, deactivate_path);INIT_WORK (&pgpath->activate_path, activate_path); }
@@ -138,14 +135,6 @@ static void free_pgpath(struct pgpath *pkfree (pgpath); } -static void deactivate_path (struct work_struct *work) -{ -struct pgpath *pgpath = - container_of(work, struct pgpath, deactivate_path); - -blk_abort_queue (pgpath->path.dev->bdev->bd_disk->queue); -} -static struct priority_group *alloc_priority_group (void ) {struct priority_group *pg;
@@ -949,7 +938,6 @@ static int fail_path(struct pgpath *pgpa pgpath->path.dev->name, m->nr_valid_paths);schedule_work (&m->trigger_event); -queue_work (kmultipathd, &pgpath->deactivate_path); out:spin_unlock_irqrestore (&m->lock, flags);
PATCH 77/115 drm/radeon/kms: add quirk for Mac Radeon HD 2600 card
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit f598aa7593427ffe3a61e7767c34bd695a5e7ed0 upstream.
--- drivers/gpu/drm/radeon/radeon_atombios.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/gpu/drm/radeon/radeon_atombios.c +11 -0
@@ -152,6 +152,17 @@ static bool radeon_atom_apply_quirks(strreturn false; } +/* mac rv630 */ +if ((dev->pdev->device ==0x9588 ) && + (dev->pdev->subsystem_vendor ==0x106b ) && + (dev->pdev->subsystem_device ==0x00a6 )) { +if ((supported_device ==ATOM_DEVICE_TV1_SUPPORT ) && + (*connector_type ==DRM_MODE_CONNECTOR_DVII )) { + *connector_type = DRM_MODE_CONNECTOR_9PinDIN; + *line_mux =CONNECTOR_7PIN_DIN_ENUM_ID1 ; + } + } +/* ASUS HD 3600 XT board lists the DVI port as HDMI */ if ((dev->pdev->device == 0x9598) && (dev->pdev->subsystem_vendor == 0x1043) &&
PATCH 78/115 drm/radeon/kms: make the mac rv630 quirk generic
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit be23da8ad219650517cbbb7acbeaeb235667113a upstream.
Seems some other boards do this as well.
--- drivers/gpu/drm/radeon/radeon_atombios.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
drivers/gpu/drm/radeon/radeon_atombios.c +5 -9
@@ -152,15 +152,11 @@ static bool radeon_atom_apply_quirks(strreturn false; } -/* mac rv630 */ -if ((dev->pdev->device ==0x9588 ) && - (dev->pdev->subsystem_vendor ==0x106b ) && - (dev->pdev->subsystem_device ==0x00a6 )) { -if ((supported_device ==ATOM_DEVICE_TV1_SUPPORT ) && - (*connector_type ==DRM_MODE_CONNECTOR_DVII )) { - *connector_type = DRM_MODE_CONNECTOR_9PinDIN; - *line_mux =CONNECTOR_7PIN_DIN_ENUM_ID1 ; - } +/* mac rv630, rv730, others */ +if ((supported_device ==ATOM_DEVICE_TV1_SUPPORT ) && + (*connector_type ==DRM_MODE_CONNECTOR_DVII )) { + *connector_type = DRM_MODE_CONNECTOR_9PinDIN; + *line_mux =CONNECTOR_7PIN_DIN_ENUM_ID1 ; }/* ASUS HD 3600 XT board lists the DVI port as HDMI */
PATCH 79/115 drm/radeon/kms: add pll debugging output
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit 51d4bf840a27fe02c883ddc6d9708af056773769 upstream.
--- drivers/gpu/drm/radeon/radeon_display.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/radeon/radeon_display.c +4 -0
@@ -540,6 +540,10 @@ void radeon_compute_pll(struct radeon_pl *frac_fb_div_p = best_frac_feedback_div; *ref_div_p = best_ref_div; *post_div_p = best_post_div; +DRM_DEBUG_KMS ("%d %d, pll dividers - fb: %d.%d ref: %d, post %d\n" , + freq, best_freq /1000 , best_feedback_div, best_frac_feedback_div, + best_ref_div, best_post_div); + }static void radeon_user_framebuffer_destroy (struct drm_framebuffer *fb)
PATCH 80/115 drm/radeon: remove 0x4243 pci id
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit 63a507800c8aca5a1891d598ae13f829346e8e39 upstream.
0x4243 is a PCI bridge, not a GPU.
Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=33815
--- include/drm/drm_pciids.h | 1 - 1 file changed, 1 deletion(-)
include/drm/drm_pciids.h +0 -1
@@ -28,7 +28,6 @@ {0x1002, 0x4156, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ {0x1002, 0x4237, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|RADEON_IS_IGP}, \ {0x1002, 0x4242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ - {0x1002, 0x4243, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ {0x1002, 0x4336, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS100|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ {0x1002, 0x4337, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ {0x1002, 0x4437, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \
PATCH 81/115 drm/radeon/kms: fix s/r issues with bios scratch regs
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit 87364760de5d631390c478fcbac8db1b926e0adf upstream.
The accelerate mode bit gets checked by certain atom command tables to set up some register state. It needs to be clear when setting modes and set when not.
Fixes:
https://bugzilla.kernel.org/show_bug.cgi?id=26942
--- drivers/gpu/drm/radeon/radeon_atombios.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/gpu/drm/radeon/radeon_atombios.c +6 -3
@@ -1217,7 +1217,7 @@ void radeon_atom_initialize_bios_scratch bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE ;/* tell the bios not to handle mode switching */ - bios_6_scratch |= (ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH |ATOM_S6_ACC_MODE ); + bios_6_scratch |=ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH ;if (rdev->family >=CHIP_R600 ) {WREG32 (R600_BIOS_2_SCRATCH , bios_2_scratch);
@@ -1268,10 +1268,13 @@ void radeon_atom_output_lock(struct drm_else bios_6_scratch =RREG32 (RADEON_BIOS_6_SCRATCH ); -if (lock) +if (lock) { bios_6_scratch |=ATOM_S6_CRITICAL_STATE ; -else + bios_6_scratch &= ~ATOM_S6_ACC_MODE ; + }else { bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE ; + bios_6_scratch |=ATOM_S6_ACC_MODE ; + }if (rdev->family >=CHIP_R600 )WREG32 (R600_BIOS_6_SCRATCH , bios_6_scratch);
PATCH 82/115 drm/i915/lvds: Add AOpen i915GMm-HFS to the list of false-positive LVDS
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Knut Petersen <[email protected]>
commit 22ab70d3262ddb6e69b3c246a34e2967ba5eb1e8 upstream.
--- drivers/gpu/drm/i915/intel_lvds.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/i915/intel_lvds.c +8 -0
@@ -884,6 +884,14 @@ static const struct dmi_system_id intel_ }, { .callback = intel_no_lvds_dmi_callback, + .ident = "AOpen i915GMm-HFS", + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"AOpen" ), + DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, .ident = "Aopen i945GTt-VFA", .matches = { DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"),
PATCH 83/115 drm/i915: Add dependency on CONFIG_TMPFS
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Chris Wilson <[email protected]>
commit f7ab9b407b3bc83161c2aa74c992ba4782e87c9c upstream.
Without tmpfs, shmem_readpage() is not compiled in causing an OOPS as soon as we try to allocate some swappable pages for GEM.
Jan 19 22:52:26 harlie kernel: Modules linked in: i915(+) drm_kms_helper cfbcopyarea video backlight cfbimgblt cfbfillrect Jan 19 22:52:26 harlie kernel: Jan 19 22:52:26 harlie kernel: Pid: 1125, comm: modprobe Not tainted 2.6.37Harlie #10 To be filled by O.E.M./To be filled by O.E.M. Jan 19 22:52:26 harlie kernel: EIP: 0060:[<00000000>] EFLAGS: 00010246 CPU: 3 Jan 19 22:52:26 harlie kernel: EIP is at 0x0 Jan 19 22:52:26 harlie kernel: EAX: 00000000 EBX: f7b7d000 ECX: f3383100 EDX: f7b7d000 Jan 19 22:52:26 harlie kernel: ESI: f1456118 EDI: 00000000 EBP: f2303c98 ESP: f2303c7c Jan 19 22:52:26 harlie kernel: DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 Jan 19 22:52:26 harlie kernel: Process modprobe (pid: 1125, ti=f2302000 task=f259cd80 task.ti=f2302000) Jan 19 22:52:26 harlie kernel: Stack: Jan 19 22:52:26 harlie udevd-work[1072]: '/sbin/modprobe -b pci:v00008086d00000046sv00000000sd00000000bc03sc00i00' unexpected exit with status 0x0009 Jan 19 22:52:26 harlie kernel: c1074061 000000d0 f2f42b80 00000000 000a13d2 f2d5dcc0 00000001 f2303cac Jan 19 22:52:26 harlie kernel: c107416f 00000000 000a13d2 00000000 f2303cd4 f8d620ed f2cee620 00001000 Jan 19 22:52:26 harlie kernel: 00000000 000a13d2 f1456118 f2d5dcc0 f1a40000 00001000 f2303d04 f8d637ab Jan 19 22:52:26 harlie kernel: Call Trace: Jan 19 22:52:26 harlie kernel: [<c1074061>] ? do_read_cache_page+0x71/0x160 Jan 19 22:52:26 harlie kernel: [<c107416f>] ? read_cache_page_gfp+0x1f/0x30 Jan 19 22:52:26 harlie kernel: [<f8d620ed>] ? i915_gem_object_get_pages+0xad/0x1d0 [i915] Jan 19 22:52:26 harlie kernel: [<f8d637ab>] ? i915_gem_object_bind_to_gtt+0xeb/0x2d0 [i915] Jan 19 22:52:26 harlie kernel: [<f8d65961>] ? i915_gem_object_pin+0x151/0x190 [i915] Jan 19 22:52:26 harlie kernel: [<c11e16ed>] ? drm_gem_object_init+0x3d/0x60 Jan 19 22:52:26 harlie kernel: [<f8d65aa5>] ? i915_gem_init_ringbuffer+0x105/0x1e0 [i915] Jan 19 22:52:26 harlie kernel: [<f8d571b7>] ? i915_driver_load+0x667/0x1160 [i915]
--- drivers/gpu/drm/Kconfig | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/Kconfig +3 -0
@@ -92,7 +92,10 @@ config DRM_I830 config DRM_I915 tristate "i915 driver" depends on AGP_INTEL + # we need shmfs for the swappable backing store, and in particular + # the shmem_readpage() which depends upon tmpfs select SHMEM + select TMPFS select DRM_KMS_HELPER select FB_CFB_FILLRECT select FB_CFB_COPYAREA
PATCH 84/115 x86, mm: avoid possible bogus tlb entries by clearing prev mm_cpumask after switching mm
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Suresh Siddha <[email protected]>
commit 831d52bc153971b70e64eccfbed2b232394f22f8 upstream.
Clearing the cpu in prev's mm_cpumask early will avoid the flush tlb IPI's while the cr3 is still pointing to the prev mm. And this window can lead to the possibility of bogus TLB fills resulting in strange failures. One such problematic scenario is mentioned below.
T1. CPU-1 is context switching from mm1 to mm2 context and got a NMI
etc between the point of clearing the cpu from the mm_cpumask(mm1) and before reloading the cr3 with the new mm2.
T2. CPU-2 is tearing down a specific vma for mm1 and will proceed with
flushing the TLB for mm1. It doesn't send the flush TLB to CPU-1 as it doesn't see that cpu listed in the mm_cpumask(mm1).
T3. After the TLB flush is complete, CPU-2 goes ahead and frees the
page-table pages associated with the removed vma mapping.
T4. CPU-2 now allocates those freed page-table pages for something
else.
T5. As the CR3 and TLB caches for mm1 is still active on CPU-1, CPU-1
can potentially speculate and walk through the page-table caches and can insert new TLB entries. As the page-table pages are already freed and being used on CPU-2, this page walk can potentially insert a bogus global TLB entry depending on the (random) contents of the page that is being used on CPU-2.
T6. This bogus TLB entry being global will be active across future CR3
changes and can result in weird memory corruption etc.
To avoid this issue, for the prev mm that is handing over the cpu to another mm, clear the cpu from the mm_cpumask(prev) after the cr3 is changed.
Marking it for -stable, though we haven't seen any reported failure that can be attributed to this.
--- arch/x86/include/asm/mmu_context.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/x86/include/asm/mmu_context.h +3 -2
@@ -36,8 +36,6 @@ static inline void switch_mm(struct mm_sunsigned cpu =smp_processor_id ();if (likely (prev != next)) { -/* stop flush ipis for the previous mm */ -cpumask_clear_cpu (cpu,mm_cpumask (prev));#ifdef CONFIG_SMP percpu_write (cpu_tlbstate.state,TLBSTATE_OK );percpu_write (cpu_tlbstate.active_mm, next);
@@ -47,6 +45,9 @@ static inline void switch_mm(struct mm_s/* Re-load page tables */ load_cr3 (next->pgd); +/* stop flush ipis for the previous mm */ +cpumask_clear_cpu (cpu,mm_cpumask (prev)); +/* * load the LDT, if the LDT is different: */
PATCH 85/115 usb: Realloc xHCI structures after a hub is verified.
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Sarah Sharp <[email protected]>
commit 653a39d1f61bdc9f277766736d21d2e9be0391cb upstream.
When there's an xHCI host power loss after a suspend from memory, the USB core attempts to reset and verify the USB devices that are attached to the system. The xHCI driver has to reallocate those devices, since the hardware lost all knowledge of them during the power loss.
When a hub is plugged in, and the host loses power, the xHCI hardware structures are not updated to say the device is a hub. This is usually done in hub_configure() when the USB hub is detected. That function is skipped during a reset and verify by the USB core, since the core restores the old configuration and alternate settings, and the hub driver has no idea this happened. This bug makes the xHCI host controller reject the enumeration of low speed devices under the resumed hub.
Therefore, make the USB core re-setup the internal xHCI hub device information by calling update_hub_device() when hub_activate() is called for a hub reset resume. After a host power loss, all devices under the roothub get a reset-resume or a disconnect.
This patch should be queued for the 2.6.37 stable tree.
--- drivers/usb/core/hub.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/usb/core/hub.c +21 -0
@@ -648,6 +648,8 @@ static void hub_init_func3(struct work_sstatic void hub_activate (struct usb_hub *hub,enum hub_activation_type type) {struct usb_device *hdev = hub->hdev; +struct usb_hcd *hcd; +int ret;int port1;int status;bool need_debounce_delay = false;
@@ -686,6 +688,25 @@ static void hub_activate(struct usb_hubatomic_set (&to_usb_interface (hub->intfdev)-> pm_usage_cnt,1 );return ;/* Continues at init2: below */ + }else if (type ==HUB_RESET_RESUME ) { +/* The internal host controller state for the hub device +* may be gone after a host power loss on system resume. +* Update the device's info so the HW knows it's a hub. +*/ + hcd =bus_to_hcd (hdev->bus); +if (hcd->driver->update_hub_device) { + ret = hcd->driver->update_hub_device (hcd, hdev, + &hub->tt,GFP_NOIO ); +if (ret <0 ) { +dev_err (hub->intfdev,"Host not " +"accepting hub info " +"update.\n" ); +dev_err (hub->intfdev,"LS/FS devices " +"and hubs may not work " +"under this hub\n." ); + } + } +hub_power_on (hub, true); }else {hub_power_on (hub, true); }
PATCH 86/115 sched: Remove USER_SCHED
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 7c9414385ebfdd87cc542d4e7e3bb0dbb2d3ce25 upstream
Remove the USER_SCHED feature. It has been scheduled to be removed in 2.6.34 as per http://marc.info/?l=linux-kernel&m=125728479022976&w=2
[trace from referenced thread]
[1046577.884289] general protection fault: 0000 [#1] SMP [1046577.911332] last sysfs file: /sys/devices/platform/coretemp.7/temp1_input [1046577.938715] CPU 3 [1046577.965814] Modules linked in: ipt_REJECT xt_tcpudp iptable_filter ip_tables x_tables coretemp k8temp [1046577.994456] Pid: 38, comm: events/3 Not tainted 2.6.32.27intel #1 X8DT3 [1046578.023166] RIP: 0010:[] [] sched_destroy_group+0x3c/0x10d [1046578.052639] RSP: 0000:ffff88043e5abe10 EFLAGS: 00010097 [1046578.081360] RAX: ffff880139fa5540 RBX: ffff8803d18419c0 RCX: ffff8801d2f8fb78 [1046578.109903] RDX: dead000000200200 RSI: 0000000000000000 RDI: 0000000000000000 [1046578.109905] RBP: 0000000000000246 R08: 0000000000000020 R09: ffffffff816339b8 [1046578.109907] R10: 0000000004e6e5f0 R11: 0000000000000006 R12: ffffffff816339b8 [1046578.109909] R13: ffff8803d63ac4e0 R14: ffff88043e582340 R15: ffffffff8104a216 [1046578.109911] FS: 0000000000000000(0000) GS:ffff880028260000(0000) knlGS:0000000000000000 [1046578.109914] CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b [1046578.109915] CR2: 00007f55ab220000 CR3: 00000001e5797000 CR4: 00000000000006e0 [1046578.109917] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [1046578.109919] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [1046578.109922] Process events/3 (pid: 38, threadinfo ffff88043e5aa000, task ffff88043e582340) [1046578.109923] Stack: [1046578.109924] ffff8803d63ac498 ffff8803d63ac4d8 ffff8803d63ac440 ffffffff8104a2c3 [1046578.109927] <0> ffff88043e5abef8 ffff880028276040 ffff8803d63ac4d8 ffffffff81050395 [1046578.109929] <0> ffff88043e582340 ffff88043e5826c8 ffff88043e582340 ffff88043e5abfd8 [1046578.109932] Call Trace: [1046578.109938] [] ? cleanup_user_struct+0xad/0xcc [1046578.109942] [] ? worker_thread+0x148/0x1d4 [1046578.109946] [] ? autoremove_wake_function+0x0/0x2e [1046578.109948] [] ? worker_thread+0x0/0x1d4 [1046578.109951] [] ? kthread+0x79/0x81 [1046578.109955] [] ? child_rip+0xa/0x20 [1046578.109957] [] ? kthread+0x0/0x81 [1046578.109959] [] ? child_rip+0x0/0x20 [1046578.109961] Code: 3c 00 4c 8b 25 02 98 3d 00 48 89 c5 83 cf ff eb 5c 48 8b 43 10 48 63 f7 48 8b 04 f0 48 8b 90 80 00 00 00 48 8b 48 78 48 89 51 08 <48> 89 0a 48 b9 00 02 20 00 00 00 ad de 48 89 88 80 00 00 00 48 [1046578.109975] RIP [] sched_destroy_group+0x3c/0x10d [1046578.109979] RSP [1046578.109981] ---[ end trace 5ebc2944b7872d4a ]---
LKML-Reference: <1263990378.24844.3.camel@localhost>
LKML-Reference: http://marc.info/?l=linux-kernel&m=129466345327931
--- include/linux/sched.h | 14 -- init/Kconfig | 81 ++++--------- kernel/ksysfs.c | 8 - kernel/sched.c | 108 +---------------- kernel/sys.c | 5 kernel/user.c | 305 -------------------------------------------------- 6 files changed, 38 insertions(+), 483 deletions(-)
include/linux/sched.h +1 -13
@@ -728,14 +728,6 @@ struct user_struct {uid_t uid;struct user_namespace *user_ns; -#ifdef CONFIG_USER_SCHED -struct task_group *tg; -#ifdef CONFIG_SYSFS -struct kobject kobj; -struct delayed_work work; -#endif -#endif -#ifdef CONFIG_PERF_EVENTS atomic_long_t locked_vm;#endif
@@ -2500,13 +2492,9 @@ extern long sched_getaffinity(pid_t pid,extern void normalize_rt_tasks (void ); -#ifdef CONFIG_GROUP_SCHED +#ifdef CONFIG_CGROUP_SCHED extern struct task_group init_task_group; -#ifdef CONFIG_USER_SCHED -extern struct task_group root_task_group; -extern void set_tg_uid (struct user_struct *user); -#endif extern struct task_group *sched_create_group (struct task_group *parent);extern void sched_destroy_group (struct task_group *tg);
init/Kconfig +30 -51
93 lines not on this page · raw message
kernel/ksysfs.c +0 -8
@@ -176,16 +176,8 @@ static int __init ksysfs_init(void) goto group_exit; } -/* create the /sys/kernel/uids/ directory */ - error =uids_sysfs_init (); -if (error) - goto notes_exit; -return 0 ; -notes_exit: -if (notes_size >0 ) -sysfs_remove_bin_file (kernel_kobj, ¬es_attr); group_exit:sysfs_remove_group (kernel_kobj, &kernel_attr_group); kset_exit:
kernel/sched.c +7 -101
200 lines not on this page · raw message
kernel/sys.c +0 -5
@@ -567,11 +567,6 @@ static int set_user(struct cred *new)if (!new_user)return -EAGAIN ; -if (!task_can_switch_user (new_user, current)) { -free_uid (new_user); -return -EINVAL ; - } -if (atomic_read (&new_user->processes) >= current->signal->rlim[RLIMIT_NPROC ].rlim_cur && new_user !=INIT_USER ) {
kernel/user.c +0 -305
359 lines not on this page · raw message
PATCH 87/115 sched: Remove remaining USER_SCHED code
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 32bd7eb5a7f4596c8440dd9440322fe9e686634d upstream
This is left over from commit 7c9414385e ("sched: Remove USER_SCHED"")
LKML-Reference: <[email protected]>
--- init/Kconfig | 3 +-- kernel/capability.c | 1 - kernel/cred-internals.h | 21 --------------------- kernel/cred.c | 3 --- kernel/exit.c | 1 - kernel/sched_debug.c | 5 ----- kernel/user.c | 10 +--------- 7 files changed, 2 insertions(+), 42 deletions(-) delete mode 100644 kernel/cred-internals.h
init/Kconfig +1 -2
@@ -568,8 +568,7 @@ config RT_GROUP_SCHED default n help This feature lets you explicitly allocate real CPU bandwidth - to users or control groups (depending on the "Basis for grouping tasks" - setting below. If enabled, it will also make it impossible to + to task groups. If enabled, it will also make it impossible to schedule realtime tasks for non-root users until you allocate realtime bandwidth for them. See Documentation/scheduler/sched-rt-group.txt for more information.
kernel/capability.c +0 -1
@@ -15,7 +15,6 @@#include <linux/syscalls.h> #include <linux/pid_namespace.h> #include <asm/uaccess.h> -#include "cred-internals.h" /* * Leveraged for setting/resetting capabilities
kernel/cred-internals.h deleted +0 -21
@@ -1,21 +0,0 @@ -/* Internal credentials stuff -* -* Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. -* Written by David Howells ([email protected]) -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public Licence -* as published by the Free Software Foundation; either version -* 2 of the Licence, or (at your option) any later version. -*/ - -/* -* user.c -*/ -static inline void sched_switch_user (struct task_struct *p) -{ -#ifdef CONFIG_USER_SCHED -sched_move_task (p); -#endif /* CONFIG_USER_SCHED */ -} -
kernel/cred.c +0 -3
@@ -16,7 +16,6 @@#include <linux/init_task.h> #include <linux/security.h> #include <linux/cn_proc.h> -#include "cred-internals.h" #if 0 #define kdebug (FMT , ...) \
@@ -553,8 +552,6 @@ int commit_creds(struct cred *new)atomic_dec (&old->user->processes);alter_cred_subscribers (old,-2 ); -sched_switch_user (task); -/* send notifications */ if (new->uid != old->uid || new->euid != old->euid ||
kernel/exit.c +0 -1
@@ -54,7 +54,6 @@#include <asm/unistd.h> #include <asm/pgtable.h> #include <asm/mmu_context.h> -#include "cred-internals.h" static void exit_mm (struct task_struct * tsk);
kernel/sched_debug.c +0 -5
@@ -173,11 +173,6 @@ void print_cfs_rq(struct seq_file *m, intask_group_path (tg, path,sizeof (path));SEQ_printf (m,"\ncfs_rq[%d]:%s\n" , cpu, path); -#elif defined(CONFIG_USER_SCHED ) && defined(CONFIG_FAIR_GROUP_SCHED ) - { -uid_t uid = cfs_rq->tg->uid; -SEQ_printf (m,"\ncfs_rq[%d] for UID: %u\n" , cpu, uid); - }#else SEQ_printf (m,"\ncfs_rq[%d]:\n" , cpu);#endif
kernel/user.c +1 -9
@@ -16,7 +16,6 @@#include <linux/interrupt.h> #include <linux/module.h> #include <linux/user_namespace.h> -#include "cred-internals.h" struct user_namespace init_user_ns = { .kref = {
@@ -137,9 +136,7 @@ struct user_struct *alloc_uid(struct usestruct hlist_head *hashent =uidhashentry (ns, uid);struct user_struct *up, *new; -/* Make uid_hash_find() + uids_user_create() + uid_hash_insert() -* atomic. -*/ +/* Make uid_hash_find() + uid_hash_insert() atomic. */ spin_lock_irq (&uidhash_lock); up =uid_hash_find (uid, hashent);spin_unlock_irq (&uidhash_lock);
@@ -161,11 +158,6 @@ struct user_struct *alloc_uid(struct usespin_lock_irq (&uidhash_lock); up =uid_hash_find (uid, hashent);if (up) { -/* This case is not possible when CONFIG_USER_SCHED -* is defined, since we serialize alloc_uid() using -* uids_mutex. Hence no need to call -* sched_destroy_user() or remove_user_sysfs_dir(). -*/ key_put (new->uid_keyring);key_put (new->session_keyring);kmem_cache_free (uid_cachep, new);
PATCH 88/115 sched: Move sched_avg_update() to update_cpu_load()
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: da2b71edd8a7db44fe1746261410a981f3e03632 upstream
Currently sched_avg_update() (which updates rt_avg stats in the rq) is getting called from scale_rt_power() (in the load balance context) which doesn't take rq->lock.
Fix it by moving the sched_avg_update() to more appropriate update_cpu_load() where the CFS load gets updated as well.
LKML-Reference: <1282596171.2694.3.camel@sbsiddha-MOBL3>
--- kernel/sched.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
kernel/sched.c +6 -2
@@ -1255,6 +1255,10 @@ static void resched_task(struct task_strstatic void sched_rt_avg_update (struct rq *rq,u64 rt_delta) { } + +static void sched_avg_update (struct rq *rq) +{ +}#endif /* CONFIG_SMP */ #if BITS_PER_LONG ==32
@@ -3102,6 +3106,8 @@ static void update_cpu_load(struct rq *t this_rq->calc_load_update +=LOAD_FREQ ;calc_load_account_active (this_rq); } + +sched_avg_update (this_rq); }#ifdef CONFIG_SMP
@@ -3653,8 +3659,6 @@ unsigned long scale_rt_power(int cpu)struct rq *rq =cpu_rq (cpu);u64 total, available; -sched_avg_update (rq); - total =sched_avg_period () + (rq->clock - rq->age_stamp); available = total - rq->rt_avg;
PATCH 89/115 sched: Increment cache_nice_tries only on periodic lb
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 58b26c4c025778c09c7a1438ff185080e11b7d0a upstream
scheduler uses cache_nice_tries as an indicator to do cache_hot and active load balance, when normal load balance fails. Currently, this value is changed on any failed load balance attempt. That ends up being not so nice to workloads that enter/exit idle often, as they do more frequent new_idle balance and that pretty soon results in cache hot tasks being pulled in.
Making the cache_nice_tries ignore failed new_idle balance seems to make better sense. With that only the failed load balance in periodic load balance gets accounted and the rate of accumulation of cache_nice_tries will not depend on idle entry/exit (short running sleep-wakeup kind of tasks). This reduces movement of cache_hot tasks.
schedstat diff (after-before) excerpt from a workload that has frequent and short wakeup-idle pattern (:2 in cpu col below refers to NEWIDLE idx) This snapshot was across ~400 seconds.
Without this change:
domainstats: domain0
cpu cnt bln fld imb gain hgain nobusyq nobusyg
0:2 306487 219575 73167 110069413 44583 19070 1172 218403 1:2 292139 194853 81421 120893383 50745 21902 1259 193594 2:2 283166 174607 91359 129699642 54931 23688 1287 173320 3:2 273998 161788 93991 132757146 57122 24351 1366 160422 4:2 289851 215692 62190 83398383 36377 13680 851 214841 5:2 316312 222146 77605 117582154 49948 20281 988 221158 6:2 297172 195596 83623 122133390 52801 21301 929 194667 7:2 283391 178078 86378 126622761 55122 22239 928 177150 8:2 297655 210359 72995 110246694 45798 19777 1125 209234 9:2 297357 202011 79363 119753474 50953 22088 1089 200922 10:2 278797 178703 83180 122514385 52969 22726 1128 177575 11:2 272661 167669 86978 127342327 55857 24342 1195 166474 12:2 293039 204031 73211 110282059 47285 19651 948 203083 13:2 289502 196762 76803 114712942 49339 20547 1016 195746 14:2 264446 169609 78292 115715605 50459 21017 982 168627 15:2 260968 163660 80142 116811793 51483 21281 1064 162596
With this change:
domainstats: domain0
cpu cnt bln fld imb gain hgain nobusyq nobusyg
0:2 272347 187380 77455 105420270 24975 1 953 186427 1:2 267276 172360 86234 116242264 28087 6 1028 171332 2:2 259769 156777 93281 123243134 30555 1 1043 155734 3:2 250870 143129 97627 127370868 32026 6 1188 141941 4:2 248422 177116 64096 78261112 22202 2 757 176359 5:2 275595 180683 84950 116075022 29400 6 778 179905 6:2 262418 162609 88944 119256898 31056 4 817 161792 7:2 252204 147946 92646 122388300 32879 4 824 147122 8:2 262335 172239 81631 110477214 26599 4 864 171375 9:2 261563 164775 88016 117203621 28331 3 849 163926 10:2 243389 140949 93379 121353071 29585 2 909 140040 11:2 242795 134651 98310 124768957 30895 2 1016 133635 12:2 255234 166622 79843 104696912 26483 4 746 165876 13:2 244944 151595 83855 109808099 27787 3 801 150794 14:2 241301 140982 89935 116954383 30403 6 845 140137 15:2 232271 128564 92821 119185207 31207 4 1416 127148
LKML-Reference: <[email protected]>
--- kernel/sched.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
kernel/sched.c +8 -1
@@ -4250,7 +4250,14 @@ redo:if (!ld_moved) {schedstat_inc (sd, lb_failed[idle]); - sd->nr_balance_failed++; +/* +* Increment the failure counter only on periodic balance. +* We do not want newidle balance, which can be very +* frequent, pollute the failure counter causing +* excessive cache_hot migrations and active balances. +*/ +if (idle !=CPU_NEWLY_IDLE ) + sd->nr_balance_failed++;if (unlikely (sd->nr_balance_failed > sd->cache_nice_tries+2 )) {
PATCH 90/115 sched: Try not to migrate higher priority RT tasks
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 43fa5460fe60dea5c610490a1d263415419c60f6 upstream
When first working on the RT scheduler design, we concentrated on keeping all CPUs running RT tasks instead of having multiple RT tasks on a single CPU waiting for the migration thread to move them. Instead we take a more proactive stance and push or pull RT tasks from one CPU to another on wakeup or scheduling.
When an RT task wakes up on a CPU that is running another RT task, instead of preempting it and killing the cache of the running RT task, we look to see if we can migrate the RT task that is waking up, even if the RT task waking up is of higher priority.
This may sound a bit odd, but RT tasks should be limited in migration by the user anyway. But in practice, people do not do this, which causes high prio RT tasks to bounce around the CPUs. This becomes even worse when we have priority inheritance, because a high prio task can block on a lower prio task and boost its priority. When the lower prio task wakes up the high prio task, if it happens to be on the same CPU it will migrate off of it.
But in reality, the above does not happen much either, because the wake up of the lower prio task, which has already been boosted, if it was on the same CPU as the higher prio task, it would then migrate off of it. But anyway, we do not want to migrate them either.
To examine the scheduling, I created a test program and examined it under kernelshark. The test program created CPU * 2 threads, where each thread had a different priority. The program takes different options. The options used in this change log was to have priority inheritance mutexes or not.
All threads did the following loop:
static void grab_lock(long id, int iter, int l)
{
ftrace_write("thread %ld iter %d, taking lock %d\n",
id, iter, l);
pthread_mutex_lock(&locks[l]);
ftrace_write("thread %ld iter %d, took lock %d\n",
id, iter, l);
busy_loop(nr_tasks - id);
ftrace_write("thread %ld iter %d, unlock lock %d\n",
id, iter, l);
pthread_mutex_unlock(&locks[l]);
}void *start_task(void *id)
{
[...]
while (!done) {
for (l = 0; l < nr_locks; l++) {
grab_lock(id, i, l);
ftrace_write("thread %ld iter %d sleeping\n",
id, i);
ms_sleep(id);
}
i++;
}
[...]
}The busy_loop(ms) keeps the CPU spinning for ms milliseconds. The ms_sleep(ms) sleeps for ms milliseconds. The ftrace_write() writes to the ftrace buffer to help analyze via ftrace.
The higher the id, the higher the prio, the shorter it does the busy loop, but the longer it spins. This is usually the case with RT tasks, the lower priority tasks usually run longer than higher priority tasks.
At the end of the test, it records the number of loops each thread took, as well as the number of voluntary preemptions, non-voluntary preemptions, and number of migrations each thread took, taking the information from /proc/$$/sched and /proc/$$/status.
Running this on a 4 CPU processor, the results without changes to the kernel looked like this:
Task vol nonvol migrated iterations ---- --- ------ -------- ---------- 0: 53 3220 1470 98 1: 562 773 724 98 2: 752 933 1375 98 3: 749 39 697 98 4: 758 5 515 98 5: 764 2 679 99 6: 761 2 535 99 7: 757 3 346 99
total: 5156 4977 6341 787
Each thread regardless of priority migrated a few hundred times. The higher priority tasks, were a little better but still took quite an impact.
By letting higher priority tasks bump the lower prio task from the CPU, things changed a bit:
Task vol nonvol migrated iterations ---- --- ------ -------- ---------- 0: 37 2835 1937 98 1: 666 1821 1865 98 2: 654 1003 1385 98 3: 664 635 973 99 4: 698 197 352 99 5: 703 101 159 99 6: 708 1 75 99 7: 713 1 2 99
total: 4843 6594 6748 789
The total # of migrations did not change (several runs showed the difference all within the noise). But we now see a dramatic improvement to the higher priority tasks. (kernelshark showed that the watchdog timer bumped the highest priority task to give it the 2 count. This was actually consistent with every run).
Notice that the # of iterations did not change either.
The above was with priority inheritance mutexes. That is, when the higher prority task blocked on a lower priority task, the lower priority task would inherit the higher priority task (which shows why task 6 was bumped so many times). When not using priority inheritance mutexes, the current kernel shows this:
Task vol nonvol migrated iterations ---- --- ------ -------- ---------- 0: 56 3101 1892 95 1: 594 713 937 95 2: 625 188 618 95 3: 628 4 491 96 4: 640 7 468 96 5: 631 2 501 96 6: 641 1 466 96 7: 643 2 497 96
total: 4458 4018 5870 765
Not much changed with or without priority inheritance mutexes. But if we let the high priority task bump lower priority tasks on wakeup we see:
Task vol nonvol migrated iterations ---- --- ------ -------- ---------- 0: 115 3439 2782 98 1: 633 1354 1583 99 2: 652 919 1218 99 3: 645 713 934 99 4: 690 3 3 99 5: 694 1 4 99 6: 720 3 4 99 7: 747 0 1 100
Which shows a even bigger change. The big difference between task 3 and task 4 is because we have only 4 CPUs on the machine, causing the 4 highest prio tasks to always have preference.
Although I did not measure cache misses, and I'm sure there would be little to measure since the test was not data intensive, I could imagine large improvements for higher priority tasks when dealing with lower priority tasks. Thus, I'm satisfied with making the change and agreeing with what Gregory Haskins argued a few years ago when we first had this discussion.
One final note. All tasks in the above tests were RT tasks. Any RT task will always preempt a non RT task that is running on the CPU the RT task wants to run on.
LKML-Reference: <[email protected]>
--- kernel/sched_rt.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
kernel/sched_rt.c +12 -10
@@ -954,18 +954,18 @@ select_task_rq_rt(struct rq *rq, struct* runqueue. Otherwise simply start this RT task * on its current runqueue. * -* We want to avoid overloading runqueues. Even if -* the RT task is of higher priority than the current RT task. -* RT tasks behave differently than other tasks. If -* one gets preempted, we try to push it off to another queue. -* So trying to keep a preempting RT task on the same -* cache hot CPU will force the running RT task to -* a cold CPU. So we waste all the cache for the lower -* RT task in hopes of saving some of a RT task -* that is just being woken and probably will have -* cold cache anyway. +* We want to avoid overloading runqueues. If the woken +* task is a higher priority, then it will stay on this CPU +* and the lower prio task should be moved to another CPU. +* Even though this will probably make the lower prio task +* lose its cache, we do not want to bounce a higher task +* around just because it gave up its CPU, perhaps for a +* lock? +* +* For equal prio tasks, we just let the scheduler sort it out. */ if (unlikely (rt_task (rq->curr)) && + rq->curr->prio < p->prio && (p->rt.nr_cpus_allowed >1 )) {int cpu =find_lowest_rq (p);
@@ -1493,6 +1493,8 @@ static void task_woken_rt(struct rq *rq,if (!task_running (rq, p) && !test_tsk_need_resched (rq->curr) &&has_pushable_tasks (rq) && +rt_task (rq->curr) && + rq->curr->prio < p->prio && p->rt.nr_cpus_allowed >1 )push_rt_tasks (rq); }
PATCH 91/115 sched: Give CPU bound RT tasks preference
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From:: Steven Rostedt <[email protected]>
Commit: b3bc211cfe7d5fe94b310480d78e00bea96fbf2a upstream
If a high priority task is waking up on a CPU that is running a lower priority task that is bound to a CPU, see if we can move the high RT task to another CPU first. Note, if all other CPUs are running higher priority tasks than the CPU bounded current task, then it will be preempted regardless.
LKML-Reference: <[email protected]>
--- kernel/sched_rt.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
kernel/sched_rt.c +5 -3
@@ -965,7 +965,8 @@ select_task_rq_rt(struct rq *rq, struct* For equal prio tasks, we just let the scheduler sort it out. */ if (unlikely (rt_task (rq->curr)) && - rq->curr->prio < p->prio && + (rq->curr->rt.nr_cpus_allowed <2 || + rq->curr->prio < p->prio) && (p->rt.nr_cpus_allowed >1 )) {int cpu =find_lowest_rq (p);
@@ -1493,9 +1494,10 @@ static void task_woken_rt(struct rq *rq,if (!task_running (rq, p) && !test_tsk_need_resched (rq->curr) &&has_pushable_tasks (rq) && + p->rt.nr_cpus_allowed >1 &&rt_task (rq->curr) && - rq->curr->prio < p->prio && - p->rt.nr_cpus_allowed >1 ) + (rq->curr->rt.nr_cpus_allowed <2 || + rq->curr->prio < p->prio))push_rt_tasks (rq); }
PATCH 92/115 sched: suppress RCU lockdep splat in task_fork_fair
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: b0a0f667a349247bd7f05f806b662a25653822bc upstream
Quoted 11 lines
===================================================
[ INFO: suspiciousrcu_dereference_check()usage. ]
---------------------------------------------------/home/greearb/git/linux.wireless-testing/kernel/sched.c:618invokedrcu_dereference_check()without protection!other info that might help us debug this:
rcu_scheduler_active= 1,debug_locks= 1
1 lock held by ifup/23517:
#0: (&rq->lock){-.-.-.}, at: [<c042f782>]task_fork_fair+0x3b/0x108
Quoted 16 lines
stack backtrace: Pid: 23517, comm: ifup Not tainted 2.6.36-rc6-wl+ #5 Call Trace: [<c075e219>] ? printk+0xf/0x16 [<c0455842>] lockdep_rcu_dereference+0x74/0x7d [<c0426854>] task_group+0x6d/0x79 [<c042686e>] set_task_rq+0xe/0x57 [<c042f79e>] task_fork_fair+0x57/0x108 [<c042e965>] sched_fork+0x82/0xf9 [<c04334b3>] copy_process+0x569/0xe8e [<c0433ef0>] do_fork+0x118/0x262 [<c076302f>] ? do_page_fault+0x16a/0x2cf [<c044b80c>] ? up_read+0x16/0x2a [<c04085ae>] sys_clone+0x1b/0x20 [<c04030a5>] ptregs_clone+0x15/0x30 [<c0402f1c>] ? sysenter_do_call+0x12/0x38
Here a newly created task is having its runqueue assigned. The new task is not yet on the tasklist, so cannot go away. This is therefore a false positive, suppress with an RCU read-side critical section.
--- kernel/sched_fair.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
kernel/sched_fair.c +4 -1
@@ -1992,8 +1992,11 @@ static void task_fork_fair(struct task_supdate_rq_clock (rq); -if (unlikely (task_cpu (p) != this_cpu)) +if (unlikely (task_cpu (p) != this_cpu)) { +rcu_read_lock ();__set_task_cpu (p, this_cpu); +rcu_read_unlock (); + }update_curr (cfs_rq);
PATCH 93/115 sched: fix RCU lockdep splat from task_group()
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 6506cf6ce68d78a5470a8360c965dafe8e4b78e3 upstream
This addresses the following RCU lockdep splat:
[0.051203] CPU0: AMD QEMU Virtual CPU version 0.12.4 stepping 03
[0.052999] lockdep: fixing up alternatives.
[0.054105]
[0.054106] ===================================================
[0.054999] [ INFO: suspicious rcu_dereference_check() usage. ]
[0.054999] ---------------------------------------------------
[0.054999] kernel/sched.c:616 invoked rcu_dereference_check() without protection!
[0.054999]
[0.054999] other info that might help us debug this:
[0.054999]
[0.054999]
[0.054999] rcu_scheduler_active = 1, debug_locks = 1
[0.054999] 3 locks held by swapper/1:
[0.054999] #0: (cpu_add_remove_lock){+.+.+.}, at: [<ffffffff814be933>] cpu_up+0x42/0x6a
[0.054999] #1: (cpu_hotplug.lock){+.+.+.}, at: [<ffffffff810400d8>] cpu_hotplug_begin+0x2a/0x51
[0.054999] #2: (&rq->lock){-.-...}, at: [<ffffffff814be2f7>] init_idle+0x2f/0x113
[0.054999]
[0.054999] stack backtrace:
[0.054999] Pid: 1, comm: swapper Not tainted 2.6.35 #1
[0.054999] Call Trace:
[0.054999] [<ffffffff81068054>] lockdep_rcu_dereference+0x9b/0xa3
[0.054999] [<ffffffff810325c3>] task_group+0x7b/0x8a
[0.054999] [<ffffffff810325e5>] set_task_rq+0x13/0x40
[0.054999] [<ffffffff814be39a>] init_idle+0xd2/0x113
[0.054999] [<ffffffff814be78a>] fork_idle+0xb8/0xc7
[0.054999] [<ffffffff81068717>] ? mark_held_locks+0x4d/0x6b
[0.054999] [<ffffffff814bcebd>] do_fork_idle+0x17/0x2b
[0.054999] [<ffffffff814bc89b>] native_cpu_up+0x1c1/0x724
[0.054999] [<ffffffff814bcea6>] ? do_fork_idle+0x0/0x2b
[0.054999] [<ffffffff814be876>] _cpu_up+0xac/0x127
[0.054999] [<ffffffff814be946>] cpu_up+0x55/0x6a
[0.054999] [<ffffffff81ab562a>] kernel_init+0xe1/0x1ff
[0.054999] [<ffffffff81003854>] kernel_thread_helper+0x4/0x10
[0.054999] [<ffffffff814c353c>] ? restore_args+0x0/0x30
[0.054999] [<ffffffff81ab5549>] ? kernel_init+0x0/0x1ff
[0.054999] [<ffffffff81003850>] ? kernel_thread_helper+0x0/0x10
[0.056074] Booting Node 0, Processors #1lockdep: fixing up alternatives.
[0.130045] #2lockdep: fixing up alternatives.
[0.203089] #3 Ok.
[0.275286] Brought up 4 CPUs
[0.276005] Total of 4 processors activated (16017.17 BogoMIPS).The cgroup_subsys_state structures referenced by idle tasks are never freed, because the idle tasks should be part of the root cgroup, which is not removable.
The problem is that while we do in-fact hold rq->lock, the newly spawned idle thread's cpu is not yet set to the correct cpu so the lockdep check in task_group():
lockdep_is_held(&task_rq(p)->lock)
will fail.
But this is a chicken and egg problem. Setting the CPU's runqueue requires that the CPU's runqueue already be set. ;-)
So insert an RCU read-side critical section to avoid the complaint.
--- kernel/sched.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
kernel/sched.c +12 -0
@@ -7090,7 +7090,19 @@ void __cpuinit init_idle(struct task_str idle->se.exec_start =sched_clock ();cpumask_copy (&idle->cpus_allowed,cpumask_of (cpu)); +/* +* We're having a chicken and egg problem, even though we are +* holding rq->lock, the cpu isn't yet set to this cpu so the +* lockdep check in task_group() will fail. +* +* Similar case to sched_fork(). / Alternatively we could +* use task_rq_lock() here and obtain the other rq->lock. +* +* Silence PROVE_RCU +*/ +rcu_read_lock ();__set_task_cpu (idle, cpu); +rcu_read_unlock (); rq->curr = rq->idle = idle;#if defined(CONFIG_SMP ) && defined(__ARCH_WANT_UNLOCKED_CTXSW)
PATCH 94/115 sched: Do not consider SCHED_IDLE tasks to be cache hot
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: ef8002f6848236de5adc613063ebeabddea8a6fb upstream
This patch adds a check in task_hot to return if the task has SCHED_IDLE policy. SCHED_IDLE tasks have very low weight, and when run with regular workloads, are typically scheduled many milliseconds apart. There is no need to consider these tasks hot for load balancing.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/sched.c +3 -0
@@ -2014,6 +2014,9 @@ task_hot(struct task_struct *p, u64 now,if (p->sched_class != &fair_sched_class)return 0 ; +if (unlikely (p->policy ==SCHED_IDLE )) +return 0 ; +/* * Buddy candidates are cache hot: */
PATCH 95/115 sched: Set group_imb only a task can be pulled from the busiest cpu
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 2582f0eba54066b5e98ff2b27ef0cfa833b59f54 upstream
When cycling through sched groups to determine the busiest group, set group_imb only if the busiest cpu has more than 1 runnable task. This patch fixes the case where two cpus in a group have one runnable task each, but there is a large weight differential between these two tasks. The load balancer is unable to migrate any task from this group, and hence do not consider this group to be imbalanced.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
kernel/sched.c +7 -5
@@ -3745,7 +3745,7 @@ static inline void update_sg_lb_stats(st int local_group, const struct cpumask *cpus, int *balance, struct sg_lb_stats *sgs) { - unsigned long load, max_cpu_load, min_cpu_load; + unsigned long load, max_cpu_load, min_cpu_load, max_nr_running;int i;unsigned int balance_cpu =-1 , first_idle_cpu =0 ;unsigned long avg_load_per_task =0 ;
@@ -3759,6 +3759,7 @@ static inline void update_sg_lb_stats(st/* Tally up the load of all CPUs in the group */ max_cpu_load =0 ; min_cpu_load = ~0UL ; + max_nr_running =0 ;for_each_cpu_and (i,sched_group_cpus (group), cpus) {struct rq *rq =cpu_rq (i);
@@ -3776,8 +3777,10 @@ static inline void update_sg_lb_stats(st load =target_load (i, load_idx); }else { load =source_load (i, load_idx); -if (load > max_cpu_load) +if (load > max_cpu_load) { max_cpu_load = load; + max_nr_running = rq->nr_running; + }if (min_cpu_load > load) min_cpu_load = load; }
@@ -3815,11 +3818,10 @@ static inline void update_sg_lb_stats(stif (sgs->sum_nr_running) avg_load_per_task = sgs->sum_weighted_load / sgs->sum_nr_running; -if ((max_cpu_load - min_cpu_load) >2 *avg_load_per_task) +if ((max_cpu_load - min_cpu_load) >2 *avg_load_per_task && max_nr_running >1 ) sgs->group_imb =1 ; - sgs->group_capacity = -DIV_ROUND_CLOSEST (group->cpu_power,SCHED_LOAD_SCALE ); + sgs->group_capacity =DIV_ROUND_CLOSEST (group->cpu_power,SCHED_LOAD_SCALE ); }/**
PATCH 96/115 sched: Force balancing on newidle balance if local group has capacity
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: fab476228ba37907ad75216d0fd9732ada9c119e upstream
This patch forces a load balance on a newly idle cpu when the local group has extra capacity and the busiest group does not have any. It improves system utilization when balancing tasks with a large weight differential.
Under certain situations, such as a niced down task (i.e. nice = -15) in the presence of nr_cpus NICE0 tasks, the niced task lands on a sched group and kicks away other tasks because of its large weight. This leads to sub-optimal utilization of the machine. Even though the sched group has capacity, it does not pull tasks because sds.this_load >> sds.max_load, and f_b_g() returns NULL.
With this patch, if the local group has extra capacity, we shortcut the checks in f_b_g() and try to pull a task over. A sched group has extra capacity if the group capacity is greater than the number of running tasks in that group.
Thanks to Mike Galbraith for discussions leading to this patch and for the insight to reuse SD_NEWIDLE_BALANCE.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-)
kernel/sched.c +25 -3
@@ -3208,6 +3208,10 @@ static void pull_task(struct rq *src_rq,set_task_cpu (p, this_cpu);activate_task (this_rq, p,0 );check_preempt_curr (this_rq, p,0 ); + +/* re-arm NEWIDLE balancing when moving tasks */ + src_rq->avg_idle = this_rq->avg_idle =2 *sysctl_sched_migration_cost; + this_rq->idle_stamp =0 ; }/*
@@ -3425,12 +3429,14 @@ struct sd_lb_stats {unsigned long this_load;unsigned long this_load_per_task;unsigned long this_nr_running; +unsigned long this_has_capacity;/* Statistics of the busiest group */ unsigned long max_load;unsigned long busiest_load_per_task;unsigned long busiest_nr_running;unsigned long busiest_group_capacity; +unsigned long busiest_has_capacity;int group_imb;/* Is there imbalance in this sd */ #if defined(CONFIG_SCHED_MC ) || defined(CONFIG_SCHED_SMT )
@@ -3453,6 +3459,7 @@ struct sg_lb_stats {unsigned long sum_weighted_load;/* Weighted load of group's tasks */ unsigned long group_capacity;int group_imb;/* Is there an imbalance in the group ? */ +int group_has_capacity;/* Is there extra capacity in the group? */ };/**
@@ -3822,6 +3829,9 @@ static inline void update_sg_lb_stats(st sgs->group_imb =1 ; sgs->group_capacity =DIV_ROUND_CLOSEST (group->cpu_power,SCHED_LOAD_SCALE ); + +if (sgs->group_capacity > sgs->sum_nr_running) + sgs->group_has_capacity =1 ; }/**
@@ -3878,6 +3888,7 @@ static inline void update_sd_lb_stats(st sds->this = group; sds->this_nr_running = sgs.sum_nr_running; sds->this_load_per_task = sgs.sum_weighted_load; + sds->this_has_capacity = sgs.group_has_capacity; }else if (sgs.avg_load > sds->max_load && (sgs.sum_nr_running > sgs.group_capacity || sgs.group_imb)) {
@@ -3886,6 +3897,7 @@ static inline void update_sd_lb_stats(st sds->busiest_nr_running = sgs.sum_nr_running; sds->busiest_group_capacity = sgs.group_capacity; sds->busiest_load_per_task = sgs.sum_weighted_load; + sds->busiest_has_capacity = sgs.group_has_capacity; sds->group_imb = sgs.group_imb; }
@@ -4031,6 +4043,7 @@ static inline void calculate_imbalance(sreturn fix_small_imbalance (sds, this_cpu, imbalance); } +/******* find_busiest_group() helpers end here *********************/ /**
@@ -4082,6 +4095,11 @@ find_busiest_group(struct sched_domain ** 4) This group is more busy than the avg busieness at this * sched_domain. * 5) The imbalance is within the specified limit. +* +* Note: when doing newidle balance, if the local group has excess +* capacity (i.e. nr_running < group_capacity) and the busiest group +* does not have any capacity, we force a load balance to pull tasks +* to the local group. In this case, we skip past checks 3, 4 and 5. */ if (balance && !(*balance)) goto ret;
@@ -4089,6 +4107,11 @@ find_busiest_group(struct sched_domain *if (!sds.busiest || sds.busiest_nr_running ==0 ) goto out_balanced; +/* SD_BALANCE_NEWIDLE trumps SMP nice when underutilized */ +if (idle ==CPU_NEWLY_IDLE && sds.this_has_capacity && + !sds.busiest_has_capacity) + goto force_balance; +if (sds.this_load >= sds.max_load) goto out_balanced;
@@ -4100,6 +4123,7 @@ find_busiest_group(struct sched_domain *if (100 * sds.max_load <= sd->imbalance_pct * sds.this_load) goto out_balanced; +force_balance:/* Looks like there is an imbalance. Compute it */ calculate_imbalance (&sds, this_cpu, imbalance);return sds.busiest;
@@ -4515,10 +4539,8 @@ static void idle_balance(int this_cpu, s interval =msecs_to_jiffies (sd->balance_interval);if (time_after (next_balance, sd->last_balance + interval)) next_balance = sd->last_balance + interval; -if (pulled_task) { - this_rq->idle_stamp =0 ; +if (pulled_task)break ; - } }if (pulled_task ||time_after (jiffies, this_rq->next_balance)) {/*
PATCH 97/115 sched: Drop group_capacity to 1 only if local group has extra capacity
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 75dd321d79d495a0ee579e6249ebc38ddbb2667f upstream
When SD_PREFER_SIBLING is set on a sched domain, drop group_capacity to 1 only if the local group has extra capacity. The extra check prevents the case where you always pull from the heaviest group when it is already under-utilized (possible with a large weight task outweighs the tasks on the system).
For example, consider a 16-cpu quad-core quad-socket machine with MC and NUMA scheduling domains. Let's say we spawn 15 nice0 tasks and one nice-15 task, and each task is running on one core. In this case, we observe the following events when balancing at the NUMA domain:
- find_busiest_group() will always pick the sched group containing the niced task to be the busiest group.
- find_busiest_queue() will then always pick one of the cpus running the nice0 task (never picks the cpu with the nice -15 task since weighted_cpuload > imbalance).
- The load balancer fails to migrate the task since it is the running task and increments sd->nr_balance_failed.
- It repeats the above steps a few more times until sd->nr_balance_failed > 5, at which point it kicks off the active load balancer, wakes up the migration thread and kicks the nice 0 task off the cpu.
The load balancer doesn't stop until we kick out all nice 0 tasks from the sched group, leaving you with 3 idle cpus and one cpu running the nice -15 task.
When balancing at the NUMA domain, we drop sgs.group_capacity to 1 if the child domain (in this case MC) has SD_PREFER_SIBLING set. Subsequent load checks are not relevant because the niced task has a very large weight.
In this patch, we add an extra condition to the "if(prefer_sibling)" check in update_sd_lb_stats(). We drop the capacity of a group only if the local group has extra capacity, ie. nr_running < group_capacity. This patch preserves the original intent of the prefer_siblings check (to spread tasks across the system in low utilization scenarios) and fixes the case above.
It helps in the following ways:
- In low utilization cases (where nr_tasks << nr_cpus), we still drop group_capacity down to 1 if we prefer siblings.
- On very busy systems (where nr_tasks >> nr_cpus), sgs.nr_running will most likely be > sgs.group_capacity.
- When balancing large weight tasks, if the local group does not have extra capacity, we do not pick the group with the niced task as the busiest group. This prevents failed balances, active migration and the under-utilization described above.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
kernel/sched.c +7 -2
@@ -3878,9 +3878,14 @@ static inline void update_sd_lb_stats(st/* * In case the child domain prefers tasks go to siblings * first, lower the group capacity to one so that we'll try -* and move all the excess tasks away. +* and move all the excess tasks away. We lower the capacity +* of a group only if the local group has the capacity to fit +* these excess tasks, i.e. nr_running < group_capacity. The +* extra check prevents the case where you always pull from the +* heaviest group when it is already under-utilized (possible +* with a large weight task outweighs the tasks on the system). */ -if (prefer_sibling) +if (prefer_sibling && !local_group && sds->this_has_capacity) sgs.group_capacity =min (sgs.group_capacity,1UL );if (local_group) {
PATCH 98/115 sched: Fix softirq time accounting
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 75e1056f5c57050415b64cb761a3acc35d91f013 upstream
Peter Zijlstra found a bug in the way softirq time is accounted in VIRT_CPU_ACCOUNTING on this thread:
http://lkml.indiana.edu/hypermail//linux/kernel/1009.2/01366.html
The problem is, softirq processing uses local_bh_disable internally. There is no way, later in the flow, to differentiate between whether softirq is being processed or is it just that bh has been disabled. So, a hardirq when bh is disabled results in time being wrongly accounted as softirq.
Looking at the code a bit more, the problem exists in !VIRT_CPU_ACCOUNTING as well. As account_system_time() in normal tick based accouting also uses softirq_count, which will be set even when not in softirq with bh disabled.
Peter also suggested solution of using 2*SOFTIRQ_OFFSET as irq count for local_bh_{disable,enable} and using just SOFTIRQ_OFFSET while softirq processing. The patch below does that and adds API in_serving_softirq() which returns whether we are currently processing softirq or not.
Also changes one of the usages of softirq_count in net/sched/cls_cgroup.c to in_serving_softirq.
Looks like many usages of in_softirq really want in_serving_softirq. Those changes can be made individually on a case by case basis.
LKML-Reference: <[email protected]>
--- include/linux/hardirq.h | 5 ++++ include/linux/sched.h | 6 ++--- kernel/sched.c | 2 - kernel/softirq.c | 51 ++++++++++++++++++++++++++++++++---------------- net/sched/cls_cgroup.c | 2 - 5 files changed, 44 insertions(+), 22 deletions(-)
include/linux/hardirq.h +5 -0
@@ -64,6 +64,8 @@#define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT)#define NMI_OFFSET (1UL << NMI_SHIFT) +#define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) +#ifndef PREEMPT_ACTIVE #define PREEMPT_ACTIVE_BITS 1#define PREEMPT_ACTIVE_SHIFT (NMI_SHIFT + NMI_BITS)
@@ -82,10 +84,13 @@/* * Are we doing bottom half or hardware interrupt processing? * Are we in a softirq context? Interrupt context? +* in_softirq - Are we currently processing softirq or have bh disabled? +* in_serving_softirq - Are we currently processing softirq? */ #define in_irq () (hardirq_count())#define in_softirq () (softirq_count())#define in_interrupt () (irq_count()) +#define in_serving_softirq () (softirq_count() & SOFTIRQ_OFFSET)/* * Are we in NMI context?
include/linux/sched.h +3 -3
@@ -2401,9 +2401,9 @@ extern int __cond_resched_lock(spinlock_extern int __cond_resched_softirq (void ); -#define cond_resched_softirq () ({ \ - __might_sleep(__FILE__, __LINE__, SOFTIRQ_OFFSET); \ - __cond_resched_softirq(); \ +#define cond_resched_softirq () ({ \ + __might_sleep(__FILE__, __LINE__, SOFTIRQ_DISABLE_OFFSET); \ + __cond_resched_softirq(); \ })/*
kernel/sched.c +1 -1
@@ -5178,7 +5178,7 @@ void account_system_time(struct task_str tmp =cputime_to_cputime64 (cputime);if (hardirq_count () - hardirq_offset) cpustat->irq =cputime64_add (cpustat->irq, tmp); -else if (softirq_count ()) +else if (in_serving_softirq ()) cpustat->softirq =cputime64_add (cpustat->softirq, tmp);else cpustat->system =cputime64_add (cpustat->system, tmp);
kernel/softirq.c +34 -17
116 lines not on this page · raw message
net/sched/cls_cgroup.c +1 -1
@@ -110,7 +110,7 @@ static int cls_cgroup_classify(struct sk* calls by looking at the number of nested bh disable calls because * softirqs always disables bh. */ -if (softirq_count () !=SOFTIRQ_OFFSET ) +if (in_serving_softirq ())return -1 ;rcu_read_lock ();
PATCH 99/115 sched: Consolidate account_system_vtime extern declaration
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: e1e10a265d28273ab8c70be19d43dcbdeead6c5a upstream
Just a minor cleanup patch that makes things easier to the following patches. No functionality change in this patch.
LKML-Reference: <[email protected]>
--- arch/ia64/include/asm/system.h | 4 ---- arch/powerpc/include/asm/system.h | 4 ---- arch/s390/include/asm/system.h | 1 - include/linux/hardirq.h | 2 ++ 4 files changed, 2 insertions(+), 9 deletions(-)
arch/ia64/include/asm/system.h +0 -4
@@ -281,10 +281,6 @@ void cpu_idle_wait(void);void default_idle (void ); -#ifdef CONFIG_VIRT_CPU_ACCOUNTING -extern void account_system_vtime (struct task_struct *); -#endif -#endif /* __KERNEL__ */ #endif /* __ASSEMBLY__ */
arch/powerpc/include/asm/system.h +0 -4
@@ -540,10 +540,6 @@ extern void reloc_got2(unsigned long);#define PTRRELOC (x) ((typeof(x)) add_reloc_offset((unsigned long)(x))) -#ifdef CONFIG_VIRT_CPU_ACCOUNTING -extern void account_system_vtime (struct task_struct *); -#endif -extern struct dentry *powerpc_debugfs_root;#endif /* __KERNEL__ */
arch/s390/include/asm/system.h +0 -1
@@ -97,7 +97,6 @@ static inline void restore_access_regs(uextern void account_vtime (struct task_struct *,struct task_struct *);extern void account_tick_vtime (struct task_struct *); -extern void account_system_vtime (struct task_struct *);#ifdef CONFIG_PFAULT extern void pfault_irq_init (void );
include/linux/hardirq.h +2 -0
@@ -141,6 +141,8 @@ struct task_struct;static inline void account_system_vtime (struct task_struct *tsk) { } +#else +extern void account_system_vtime (struct task_struct *tsk);#endif #if defined(CONFIG_NO_HZ )
PATCH 100/115 sched: Remove unused PF_ALIGNWARN flag
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 637bbdc5b83615ef9f45f50399d1c7f27473c713 upstream
PF_ALIGNWARN is not implemented and it is for 486 as the comment.
It is not likely someone will implement this flag feature. So here remove this flag and leave the valuable 0x00000001 for future use.
LKML-Reference: <20100913121903.GB22238@darkstar>
--- include/linux/sched.h | 2 -- 1 file changed, 2 deletions(-)
include/linux/sched.h +0 -2
@@ -1728,8 +1728,6 @@ extern void thread_group_times(struct ta/* * Per process flags */ -#define PF_ALIGNWARN 0x00000001/* Print alignment warning msgs */ -/* Not implemented yet, only for 486*/ #define PF_STARTING 0x00000002/* being created */ #define PF_EXITING 0x00000004/* getting shut down */ #define PF_EXITPIDONE 0x00000008/* pi exit done on shut down */
PATCH 101/115 sched: Add a PF flag for ksoftirqd identification
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 6cdd5199daf0cb7b0fcc8dca941af08492612887 upstream
To account softirq time cleanly in scheduler, we need to identify whether softirq is invoked in ksoftirqd context or softirq at hardirq tail context. Add PF_KSOFTIRQD for that purpose.
As all PF flag bits are currently taken, create space by moving one of the infrequently used bits (PF_THREAD_BOUND) down in task_struct to be along with some other state fields.
LKML-Reference: <[email protected]>
--- include/linux/sched.h | 1 + kernel/softirq.c | 1 + 2 files changed, 2 insertions(+)
include/linux/sched.h +1 -0
@@ -1728,6 +1728,7 @@ extern void thread_group_times(struct ta/* * Per process flags */ +#define PF_KSOFTIRQD 0x00000001/* I am ksoftirqd */ #define PF_STARTING 0x00000002/* being created */ #define PF_EXITING 0x00000004/* getting shut down */ #define PF_EXITPIDONE 0x00000008/* pi exit done on shut down */
kernel/softirq.c +1 -0
@@ -718,6 +718,7 @@ static int ksoftirqd(void * __bind_cpu) {set_current_state (TASK_INTERRUPTIBLE ); + current->flags |=PF_KSOFTIRQD ;while (!kthread_should_stop ()) {preempt_disable ();if (!local_softirq_pending ()) {
PATCH 102/115 sched: Add IRQ_TIME_ACCOUNTING, finer accounting of irq time
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: b52bfee445d315549d41eacf2fa7c156e7d153d5 upstream
s390/powerpc/ia64 have support for CONFIG_VIRT_CPU_ACCOUNTING which does the fine granularity accounting of user, system, hardirq, softirq times. Adding that option on archs like x86 will be challenging however, given the state of TSC reliability on various platforms and also the overhead it will add in syscall entry exit.
Instead, add a lighter variant that only does finer accounting of hardirq and softirq times, providing precise irq times (instead of timer tick based samples). This accounting is added with a new config option CONFIG_IRQ_TIME_ACCOUNTING so that there won't be any overhead for users not interested in paying the perf penalty.
This accounting is based on sched_clock, with the code being generic. So, other archs may find it useful as well.
This patch just adds the core logic and does not enable this logic yet.
LKML-Reference: <[email protected]>
--- include/linux/hardirq.h | 2 - include/linux/sched.h | 13 ++++++++++++ kernel/sched.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-)
include/linux/hardirq.h +1 -1
@@ -137,7 +137,7 @@ extern void synchronize_irq(unsigned intstruct task_struct ; -#ifndef CONFIG_VIRT_CPU_ACCOUNTING +#if !defined(CONFIG_VIRT_CPU_ACCOUNTING ) && !defined(CONFIG_IRQ_TIME_ACCOUNTING )static inline void account_system_vtime (struct task_struct *tsk) { }
include/linux/sched.h +13 -0
@@ -1865,6 +1865,19 @@ extern void sched_clock_idle_wakeup_even*/ extern unsigned long long cpu_clock (int cpu); +#ifdef CONFIG_IRQ_TIME_ACCOUNTING +/* +* An i/f to runtime opt-in for irq time accounting based off of sched_clock. +* The reason for this explicit opt-in is not to have perf penalty with +* slow sched_clocks. +*/ +extern void enable_sched_clock_irqtime (void ); +extern void disable_sched_clock_irqtime (void ); +#else +static inline void enable_sched_clock_irqtime (void ) {} +static inline void disable_sched_clock_irqtime (void ) {} +#endif +extern unsigned long long task_sched_runtime (struct task_struct *task);extern unsigned long long thread_group_sched_runtime (struct task_struct *task);
kernel/sched.c +49 -0
55 lines not on this page · raw message
PATCH 103/115 x86: Add IRQ_TIME_ACCOUNTING
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: e82b8e4ea4f3dffe6e7939f90e78da675fcc450e upstream
This patch adds IRQ_TIME_ACCOUNTING option on x86 and runtime enables it when TSC is enabled.
This change just enables fine grained irq time accounting, isn't used yet. Following patches use it for different purposes.
LKML-Reference: <[email protected]>
--- Documentation/kernel-parameters.txt | 4 ++++ arch/x86/Kconfig | 11 +++++++++++ arch/x86/kernel/tsc.c | 8 ++++++++ 3 files changed, 23 insertions(+)
Documentation/kernel-parameters.txt +4 -0
@@ -2578,6 +2578,10 @@ and is between 256 and 4096 characters. disables clocksource verification at runtime. Used to enable high-resolution timer mode on older hardware, and in virtualized environment. + [x86] noirqtime: Do not use TSC to do irq accounting. + Used to run time disable IRQ_TIME_ACCOUNTING on any + platforms where RDTSC is slow and this accounting + can add overhead. turbografx.map[2|3]= [HW,JOY] TurboGraFX parallel port interface
arch/x86/Kconfig +11 -0
@@ -753,6 +753,17 @@ config SCHED_MC making when dealing with multi-core CPU chips at a cost of slightly increased overhead in some places. If unsure say N here. +config IRQ_TIME_ACCOUNTING + bool "Fine granularity task level IRQ time accounting" + default n + ---help--- + Select this option to enable fine granularity task irq time + accounting. This is done by reading a timestamp on each + transitions between softirq and hardirq state, so there can be a + small performance impact. + + If in doubt, say N here. + source "kernel/Kconfig.preempt" config X86_UP_APIC
arch/x86/kernel/tsc.c +8 -0
@@ -104,10 +104,14 @@ int __init notsc_setup(char *str)__setup ("notsc" , notsc_setup); +static int no_sched_irq_time; +static int __init tsc_setup (char *str) {if (!strcmp (str,"reliable" )) tsc_clocksource_reliable =1 ; +if (!strncmp (str,"noirqtime" ,9 )) + no_sched_irq_time =1 ;return 1 ; }
@@ -802,6 +806,7 @@ void mark_tsc_unstable(char *reason)if (!tsc_unstable) { tsc_unstable =1 ; sched_clock_stable =0 ; +disable_sched_clock_irqtime ();printk (KERN_INFO "Marking TSC unstable due to %s\n" , reason);/* Change only the rating, when not registered */ if (clocksource_tsc.mult)
@@ -990,6 +995,9 @@ void __init tsc_init(void)/* now allow native_sched_clock() to use rdtsc */ tsc_disabled =0 ; +if (!no_sched_irq_time) +enable_sched_clock_irqtime (); + lpj = ((u64 )tsc_khz *1000 );do_div (lpj,HZ ); lpj_fine = lpj;
PATCH 104/115 sched: Do not account irq time to current task
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 305e6835e05513406fa12820e40e4a8ecb63743c upstream
Scheduler accounts both softirq and interrupt processing times to the currently running task. This means, if the interrupt processing was for some other task in the system, then the current task ends up being penalized as it gets shorter runtime than otherwise.
Change sched task accounting to acoount only actual task time from currently running task. Now update_curr(), modifies the delta_exec to depend on rq->clock_task.
Note that this change only handles CONFIG_IRQ_TIME_ACCOUNTING case. We can extend this to CONFIG_VIRT_CPU_ACCOUNTING with minimal effort. But, thats for later.
This change will impact scheduling behavior in interrupt heavy conditions.
Tested on a 4-way system with eth0 handled by CPU 2 and a network heavy task (nc) running on CPU 3 (and no RSS/RFS). With that I have CPU 2 spending 75%+ of its time in irq processing. CPU 3 spending around 35% time running nc task.
Now, if I run another CPU intensive task on CPU 2, without this change /proc/<pid>/schedstat shows 100% of time accounted to this task. With this change, it rightly shows less than 25% accounted to this task as remaining time is actually spent on irq processing.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 40 ++++++++++++++++++++++++++++++++++++++-- kernel/sched_fair.c | 4 ++-- kernel/sched_rt.c | 8 ++++---- 3 files changed, 44 insertions(+), 8 deletions(-)
kernel/sched.c +38 -2
@@ -525,6 +525,7 @@ struct rq {struct mm_struct *prev_mm;u64 clock; +u64 clock_task;atomic_t nr_iowait;
@@ -620,9 +621,17 @@ static inline int cpu_of(struct rq *rq)#define cpu_curr (cpu) (cpu_rq(cpu)->curr)#define raw_rq () (&__raw_get_cpu_var(runqueues)) +static u64 irq_time_cpu (int cpu); +inline void update_rq_clock (struct rq *rq) { +int cpu =cpu_of (rq); +u64 irq_time; + rq->clock =sched_clock_cpu (cpu_of (rq)); + irq_time =irq_time_cpu (cpu); +if (rq->clock - irq_time > rq->clock_task) + rq->clock_task = rq->clock - irq_time; }/*
@@ -1809,6 +1818,18 @@ static inline void __set_task_cpu(struct#ifdef CONFIG_IRQ_TIME_ACCOUNTING +/* +* There are no locks covering percpu hardirq/softirq time. +* They are only modified in account_system_vtime, on corresponding CPU +* with interrupts disabled. So, writes are safe. +* They are read and saved off onto struct rq in update_rq_clock(). +* This may result in other CPU reading this CPU's irq time and can +* race with irq/account_system_vtime on this CPU. We would either get old +* or new value (or semi updated value on 32 bit) with a side effect of +* accounting a slice of irq time to wrong task when irq is in progress +* while we read rq->clock. That is a worthy compromise in place of having +* locks on each irq in account_system_time. +*/ static DEFINE_PER_CPU(u64, cpu_hardirq_time); static DEFINE_PER_CPU(u64, cpu_softirq_time);
@@ -1825,6 +1846,14 @@ void disable_sched_clock_irqtime(void) sched_clock_irqtime =0 ; } +static u64 irq_time_cpu (int cpu) +{ +if (!sched_clock_irqtime) +return 0 ; + +return per_cpu (cpu_softirq_time, cpu) +per_cpu (cpu_hardirq_time, cpu); +} +void account_system_vtime (struct task_struct *curr) {unsigned long flags;
@@ -1854,6 +1883,13 @@ void account_system_vtime(struct task_st local_irq_restore(flags); } +#else + +static u64 irq_time_cpu (int cpu) +{ +return 0 ; +} +#endif #include "sched_stats.h"
@@ -3295,7 +3331,7 @@ int can_migrate_task(struct task_struct* 2) too many balance attempts have failed. */ - tsk_cache_hot =task_hot (p, rq->clock, sd); + tsk_cache_hot =task_hot (p, rq->clock_task, sd);if (!tsk_cache_hot || sd->nr_balance_failed > sd->cache_nice_tries) {#ifdef CONFIG_SCHEDSTATS
@@ -5083,7 +5119,7 @@ static u64 do_task_delta_exec(struct tasif (task_current (rq, p)) {update_rq_clock (rq); - ns = rq->clock - p->se.exec_start; + ns = rq->clock_task - p->se.exec_start;if ((s64 )ns <0 ) ns =0 ; }
kernel/sched_fair.c +2 -2
@@ -496,7 +496,7 @@ __update_curr(struct cfs_rq *cfs_rq, strstatic void update_curr (struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr; -u64 now =rq_of (cfs_rq)->clock; +u64 now =rq_of (cfs_rq)->clock_task;unsigned long delta_exec;if (unlikely (!curr))
@@ -579,7 +579,7 @@ update_stats_curr_start(struct cfs_rq *c/* * We are starting a new run period: */ - se->exec_start =rq_of (cfs_rq)->clock; + se->exec_start =rq_of (cfs_rq)->clock_task; }/**************************************************
kernel/sched_rt.c +4 -4
@@ -603,7 +603,7 @@ static void update_curr_rt(struct rq *rqif (!task_has_rt_policy (curr))return ; - delta_exec = rq->clock - curr->se.exec_start; + delta_exec = rq->clock_task - curr->se.exec_start;if (unlikely ((s64 )delta_exec <0 )) delta_exec =0 ;
@@ -612,7 +612,7 @@ static void update_curr_rt(struct rq *rq curr->se.sum_exec_runtime += delta_exec;account_group_exec_runtime (curr, delta_exec); - curr->se.exec_start = rq->clock; + curr->se.exec_start = rq->clock_task;cpuacct_charge (curr, delta_exec);sched_rt_avg_update (rq, delta_exec);
@@ -1069,7 +1069,7 @@ static struct task_struct *_pick_next_ta }while (rt_rq); p =rt_task_of (rt_se); - p->se.exec_start = rq->clock; + p->se.exec_start = rq->clock_task;return p; }
@@ -1735,7 +1735,7 @@ static void set_curr_task_rt(struct rq * {struct task_struct *p = rq->curr; - p->se.exec_start = rq->clock; + p->se.exec_start = rq->clock_task;/* The running task is never eligible for pushing */ dequeue_pushable_task (rq, p);
PATCH 105/115 sched: Remove irq time from available CPU power
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: aa483808516ca5cacfa0e5849691f64fec25828e upstream
The idea was suggested by Peter Zijlstra here:
http://marc.info/?l=linux-kernel&m=127476934517534&w=2
irq time is technically not available to the tasks running on the CPU. This patch removes irq time from CPU power piggybacking on sched_rt_avg_update().
Tested this by keeping CPU X busy with a network intensive task having 75% oa a single CPU irq processing (hard+soft) on a 4-way system. And start seven cycle soakers on the system. Without this change, there will be two tasks on each CPU. With this change, there is a single task on irq busy CPU X and remaining 7 tasks are spread around among other 3 CPUs.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 26 +++++++++++++++++++++++++- kernel/sched_features.h | 5 +++++ 2 files changed, 30 insertions(+), 1 deletion(-)
kernel/sched.c +25 -1
@@ -553,6 +553,10 @@ struct rq {u64 avg_idle;#endif +#ifdef CONFIG_IRQ_TIME_ACCOUNTING +u64 prev_irq_time; +#endif +/* calc_load related fields */ unsigned long calc_load_update;long calc_load_active;
@@ -622,6 +626,7 @@ static inline int cpu_of(struct rq *rq)#define raw_rq () (&__raw_get_cpu_var(runqueues))static u64 irq_time_cpu (int cpu); +static void sched_irq_time_avg_update (struct rq *rq,u64 irq_time);inline void update_rq_clock (struct rq *rq) {
@@ -632,6 +637,8 @@ inline void update_rq_clock(struct rq *r irq_time =irq_time_cpu (cpu);if (rq->clock - irq_time > rq->clock_task) rq->clock_task = rq->clock - irq_time; + +sched_irq_time_avg_update (rq, irq_time); }/*
@@ -1883,6 +1890,15 @@ void account_system_vtime(struct task_st local_irq_restore(flags); } +static void sched_irq_time_avg_update (struct rq *rq,u64 curr_irq_time) +{ +if (sched_clock_irqtime &&sched_feat (NONIRQ_POWER )) { +u64 delta_irq = curr_irq_time - rq->prev_irq_time; + rq->prev_irq_time = curr_irq_time; +sched_rt_avg_update (rq, delta_irq); + } +} +#else static u64 irq_time_cpu (int cpu)
@@ -1890,6 +1906,8 @@ static u64 irq_time_cpu(int cpu) return 0; } +static void sched_irq_time_avg_update (struct rq *rq,u64 curr_irq_time) { } +#endif #include "sched_stats.h"
@@ -3755,7 +3773,13 @@ unsigned long scale_rt_power(int cpu)u64 total, available; total =sched_avg_period () + (rq->clock - rq->age_stamp); - available = total - rq->rt_avg; + +if (unlikely (total < rq->rt_avg)) { +/* Ensures that power won't end up being negative */ + available =0 ; + }else { + available = total - rq->rt_avg; + }if (unlikely ((s64 )total <SCHED_LOAD_SCALE )) total =SCHED_LOAD_SCALE ;
kernel/sched_features.h +5 -0
@@ -121,3 +121,8 @@ SCHED_FEAT(ASYM_EFF_LOAD, 1)* release the lock. Decreases scheduling overhead. */ SCHED_FEAT (OWNER_SPIN ,1 ) + +/* +* Decrement CPU power based on irq activity + */ +SCHED_FEAT (NONIRQ_POWER ,1 )
PATCH 106/115 sched: Call tick_check_idle before __irq_enter
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: d267f87fb8179c6dba03d08b91952e81bc3723c7 upstream
When CPU is idle and on first interrupt, irq_enter calls tick_check_idle() to notify interruption from idle. But, there is a problem if this call is done after __irq_enter, as all routines in __irq_enter may find stale time due to yet to be done tick_check_idle.
Specifically, trace calls in __irq_enter when they use global clock and also account_system_vtime change in this patch as it wants to use sched_clock_cpu() to do proper irq timing.
But, tick_check_idle was moved after __irq_enter intentionally to prevent problem of unneeded ksoftirqd wakeups by the commit ee5f80a:
irq: call __irq_enter() before calling the tick_idle_check
Impact: avoid spurious ksoftirqd wakeups
Moving tick_check_idle() before __irq_enter and wrapping it with local_bh_enable/disable would solve both the problems.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 2 +- kernel/softirq.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-)
kernel/sched.c +1 -1
@@ -1872,8 +1872,8 @@ void account_system_vtime(struct task_stlocal_irq_save (flags); - now =sched_clock (); cpu =smp_processor_id (); + now =sched_clock_cpu (cpu); delta = now -per_cpu (irq_start_time, cpu);per_cpu (irq_start_time, cpu) = now;/*
kernel/softirq.c +9 -3
@@ -296,10 +296,16 @@ void irq_enter(void)rcu_irq_enter ();if (idle_cpu (cpu) && !in_interrupt ()) { -__irq_enter (); +/* +* Prevent raise_softirq from needlessly waking up ksoftirqd +* here, as softirq will be serviced on return from interrupt. +*/ +local_bh_disable ();tick_check_idle (cpu); - }else -__irq_enter (); +_local_bh_enable (); + } + +__irq_enter (); }#ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED
PATCH 107/115 sched: Export account_system_vtime()
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: b7dadc38797584f6203386da1947ed5edf516646 upstream
KVM uses it for example:
ERROR: "account_system_vtime" [arch/x86/kvm/kvm.ko] undefined!
Cc: Venkatesh Pallipadi <[email protected]>
Cc: Peter Zijlstra <[email protected]>
LKML-Reference: <[email protected]>
--- kernel/sched.c | 1 + 1 file changed, 1 insertion(+)
kernel/sched.c +1 -0
@@ -1889,6 +1889,7 @@ void account_system_vtime(struct task_stlocal_irq_restore (flags); } +EXPORT_SYMBOL_GPL (account_system_vtime);static void sched_irq_time_avg_update (struct rq *rq,u64 curr_irq_time) {
PATCH 108/115 sched, cgroup: Fixup broken cgroup movement
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: b2b5ce022acf5e9f52f7b78c5579994fdde191d4 upstream
Dima noticed that we fail to correct the ->vruntime of sleeping tasks when we move them between cgroups.
LKML-Reference: <1287150604.29097.1513.camel@twins>
--- include/linux/sched.h | 2 +- kernel/sched.c | 8 ++++---- kernel/sched_fair.c | 25 +++++++++++++++++++------ 3 files changed, 24 insertions(+), 11 deletions(-)
include/linux/sched.h +1 -1
@@ -1113,7 +1113,7 @@ struct sched_class { struct task_struct *task);#ifdef CONFIG_FAIR_GROUP_SCHED -void (*moved_group) (struct task_struct *p,int on_rq); +void (*task_move_group) (struct task_struct *p,int on_rq);#endif };
kernel/sched.c +4 -4
@@ -10224,12 +10224,12 @@ void sched_move_task(struct task_structif (unlikely (running)) tsk->sched_class->put_prev_task (rq, tsk); -set_task_rq (tsk,task_cpu (tsk)); -#ifdef CONFIG_FAIR_GROUP_SCHED -if (tsk->sched_class->moved_group) - tsk->sched_class->moved_group (tsk, on_rq); +if (tsk->sched_class->task_move_group) + tsk->sched_class->task_move_group (tsk, on_rq); + else#endif +set_task_rq (tsk,task_cpu (tsk));if (unlikely (running)) tsk->sched_class->set_curr_task (rq);
kernel/sched_fair.c +19 -6
@@ -2068,13 +2068,26 @@ static void set_curr_task_fair(struct rq }#ifdef CONFIG_FAIR_GROUP_SCHED -static void moved_group_fair (struct task_struct *p,int on_rq) +static void task_move_group_fair (struct task_struct *p,int on_rq) { -struct cfs_rq *cfs_rq =task_cfs_rq (p); - -update_curr (cfs_rq); +/* +* If the task was not on the rq at the time of this cgroup movement +* it must have been asleep, sleeping tasks keep their ->vruntime +* absolute on their old rq until wakeup (needed for the fair sleeper +* bonus in place_entity()). +* +* If it was on the rq, we've just 'preempted' it, which does convert +* ->vruntime to a relative base. +* +* Make sure both cases convert their relative position when migrating +* to another cgroup's rq. This does somewhat interfere with the +* fair sleeper stuff for the first placement, but who cares. +*/ +if (!on_rq) + p->se.vruntime -=cfs_rq_of (&p->se)->min_vruntime; +set_task_rq (p,task_cpu (p));if (!on_rq) -place_entity (cfs_rq, &p->se,1 ); + p->se.vruntime +=cfs_rq_of (&p->se)->min_vruntime; }#endif
@@ -2128,7 +2141,7 @@ static const struct sched_class fair_sch .get_rr_interval = get_rr_interval_fair, #ifdef CONFIG_FAIR_GROUP_SCHED - .moved_group = moved_group_fair, + .task_move_group = task_move_group_fair,#endif };
PATCH 109/115 sched: Use group weight, idle cpu metrics to fix imbalances during idle
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: aae6d3ddd8b90f5b2c8d79a2b914d1706d124193 upstream
Currently we consider a sched domain to be well balanced when the imbalance is less than the domain's imablance_pct. As the number of cores and threads are increasing, current values of imbalance_pct (for example 25% for a NUMA domain) are not enough to detect imbalances like:
a) On a WSM-EP system (two sockets, each having 6 cores and 12 logical threads), 24 cpu-hogging tasks get scheduled as 13 on one socket and 11 on another socket. Leading to an idle HT cpu.
b) On a hypothetial 2 socket NHM-EX system (each socket having 8 cores and 16 logical threads), 16 cpu-hogging tasks can get scheduled as 9 on one socket and 7 on another socket. Leaving one core in a socket idle whereas in another socket we have a core having both its HT siblings busy.
While this issue can be fixed by decreasing the domain's imbalance_pct (by making it a function of number of logical cpus in the domain), it can potentially cause more task migrations across sched groups in an overloaded case.
Fix this by using imbalance_pct only during newly_idle and busy load balancing. And during idle load balancing, check if there is an imbalance in number of idle cpu's across the busiest and this sched_group or if the busiest group has more tasks than its weight that the idle cpu in this_group can pull.
LKML-Reference: <[email protected]>
--- include/linux/sched.h | 1 + kernel/sched.c | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-)
include/linux/sched.h +1 -0
@@ -894,6 +894,7 @@ struct sched_group {* single CPU. */ unsigned int cpu_power; +unsigned int group_weight;/* * The CPUs this group covers.
kernel/sched.c +33 -3
@@ -3534,13 +3534,16 @@ struct sd_lb_stats {unsigned long this_load_per_task;unsigned long this_nr_running;unsigned long this_has_capacity; +unsigned int this_idle_cpus;/* Statistics of the busiest group */ +unsigned int busiest_idle_cpus;unsigned long max_load;unsigned long busiest_load_per_task;unsigned long busiest_nr_running;unsigned long busiest_group_capacity;unsigned long busiest_has_capacity; +unsigned int busiest_group_weight;int group_imb;/* Is there imbalance in this sd */ #if defined(CONFIG_SCHED_MC ) || defined(CONFIG_SCHED_SMT )
@@ -3562,6 +3565,8 @@ struct sg_lb_stats {unsigned long sum_nr_running;/* Nr tasks running in the group */ unsigned long sum_weighted_load;/* Weighted load of group's tasks */ unsigned long group_capacity; +unsigned long idle_cpus; +unsigned long group_weight;int group_imb;/* Is there an imbalance in the group ? */ int group_has_capacity;/* Is there extra capacity in the group? */ };
@@ -3905,7 +3910,8 @@ static inline void update_sg_lb_stats(st sgs->group_load += load; sgs->sum_nr_running += rq->nr_running; sgs->sum_weighted_load +=weighted_cpuload (i); - +if (idle_cpu (i)) + sgs->idle_cpus++; }/*
@@ -3939,6 +3945,7 @@ static inline void update_sg_lb_stats(st sgs->group_imb =1 ; sgs->group_capacity =DIV_ROUND_CLOSEST (group->cpu_power,SCHED_LOAD_SCALE ); + sgs->group_weight = group->group_weight;if (sgs->group_capacity > sgs->sum_nr_running) sgs->group_has_capacity =1 ;
@@ -4004,13 +4011,16 @@ static inline void update_sd_lb_stats(st sds->this_nr_running = sgs.sum_nr_running; sds->this_load_per_task = sgs.sum_weighted_load; sds->this_has_capacity = sgs.group_has_capacity; + sds->this_idle_cpus = sgs.idle_cpus; }else if (sgs.avg_load > sds->max_load && (sgs.sum_nr_running > sgs.group_capacity || sgs.group_imb)) { sds->max_load = sgs.avg_load; sds->busiest = group; sds->busiest_nr_running = sgs.sum_nr_running; + sds->busiest_idle_cpus = sgs.idle_cpus; sds->busiest_group_capacity = sgs.group_capacity; + sds->busiest_group_weight = sgs.group_weight; sds->busiest_load_per_task = sgs.sum_weighted_load; sds->busiest_has_capacity = sgs.group_has_capacity; sds->group_imb = sgs.group_imb;
@@ -4235,8 +4245,26 @@ find_busiest_group(struct sched_domain *if (sds.this_load >= sds.avg_load) goto out_balanced; -if (100 * sds.max_load <= sd->imbalance_pct * sds.this_load) - goto out_balanced; +/* +* In the CPU_NEWLY_IDLE, use imbalance_pct to be conservative. +* And to check for busy balance use !idle_cpu instead of +* CPU_NOT_IDLE. This is because HT siblings will use CPU_NOT_IDLE +* even when they are idle. +*/ +if (idle ==CPU_NEWLY_IDLE || !idle_cpu (this_cpu)) { +if (100 * sds.max_load <= sd->imbalance_pct * sds.this_load) + goto out_balanced; + }else { +/* +* This cpu is idle. If the busiest group load doesn't +* have more tasks than the number of available cpu's and +* there is no imbalance between this and busiest group +* wrt to idle cpu's, it is balanced. +*/ +if ((sds.this_idle_cpus <= sds.busiest_idle_cpus +1 ) && + sds.busiest_nr_running <= sds.busiest_group_weight) + goto out_balanced; + } force_balance:/* Looks like there is an imbalance. Compute it */
@@ -8751,6 +8779,8 @@ static void init_sched_groups_power(intif (cpu !=group_first_cpu (sd->groups))return ; + sd->groups->group_weight =cpumask_weight (sched_group_cpus (sd->groups)); + child = sd->child; sd->groups->cpu_power =0 ;
PATCH 110/115 sched: Fix cross-sched-class wakeup preemption
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: 1e5a74059f9059d330744eac84873b1b99657008 upstream
Instead of dealing with sched classes inside each check_preempt_curr() implementation, pull out this logic into the generic wakeup preemption path.
This fixes a hang in KVM (and others) where we are waiting for the stop machine thread to run ...
LKML-Reference: <1288891946.2039.31.camel@laptop>
--- kernel/sched.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-)
kernel/sched.c +19 -5
@@ -594,11 +594,7 @@ struct rq { static DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); -static inline -void check_preempt_curr (struct rq *rq,struct task_struct *p,int flags) -{ - rq->curr->sched_class->check_preempt_curr (rq, p, flags); -} +static void check_preempt_curr (struct rq *rq,struct task_struct *p,int flags);static inline int cpu_of (struct rq *rq) {
@@ -2392,6 +2388,24 @@ void task_oncpu_function_call(struct taspreempt_enable (); } +static void check_preempt_curr (struct rq *rq,struct task_struct *p,int flags) +{ +const struct sched_class *class; + +if (p->sched_class == rq->curr->sched_class) { + rq->curr->sched_class->check_preempt_curr (rq, p, flags); + }else { +for_each_class (class) { +if (class == rq->curr->sched_class) +break ; +if (class == p->sched_class) { +resched_task (rq->curr); +break ; + } + } + } +} +#ifdef CONFIG_SMP /* * ->cpus_allowed is protected by either TASK_WAKING or rq->lock held.
PATCH 111/115 sched: Fix volanomark performance regression
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: b5482cfa1c95a188b3054fa33274806add91bbe5 upstream
Commit fab4762 triggers excessive idle balancing, causing a ~30% loss in volanomark throughput. Remove idle balancing throttle reset.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 4 ---- 1 file changed, 4 deletions(-)
kernel/sched.c +0 -4
@@ -3326,10 +3326,6 @@ static void pull_task(struct rq *src_rq,set_task_cpu (p, this_cpu);activate_task (this_rq, p,0 );check_preempt_curr (this_rq, p,0 ); - -/* re-arm NEWIDLE balancing when moving tasks */ - src_rq->avg_idle = this_rq->avg_idle =2 *sysctl_sched_migration_cost; - this_rq->idle_stamp =0 ; }/*
PATCH 112/115 sched: Fix idle balancing
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: d5ad140bc1505a98c0f040937125bfcbb508078f upstream
An earlier commit reverts idle balancing throttling reset to fix a 30% regression in volanomark throughput. We still need to reset idle_stamp when we pull a task in newidle balance.
LKML-Reference: <[email protected]>
--- kernel/sched.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/sched.c +3 -1
@@ -4692,8 +4692,10 @@ static void idle_balance(int this_cpu, s interval =msecs_to_jiffies (sd->balance_interval);if (time_after (next_balance, sd->last_balance + interval)) next_balance = sd->last_balance + interval; -if (pulled_task) +if (pulled_task) { + this_rq->idle_stamp =0 ;break ; + } }if (pulled_task ||time_after (jiffies, this_rq->next_balance)) {/*
PATCH 113/115 sched: Fix wake_affine() vs RT tasks
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Commit: e51fd5e22e12b39f49b1bb60b37b300b17378a43 upstream
Mike reports that since e9e9250b (sched: Scale down cpu_power due to RT tasks), wake_affine() goes funny on RT tasks due to them still having a !0 weight and wake_affine() still subtracts that from the rq weight.
Since nobody should be using se->weight for RT tasks, set the value to zero. Also, since we now use ->cpu_power to normalize rq weights to account for RT cpu usage, add that factor into the imbalance computation.
LKML-Reference: <1275316109.27810.22969.camel@twins>
--- kernel/sched.c | 25 +++++++------------------ kernel/sched_fair.c | 22 ++++++++++++++++------ 2 files changed, 23 insertions(+), 24 deletions(-)
kernel/sched.c +7 -18
@@ -533,6 +533,8 @@ struct rq {struct root_domain *rd;struct sched_domain *sd; +unsigned long cpu_power; +unsigned char idle_at_tick;/* For active balancing */ int post_schedule;
@@ -1520,24 +1522,9 @@ static unsigned long target_load(int cpureturn max (rq->cpu_load[type-1 ], total); } -static struct sched_group *group_of (int cpu) -{ -struct sched_domain *sd =rcu_dereference (cpu_rq (cpu)->sd); - -if (!sd) -return NULL ; - -return sd->groups; -} -static unsigned long power_of (int cpu) { -struct sched_group *group =group_of (cpu); - -if (!group) -return SCHED_LOAD_SCALE ; - -return group->cpu_power; +return cpu_rq (cpu)->cpu_power; }static int task_hot (struct task_struct *p,u64 now,struct sched_domain *sd);
@@ -1932,8 +1919,8 @@ static void dec_nr_running(struct rq *rqstatic void set_load_weight (struct task_struct *p) {if (task_has_rt_policy (p)) { - p->se.load.weight = prio_to_weight[0 ] *2 ; - p->se.load.inv_weight = prio_to_wmult[0 ] >>1 ; + p->se.load.weight =0 ; + p->se.load.inv_weight =WMULT_CONST ;return ; }
@@ -3833,6 +3820,7 @@ static void update_cpu_power(struct scheif (!power) power =1 ; +cpu_rq (cpu)->cpu_power = power; sdg->cpu_power = power; }
@@ -9788,6 +9776,7 @@ void __init sched_init(void)#ifdef CONFIG_SMP rq->sd =NULL ; rq->rd =NULL ; + rq->cpu_power =SCHED_LOAD_SCALE ; rq->post_schedule =0 ; rq->active_balance =0 ; rq->next_balance = jiffies;
kernel/sched_fair.c +16 -6
@@ -1222,7 +1222,6 @@ static int wake_affine(struct sched_domaunsigned long this_load, load;int idx, this_cpu, prev_cpu;unsigned long tl_per_task; -unsigned int imbalance;struct task_group *tg;unsigned long weight;int balanced;
@@ -1262,8 +1261,6 @@ static int wake_affine(struct sched_doma tg =task_group (p); weight = p->se.load.weight; - imbalance =100 + (sd->imbalance_pct -100 ) /2 ; -/* * In low-load situations, where prev_cpu is idle and this_cpu is idle * due to the sync cause above having dropped this_load to 0, we'll
@@ -1273,9 +1270,22 @@ static int wake_affine(struct sched_doma* Otherwise check if either cpus are near enough in load to allow this * task to be woken on this_cpu. */ - balanced = !this_load || -100 *(this_load +effective_load (tg, this_cpu, weight, weight)) <= - imbalance*(load +effective_load (tg, prev_cpu,0 , weight)); +if (this_load) { +unsigned long this_eff_load, prev_eff_load; + + this_eff_load =100 ; + this_eff_load *=power_of (prev_cpu); + this_eff_load *= this_load + +effective_load (tg, this_cpu, weight, weight); + + prev_eff_load =100 + (sd->imbalance_pct -100 ) /2 ; + prev_eff_load *=power_of (this_cpu); + prev_eff_load *= load +effective_load (tg, prev_cpu,0 , weight); + + balanced = this_eff_load <= prev_eff_load; + }else + balanced = true; +rcu_read_unlock ();/*
PATCH 114/115 sched: Remove some dead code
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Dan Carpenter <[email protected]>
commit 618765801ebc271fe0ba3eca99fcfd62a1f786e1 upstream.
This was left over from "7c9414385e sched: Remove USER_SCHED"
LKML-Reference: <20100315082148.GD18181@bicker>
--- kernel/user.c | 2 -- 1 file changed, 2 deletions(-)
kernel/user.c +0 -2
@@ -170,8 +170,6 @@ struct user_struct *alloc_uid(struct usereturn up; -put_user_ns (new->user_ns); -kmem_cache_free (uid_cachep, new); out_unlock:return NULL ; }
Re: [114/115] sched: Remove some dead code
Quoted 5 lines · Greg KH
2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
Quoted 7 lines
From: Dan Carpenter <[email protected]>
commit
618765801ebc271fe0ba3eca99fcfd62a1f786e1upstream.This was left over from "
7c9414385esched: RemoveUSER_SCHED"Signed-off-by Dan Carpenter <[email protected]>
This is just a cleanup patch. It doesn't really warrant backporting.
regards,
dan carpenter
Re: [114/115] sched: Remove some dead code
Quoted 8 lines · Dan Carpenter
Quoted 7 lines · Greg KH
2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Dan Carpenter <[email protected]>
Quoted 7 lines
Quoted 5 lines
commit
618765801ebc271fe0ba3eca99fcfd62a1f786e1upstream.This was left over from "
7c9414385esched: RemoveUSER_SCHED"Signed-off-by Dan Carpenter <[email protected]>This is just a cleanup patch. It doesn't really warrant backporting.
There's no reason to leave the dirt lying about though.
-Mike
Re: [114/115] sched: Remove some dead code
Quoted 11 lines · Mike Galbraith
Quoted 10 lines · Dan Carpenter
Quoted 9 lines · Greg KH
2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Dan Carpenter <[email protected]>
commit
618765801ebc271fe0ba3eca99fcfd62a1f786e1upstream.
Quoted 7 lines
Quoted 5 lines
Quoted 3 lines
This was left over from "
7c9414385esched: RemoveUSER_SCHED"Signed-off-by Dan Carpenter <[email protected]>This is just a cleanup patch. It doesn't really warrant backporting.
There's no reason to leave the dirt lying about though.
That's not the threshold for -stable backporting though.
A patch is eligible for -stable if and only if it's eligible for sending it to Linus via tip:sched/urgent as well: i.e. important bugfix or fresh regression.
Now, a cleanup patch might still be eligible to be sent to Linus if for some reason it's absolutely required for a fix - but in general we do not backport them.
The risk to -stable is obvious: instead of having a well-known .32 scheduler we have this morphing code that no-one has really tested in that form.
So while i dont mind the series you sent, please lets be *much* more careful with -stable backports in the future. Rule #1: if you ever have to ask yourself whether a patch is -stable eligible it probably isnt.
Thanks,
Ingo
Re: [Stable-review] [114/115] sched: Remove some dead code
Quoted 30 lines · Ingo Molnar
Quoted 11 lines · Mike Galbraith
Quoted 10 lines · Dan Carpenter
Quoted 9 lines · Greg KH
2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Dan Carpenter <[email protected]>
commit
618765801ebc271fe0ba3eca99fcfd62a1f786e1upstream.Quoted 7 lines
Quoted 5 lines
Quoted 3 lines
This was left over from "
7c9414385esched: RemoveUSER_SCHED"Signed-off-by Dan Carpenter <[email protected]>This is just a cleanup patch. It doesn't really warrant backporting.
There's no reason to leave the dirt lying about though.
That's not the threshold for -stable backporting though.
A patch is eligible for -stable if and only if it's eligible for sending it to Linus via tip:sched/urgent as well: i.e. important bugfix or fresh regression.
Now, a cleanup patch might still be eligible to be sent to Linus if for some reason it's absolutely required for a fix - but in general we do not backport them.
Quoted 6 lines
The risk to -stable is obvious: instead of having a well-known .32 scheduler we have this morphing code that no-one has really tested in that form.
So while i dont mind the series you sent, please lets be *much* more careful with -stable backports in the future. Rule #1: if you ever have to ask yourself whether a patch is -stable eligible it probably isnt.
Sometimes cleanup patches make the work easier for stable maintainers because further patches apply without conflicts. It happened to me from time to time in the past to merge such patches because I got bored of systematically having to manually apply patches. But I agree with you that generally we should avoid to merge such patches.
In my opinion the right question to ask oneself about the eligibility of a patch is how you'd justify it to your end users. If you can justify it by an improvement they can perceive (reliability, security, speed) then it may be worth it. If it's just "that code was not used anymore", they'll start to lose trust.
Regards,
Willy
PATCH 115/115 kernel/user.c: add lock release annotation on free_user()
In reply to Greg KH2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Namhyung Kim <[email protected]>
commit 571428be550fbe37160596995e96ad398873fcbd upstream.
free_user() releases uidhash_lock but was missing annotation. Add it. This removes following sparse warnings:
include/linux/spinlock.h:339:9: warning: context imbalance in 'free_user' - unexpected unlock kernel/user.c:120:6: warning: context imbalance in 'free_uid' - wrong count at exit
--- kernel/user.c | 1 + 1 file changed, 1 insertion(+)
kernel/user.c +1 -0
@@ -91,6 +91,7 @@ static struct user_struct *uid_hash_find* upon function exit. */ static void free_user (struct user_struct *up,unsigned long flags) + __releases(&uidhash_lock) {uid_hash_remove (up);spin_unlock_irqrestore (&uidhash_lock, flags);
Quoted 6 lines · Greg KH
This is the start of the longterm review cycle for the 2.6.32.29 release. There are 115 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Quoted 6 lines
Responses should be made by Friday, Feb 18, 2011 00:00:00 UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/longterm-review/patch-2.6.32.29-rc1.gzand the diffstat can be found below.
Is it too late to add e7a3481c0246c8e45e79c629efd63b168e91fcda per
http://marc.info/?l=xen-devel&m=129620431305101 ?
Thanks,
Ian.
Quoted 10 lines · Ian Campbell
Quoted 9 lines · Greg KH
This is the start of the longterm review cycle for the 2.6.32.29 release. There are 115 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Friday, Feb 18, 2011 00:00:00 UTC. Anything received after that time might be too late.
Quoted 6 lines
Quoted 3 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/longterm-review/patch-2.6.32.29-rc1.gzand the diffstat can be found below.
Is it too late to add
e7a3481c0246c8e45e79c629efd63b168e91fcdaper
http://marc.info/?l=xen-devel&m=129620431305101 ?
Now queued up for the next .32 release after this one.
thanks,
greg k-h
Quoted 11 lines · Greg KH
Quoted 10 lines · Ian Campbell
Quoted 9 lines · Greg KH
This is the start of the longterm review cycle for the 2.6.32.29 release. There are 115 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Friday, Feb 18, 2011 00:00:00 UTC. Anything received after that time might be too late.
Quoted 8 lines
Quoted 6 lines
Quoted 3 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/longterm-review/patch-2.6.32.29-rc1.gzand the diffstat can be found below.
Is it too late to add
e7a3481c0246c8e45e79c629efd63b168e91fcdaper
http://marc.info/?l=xen-devel&m=129620431305101 ?Now queued up for the next .32 release after this one.
Thank you.
Ian.