diff options
author | Anthony G. Basile <blueness@gentoo.org> | 2012-08-02 07:40:28 -0400 |
---|---|---|
committer | Anthony G. Basile <blueness@gentoo.org> | 2012-08-02 07:40:28 -0400 |
commit | 5c6012a4fec4d07de27741ea0a49592a673720c7 (patch) | |
tree | 62bc83a5f6fd1e1f1b3cdc00fa2b0e6ca276ef2f | |
parent | Grsec/PaX: 2.9.1-{2.6.32.59,3.2.24,3.4.6}-201208011848 (diff) | |
download | hardened-patchset-5c6012a4fec4d07de27741ea0a49592a673720c7.tar.gz hardened-patchset-5c6012a4fec4d07de27741ea0a49592a673720c7.tar.bz2 hardened-patchset-5c6012a4fec4d07de27741ea0a49592a673720c7.zip |
Grsec/PaX: 2.9.1-3.4.7-201208011848 - fixed20120801
-rw-r--r-- | 3.4.6/1005_linux-3.4.6.patch | 1459 | ||||
-rw-r--r-- | 3.4.7/0000_README (renamed from 3.4.6/0000_README) | 4 | ||||
-rw-r--r-- | 3.4.7/4420_grsecurity-2.9.1-3.4.7-201208011850.patch (renamed from 3.4.6/4420_grsecurity-2.9.1-3.4.7-201208011850.patch) | 0 | ||||
-rw-r--r-- | 3.4.7/4430_grsec-remove-localversion-grsec.patch (renamed from 3.4.6/4430_grsec-remove-localversion-grsec.patch) | 0 | ||||
-rw-r--r-- | 3.4.7/4435_grsec-mute-warnings.patch (renamed from 3.4.6/4435_grsec-mute-warnings.patch) | 0 | ||||
-rw-r--r-- | 3.4.7/4440_grsec-remove-protected-paths.patch (renamed from 3.4.6/4440_grsec-remove-protected-paths.patch) | 0 | ||||
-rw-r--r-- | 3.4.7/4450_grsec-kconfig-default-gids.patch (renamed from 3.4.6/4450_grsec-kconfig-default-gids.patch) | 0 | ||||
-rw-r--r-- | 3.4.7/4465_selinux-avc_audit-log-curr_ip.patch (renamed from 3.4.6/4465_selinux-avc_audit-log-curr_ip.patch) | 0 | ||||
-rw-r--r-- | 3.4.7/4470_disable-compat_vdso.patch (renamed from 3.4.6/4470_disable-compat_vdso.patch) | 0 | ||||
-rw-r--r-- | 3.4.7/4480_fix-scsi-lpfc-Werror.patch (renamed from 3.4.6/4480_fix-scsi-lpfc-Werror.patch) | 0 |
10 files changed, 0 insertions, 1463 deletions
diff --git a/3.4.6/1005_linux-3.4.6.patch b/3.4.6/1005_linux-3.4.6.patch deleted file mode 100644 index e5c2aa1..0000000 --- a/3.4.6/1005_linux-3.4.6.patch +++ /dev/null @@ -1,1459 +0,0 @@ -diff --git a/Makefile b/Makefile -index a2e69a0..5d0edcb 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 3 - PATCHLEVEL = 4 --SUBLEVEL = 5 -+SUBLEVEL = 6 - EXTRAVERSION = - NAME = Saber-toothed Squirrel - -diff --git a/arch/arm/plat-samsung/adc.c b/arch/arm/plat-samsung/adc.c -index 33ecd0c..b1e05cc 100644 ---- a/arch/arm/plat-samsung/adc.c -+++ b/arch/arm/plat-samsung/adc.c -@@ -157,11 +157,13 @@ int s3c_adc_start(struct s3c_adc_client *client, - return -EINVAL; - } - -- if (client->is_ts && adc->ts_pend) -- return -EAGAIN; -- - spin_lock_irqsave(&adc->lock, flags); - -+ if (client->is_ts && adc->ts_pend) { -+ spin_unlock_irqrestore(&adc->lock, flags); -+ return -EAGAIN; -+ } -+ - client->channel = channel; - client->nr_samples = nr_samples; - -diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c -index 23ce096..fe66260 100644 ---- a/drivers/acpi/acpica/nspredef.c -+++ b/drivers/acpi/acpica/nspredef.c -@@ -638,7 +638,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data, - /* Create the new outer package and populate it */ - - status = -- acpi_ns_wrap_with_package(data, *elements, -+ acpi_ns_wrap_with_package(data, return_object, - return_object_ptr); - if (ACPI_FAILURE(status)) { - return (status); -diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c -index c850de4..eff7222 100644 ---- a/drivers/acpi/processor_core.c -+++ b/drivers/acpi/processor_core.c -@@ -189,10 +189,12 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) - * Processor (CPU3, 0x03, 0x00000410, 0x06) {} - * } - * -- * Ignores apic_id and always return 0 for CPU0's handle. -+ * Ignores apic_id and always returns 0 for the processor -+ * handle with acpi id 0 if nr_cpu_ids is 1. -+ * This should be the case if SMP tables are not found. - * Return -1 for other CPU's handle. - */ -- if (acpi_id == 0) -+ if (nr_cpu_ids <= 1 && acpi_id == 0) - return acpi_id; - else - return apic_id; -diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c -index 2da025e..7f1ea56 100644 ---- a/drivers/clk/clk.c -+++ b/drivers/clk/clk.c -@@ -834,18 +834,21 @@ static void clk_change_rate(struct clk *clk) - { - struct clk *child; - unsigned long old_rate; -+ unsigned long best_parent_rate = 0; - struct hlist_node *tmp; - - old_rate = clk->rate; - -+ if (clk->parent) -+ best_parent_rate = clk->parent->rate; -+ - if (clk->ops->set_rate) - clk->ops->set_rate(clk->hw, clk->new_rate); - - if (clk->ops->recalc_rate) -- clk->rate = clk->ops->recalc_rate(clk->hw, -- clk->parent->rate); -+ clk->rate = clk->ops->recalc_rate(clk->hw, best_parent_rate); - else -- clk->rate = clk->parent->rate; -+ clk->rate = best_parent_rate; - - if (clk->notifier_count && old_rate != clk->rate) - __clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate); -diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c -index 299d238..899c712 100644 ---- a/drivers/hid/hid-apple.c -+++ b/drivers/hid/hid-apple.c -@@ -514,6 +514,12 @@ static const struct hid_device_id apple_devices[] = { - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), - .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), -+ .driver_data = APPLE_HAS_FN }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), -+ .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), -+ .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 4da66b4..054677b 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -1379,6 +1379,9 @@ static const struct hid_device_id hid_have_special_driver[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, -@@ -1914,6 +1917,7 @@ static const struct hid_device_id hid_ignore_list[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) }, - { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) }, - { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_BEATPAD) }, - { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) }, - { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) }, - { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, -@@ -2008,6 +2012,9 @@ static const struct hid_device_id hid_mouse_ignore_list[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, - { } -diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h -index e39aecb..dfd4098 100644 ---- a/drivers/hid/hid-ids.h -+++ b/drivers/hid/hid-ids.h -@@ -125,6 +125,9 @@ - #define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c - #define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d - #define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e -+#define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 -+#define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 -+#define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 - #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239 - #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a - #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b -@@ -509,6 +512,9 @@ - #define USB_DEVICE_ID_CRYSTALTOUCH 0x0006 - #define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007 - -+#define USB_VENDOR_ID_MADCATZ 0x0738 -+#define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540 -+ - #define USB_VENDOR_ID_MCC 0x09db - #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 - #define USB_DEVICE_ID_MCC_PMD1208LS 0x007a -diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c -index 0b204e4..f524882 100644 ---- a/drivers/hwmon/it87.c -+++ b/drivers/hwmon/it87.c -@@ -2157,7 +2157,7 @@ static void __devinit it87_init_device(struct platform_device *pdev) - - /* Start monitoring */ - it87_write_value(data, IT87_REG_CONFIG, -- (it87_read_value(data, IT87_REG_CONFIG) & 0x36) -+ (it87_read_value(data, IT87_REG_CONFIG) & 0x3e) - | (update_vbat ? 0x41 : 0x01)); - } - -diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c -index fd7a0d5..42f7b25 100644 ---- a/drivers/input/joystick/xpad.c -+++ b/drivers/input/joystick/xpad.c -@@ -142,6 +142,7 @@ static const struct xpad_device { - { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX }, - { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, - { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, -+ { 0x0d2f, 0x0002, "Andamiro Pump It Up pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, - { 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX }, - { 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX }, - { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX }, -@@ -164,6 +165,7 @@ static const struct xpad_device { - { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, - { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, - { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, -+ { 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, - { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, - { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } - }; -@@ -238,12 +240,14 @@ static struct usb_device_id xpad_table [] = { - XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ - XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ - XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ -+ { USB_DEVICE(0x0738, 0x4540) }, /* Mad Catz Beat Pad */ - XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ - XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */ - XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ - XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */ - XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ -- XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ -+ XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ -+ XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */ - { } - }; - -diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c -index f9e2758..e410b98 100644 ---- a/drivers/input/mouse/bcm5974.c -+++ b/drivers/input/mouse/bcm5974.c -@@ -79,6 +79,10 @@ - #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252 - #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253 - #define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254 -+/* MacbookPro10,1 (unibody, June 2012) */ -+#define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 -+#define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 -+#define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 - - #define BCM5974_DEVICE(prod) { \ - .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ -@@ -128,6 +132,10 @@ static const struct usb_device_id bcm5974_table[] = { - BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI), - BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO), - BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), -+ /* MacbookPro10,1 */ -+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), -+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), -+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), - /* Terminating entry */ - {} - }; -@@ -354,6 +362,18 @@ static const struct bcm5974_config bcm5974_config_table[] = { - { DIM_X, DIM_X / SN_COORD, -4620, 5140 }, - { DIM_Y, DIM_Y / SN_COORD, -150, 6600 } - }, -+ { -+ USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI, -+ USB_DEVICE_ID_APPLE_WELLSPRING7_ISO, -+ USB_DEVICE_ID_APPLE_WELLSPRING7_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, -4750, 5280 }, -+ { DIM_Y, DIM_Y / SN_COORD, -150, 6730 } -+ }, - {} - }; - -diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c -index d7e9577..d1f74ab 100644 ---- a/drivers/md/raid1.c -+++ b/drivers/md/raid1.c -@@ -2486,9 +2486,10 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp - */ - if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { - atomic_set(&r1_bio->remaining, read_targets); -- for (i = 0; i < conf->raid_disks * 2; i++) { -+ for (i = 0; i < conf->raid_disks * 2 && read_targets; i++) { - bio = r1_bio->bios[i]; - if (bio->bi_end_io == end_sync_read) { -+ read_targets--; - md_sync_acct(bio->bi_bdev, nr_sectors); - generic_make_request(bio); - } -diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c -index 00a6732..39eab73 100644 ---- a/drivers/media/dvb/dvb-core/dvbdev.c -+++ b/drivers/media/dvb/dvb-core/dvbdev.c -@@ -243,6 +243,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, - if (minor == MAX_DVB_MINORS) { - kfree(dvbdevfops); - kfree(dvbdev); -+ up_write(&minor_rwsem); - mutex_unlock(&dvbdev_register_lock); - return -EINVAL; - } -diff --git a/drivers/media/video/cx231xx/cx231xx-audio.c b/drivers/media/video/cx231xx/cx231xx-audio.c -index a2c2b7d..e5742a0 100644 ---- a/drivers/media/video/cx231xx/cx231xx-audio.c -+++ b/drivers/media/video/cx231xx/cx231xx-audio.c -@@ -307,7 +307,7 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev) - urb->context = dev; - urb->pipe = usb_rcvisocpipe(dev->udev, - dev->adev.end_point_addr); -- urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; -+ urb->transfer_flags = URB_ISO_ASAP; - urb->transfer_buffer = dev->adev.transfer_buffer[i]; - urb->interval = 1; - urb->complete = cx231xx_audio_isocirq; -@@ -368,7 +368,7 @@ static int cx231xx_init_audio_bulk(struct cx231xx *dev) - urb->context = dev; - urb->pipe = usb_rcvbulkpipe(dev->udev, - dev->adev.end_point_addr); -- urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; -+ urb->transfer_flags = 0; - urb->transfer_buffer = dev->adev.transfer_buffer[i]; - urb->complete = cx231xx_audio_bulkirq; - urb->transfer_buffer_length = sb_size; -diff --git a/drivers/media/video/cx231xx/cx231xx-vbi.c b/drivers/media/video/cx231xx/cx231xx-vbi.c -index 8cdee5f..9c5967e 100644 ---- a/drivers/media/video/cx231xx/cx231xx-vbi.c -+++ b/drivers/media/video/cx231xx/cx231xx-vbi.c -@@ -452,7 +452,7 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets, - return -ENOMEM; - } - dev->vbi_mode.bulk_ctl.urb[i] = urb; -- urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; -+ urb->transfer_flags = 0; - - dev->vbi_mode.bulk_ctl.transfer_buffer[i] = - kzalloc(sb_size, GFP_KERNEL); -diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c -index 261f478..c606b6a 100644 ---- a/drivers/mtd/nand/nandsim.c -+++ b/drivers/mtd/nand/nandsim.c -@@ -28,7 +28,7 @@ - #include <linux/module.h> - #include <linux/moduleparam.h> - #include <linux/vmalloc.h> --#include <asm/div64.h> -+#include <linux/math64.h> - #include <linux/slab.h> - #include <linux/errno.h> - #include <linux/string.h> -@@ -547,12 +547,6 @@ static char *get_partition_name(int i) - return kstrdup(buf, GFP_KERNEL); - } - --static uint64_t divide(uint64_t n, uint32_t d) --{ -- do_div(n, d); -- return n; --} -- - /* - * Initialize the nandsim structure. - * -@@ -581,7 +575,7 @@ static int init_nandsim(struct mtd_info *mtd) - ns->geom.oobsz = mtd->oobsize; - ns->geom.secsz = mtd->erasesize; - ns->geom.pgszoob = ns->geom.pgsz + ns->geom.oobsz; -- ns->geom.pgnum = divide(ns->geom.totsz, ns->geom.pgsz); -+ ns->geom.pgnum = div_u64(ns->geom.totsz, ns->geom.pgsz); - ns->geom.totszoob = ns->geom.totsz + (uint64_t)ns->geom.pgnum * ns->geom.oobsz; - ns->geom.secshift = ffs(ns->geom.secsz) - 1; - ns->geom.pgshift = chip->page_shift; -@@ -924,7 +918,7 @@ static int setup_wear_reporting(struct mtd_info *mtd) - - if (!rptwear) - return 0; -- wear_eb_count = divide(mtd->size, mtd->erasesize); -+ wear_eb_count = div_u64(mtd->size, mtd->erasesize); - mem = wear_eb_count * sizeof(unsigned long); - if (mem / sizeof(unsigned long) != wear_eb_count) { - NS_ERR("Too many erase blocks for wear reporting\n"); -diff --git a/drivers/net/bonding/bond_debugfs.c b/drivers/net/bonding/bond_debugfs.c -index 3680aa2..2cf084e 100644 ---- a/drivers/net/bonding/bond_debugfs.c -+++ b/drivers/net/bonding/bond_debugfs.c -@@ -6,7 +6,7 @@ - #include "bonding.h" - #include "bond_alb.h" - --#ifdef CONFIG_DEBUG_FS -+#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_NET_NS) - - #include <linux/debugfs.h> - #include <linux/seq_file.h> -diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c -index a579a2f..318a62a 100644 ---- a/drivers/net/bonding/bond_main.c -+++ b/drivers/net/bonding/bond_main.c -@@ -3218,6 +3218,12 @@ static int bond_master_netdev_event(unsigned long event, - switch (event) { - case NETDEV_CHANGENAME: - return bond_event_changename(event_bond); -+ case NETDEV_UNREGISTER: -+ bond_remove_proc_entry(event_bond); -+ break; -+ case NETDEV_REGISTER: -+ bond_create_proc_entry(event_bond); -+ break; - default: - break; - } -@@ -4402,8 +4408,6 @@ static void bond_uninit(struct net_device *bond_dev) - - bond_work_cancel_all(bond); - -- bond_remove_proc_entry(bond); -- - bond_debug_unregister(bond); - - __hw_addr_flush(&bond->mc_list); -@@ -4805,7 +4809,6 @@ static int bond_init(struct net_device *bond_dev) - - bond_set_lockdep_class(bond_dev); - -- bond_create_proc_entry(bond); - list_add_tail(&bond->bond_list, &bn->dev_list); - - bond_prepare_sysfs_group(bond); -diff --git a/drivers/net/ethernet/intel/e1000e/82571.c b/drivers/net/ethernet/intel/e1000e/82571.c -index c6d95f2..a9dd6a9 100644 ---- a/drivers/net/ethernet/intel/e1000e/82571.c -+++ b/drivers/net/ethernet/intel/e1000e/82571.c -@@ -1553,6 +1553,9 @@ static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) - ctrl = er32(CTRL); - status = er32(STATUS); - rxcw = er32(RXCW); -+ /* SYNCH bit and IV bit are sticky */ -+ udelay(10); -+ rxcw = er32(RXCW); - - if ((rxcw & E1000_RXCW_SYNCH) && !(rxcw & E1000_RXCW_IV)) { - -diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -index 48d56da..9bdfaba 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -@@ -1158,6 +1158,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) - priv->hw->desc->prepare_tx_desc(desc, 0, len, csum_insertion); - wmb(); - priv->hw->desc->set_tx_owner(desc); -+ wmb(); - } - - /* Interrupt on completition only for the latest segment */ -@@ -1173,6 +1174,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) - - /* To avoid raise condition */ - priv->hw->desc->set_tx_owner(first); -+ wmb(); - - priv->cur_tx++; - -@@ -1236,6 +1238,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv) - } - wmb(); - priv->hw->desc->set_rx_owner(p + entry); -+ wmb(); - } - } - -diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c -index c46275a..9aa4807 100644 ---- a/drivers/net/wireless/iwlegacy/4965-mac.c -+++ b/drivers/net/wireless/iwlegacy/4965-mac.c -@@ -3405,7 +3405,7 @@ il4965_remove_dynamic_key(struct il_priv *il, - return 0; - } - -- if (il->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) { -+ if (il->stations[sta_id].sta.key.key_flags & STA_KEY_FLG_INVALID) { - IL_WARN("Removing wrong key %d 0x%x\n", keyconf->keyidx, - key_flags); - spin_unlock_irqrestore(&il->sta_lock, flags); -@@ -3420,7 +3420,7 @@ il4965_remove_dynamic_key(struct il_priv *il, - memset(&il->stations[sta_id].sta.key, 0, sizeof(struct il4965_keyinfo)); - il->stations[sta_id].sta.key.key_flags = - STA_KEY_FLG_NO_ENC | STA_KEY_FLG_INVALID; -- il->stations[sta_id].sta.key.key_offset = WEP_INVALID_OFFSET; -+ il->stations[sta_id].sta.key.key_offset = keyconf->hw_key_idx; - il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; - il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; - -diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c -index eaf24945..4bc2711 100644 ---- a/drivers/net/wireless/iwlegacy/common.c -+++ b/drivers/net/wireless/iwlegacy/common.c -@@ -4767,14 +4767,12 @@ il_bg_watchdog(unsigned long data) - return; - - /* monitor and check for other stuck queues */ -- if (il_is_any_associated(il)) { -- for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) { -- /* skip as we already checked the command queue */ -- if (cnt == il->cmd_queue) -- continue; -- if (il_check_stuck_queue(il, cnt)) -- return; -- } -+ for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) { -+ /* skip as we already checked the command queue */ -+ if (cnt == il->cmd_queue) -+ continue; -+ if (il_check_stuck_queue(il, cnt)) -+ return; - } - - mod_timer(&il->watchdog, -diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c -index 66094eb..507085f 100644 ---- a/drivers/net/wireless/rt2x00/rt2x00usb.c -+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c -@@ -436,8 +436,8 @@ void rt2x00usb_kick_queue(struct data_queue *queue) - case QID_RX: - if (!rt2x00queue_full(queue)) - rt2x00queue_for_each_entry(queue, -- Q_INDEX_DONE, - Q_INDEX, -+ Q_INDEX_DONE, - NULL, - rt2x00usb_kick_rx_entry); - break; -diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c -index 0ffdb3c..9af4257 100644 ---- a/drivers/platform/x86/intel_ips.c -+++ b/drivers/platform/x86/intel_ips.c -@@ -72,6 +72,7 @@ - #include <linux/string.h> - #include <linux/tick.h> - #include <linux/timer.h> -+#include <linux/dmi.h> - #include <drm/i915_drm.h> - #include <asm/msr.h> - #include <asm/processor.h> -@@ -1485,6 +1486,24 @@ static DEFINE_PCI_DEVICE_TABLE(ips_id_table) = { - - MODULE_DEVICE_TABLE(pci, ips_id_table); - -+static int ips_blacklist_callback(const struct dmi_system_id *id) -+{ -+ pr_info("Blacklisted intel_ips for %s\n", id->ident); -+ return 1; -+} -+ -+static const struct dmi_system_id ips_blacklist[] = { -+ { -+ .callback = ips_blacklist_callback, -+ .ident = "HP ProBook", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook"), -+ }, -+ }, -+ { } /* terminating entry */ -+}; -+ - static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id) - { - u64 platform_info; -@@ -1494,6 +1513,9 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id) - u16 htshi, trc, trc_required_mask; - u8 tse; - -+ if (dmi_check_system(ips_blacklist)) -+ return -ENODEV; -+ - ips = kzalloc(sizeof(struct ips_driver), GFP_KERNEL); - if (!ips) - return -ENOMEM; -diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c -index 39d3aa4..f56c8ba 100644 ---- a/drivers/rpmsg/virtio_rpmsg_bus.c -+++ b/drivers/rpmsg/virtio_rpmsg_bus.c -@@ -1085,7 +1085,7 @@ static int __init rpmsg_init(void) - - return ret; - } --module_init(rpmsg_init); -+subsys_initcall(rpmsg_init); - - static void __exit rpmsg_fini(void) - { -diff --git a/fs/buffer.c b/fs/buffer.c -index ad5938c..0bc1bed 100644 ---- a/fs/buffer.c -+++ b/fs/buffer.c -@@ -1036,6 +1036,9 @@ grow_buffers(struct block_device *bdev, sector_t block, int size) - static struct buffer_head * - __getblk_slow(struct block_device *bdev, sector_t block, int size) - { -+ int ret; -+ struct buffer_head *bh; -+ - /* Size must be multiple of hard sectorsize */ - if (unlikely(size & (bdev_logical_block_size(bdev)-1) || - (size < 512 || size > PAGE_SIZE))) { -@@ -1048,20 +1051,21 @@ __getblk_slow(struct block_device *bdev, sector_t block, int size) - return NULL; - } - -- for (;;) { -- struct buffer_head * bh; -- int ret; -+retry: -+ bh = __find_get_block(bdev, block, size); -+ if (bh) -+ return bh; - -+ ret = grow_buffers(bdev, block, size); -+ if (ret == 0) { -+ free_more_memory(); -+ goto retry; -+ } else if (ret > 0) { - bh = __find_get_block(bdev, block, size); - if (bh) - return bh; -- -- ret = grow_buffers(bdev, block, size); -- if (ret < 0) -- return NULL; -- if (ret == 0) -- free_more_memory(); - } -+ return NULL; - } - - /* -diff --git a/fs/fifo.c b/fs/fifo.c -index b1a524d..cf6f434 100644 ---- a/fs/fifo.c -+++ b/fs/fifo.c -@@ -14,7 +14,7 @@ - #include <linux/sched.h> - #include <linux/pipe_fs_i.h> - --static void wait_for_partner(struct inode* inode, unsigned int *cnt) -+static int wait_for_partner(struct inode* inode, unsigned int *cnt) - { - int cur = *cnt; - -@@ -23,6 +23,7 @@ static void wait_for_partner(struct inode* inode, unsigned int *cnt) - if (signal_pending(current)) - break; - } -+ return cur == *cnt ? -ERESTARTSYS : 0; - } - - static void wake_up_partner(struct inode* inode) -@@ -67,8 +68,7 @@ static int fifo_open(struct inode *inode, struct file *filp) - * seen a writer */ - filp->f_version = pipe->w_counter; - } else { -- wait_for_partner(inode, &pipe->w_counter); -- if(signal_pending(current)) -+ if (wait_for_partner(inode, &pipe->w_counter)) - goto err_rd; - } - } -@@ -90,8 +90,7 @@ static int fifo_open(struct inode *inode, struct file *filp) - wake_up_partner(inode); - - if (!pipe->readers) { -- wait_for_partner(inode, &pipe->r_counter); -- if (signal_pending(current)) -+ if (wait_for_partner(inode, &pipe->r_counter)) - goto err_wr; - } - break; -diff --git a/fs/locks.c b/fs/locks.c -index 0d68f1f..6a64f15 100644 ---- a/fs/locks.c -+++ b/fs/locks.c -@@ -1465,7 +1465,7 @@ int generic_setlease(struct file *filp, long arg, struct file_lock **flp) - case F_WRLCK: - return generic_add_lease(filp, arg, flp); - default: -- BUG(); -+ return -EINVAL; - } - } - EXPORT_SYMBOL(generic_setlease); -diff --git a/include/linux/Kbuild b/include/linux/Kbuild -index 50f55c7..f2f73f9 100644 ---- a/include/linux/Kbuild -+++ b/include/linux/Kbuild -@@ -272,6 +272,7 @@ header-y += netfilter_ipv4.h - header-y += netfilter_ipv6.h - header-y += netlink.h - header-y += netrom.h -+header-y += nfc.h - header-y += nfs.h - header-y += nfs2.h - header-y += nfs3.h -diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h -index fd0dc30..cc07d27 100644 ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h -@@ -165,6 +165,7 @@ enum hrtimer_base_type { - * @lock: lock protecting the base and associated clock bases - * and timers - * @active_bases: Bitfield to mark bases with active timers -+ * @clock_was_set: Indicates that clock was set from irq context. - * @expires_next: absolute time of the next event which was scheduled - * via clock_set_next_event() - * @hres_active: State of high resolution mode -@@ -177,7 +178,8 @@ enum hrtimer_base_type { - */ - struct hrtimer_cpu_base { - raw_spinlock_t lock; -- unsigned long active_bases; -+ unsigned int active_bases; -+ unsigned int clock_was_set; - #ifdef CONFIG_HIGH_RES_TIMERS - ktime_t expires_next; - int hres_active; -@@ -286,6 +288,8 @@ extern void hrtimer_peek_ahead_timers(void); - # define MONOTONIC_RES_NSEC HIGH_RES_NSEC - # define KTIME_MONOTONIC_RES KTIME_HIGH_RES - -+extern void clock_was_set_delayed(void); -+ - #else - - # define MONOTONIC_RES_NSEC LOW_RES_NSEC -@@ -306,6 +310,9 @@ static inline int hrtimer_is_hres_active(struct hrtimer *timer) - { - return 0; - } -+ -+static inline void clock_was_set_delayed(void) { } -+ - #endif - - extern void clock_was_set(void); -@@ -320,6 +327,7 @@ extern ktime_t ktime_get(void); - extern ktime_t ktime_get_real(void); - extern ktime_t ktime_get_boottime(void); - extern ktime_t ktime_get_monotonic_offset(void); -+extern ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot); - - DECLARE_PER_CPU(struct tick_device, tick_cpu_device); - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 81a173c..7b06169 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1933,6 +1933,14 @@ static inline int set_cpus_allowed_ptr(struct task_struct *p, - } - #endif - -+#ifdef CONFIG_NO_HZ -+void calc_load_enter_idle(void); -+void calc_load_exit_idle(void); -+#else -+static inline void calc_load_enter_idle(void) { } -+static inline void calc_load_exit_idle(void) { } -+#endif /* CONFIG_NO_HZ */ -+ - #ifndef CONFIG_CPUMASK_OFFSTACK - static inline int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask) - { -diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index ae34bf5..6db7a5e 100644 ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c -@@ -657,6 +657,14 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, - return 0; - } - -+static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base) -+{ -+ ktime_t *offs_real = &base->clock_base[HRTIMER_BASE_REALTIME].offset; -+ ktime_t *offs_boot = &base->clock_base[HRTIMER_BASE_BOOTTIME].offset; -+ -+ return ktime_get_update_offsets(offs_real, offs_boot); -+} -+ - /* - * Retrigger next event is called after clock was set - * -@@ -665,22 +673,12 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, - static void retrigger_next_event(void *arg) - { - struct hrtimer_cpu_base *base = &__get_cpu_var(hrtimer_bases); -- struct timespec realtime_offset, xtim, wtm, sleep; - - if (!hrtimer_hres_active()) - return; - -- /* Optimized out for !HIGH_RES */ -- get_xtime_and_monotonic_and_sleep_offset(&xtim, &wtm, &sleep); -- set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec); -- -- /* Adjust CLOCK_REALTIME offset */ - raw_spin_lock(&base->lock); -- base->clock_base[HRTIMER_BASE_REALTIME].offset = -- timespec_to_ktime(realtime_offset); -- base->clock_base[HRTIMER_BASE_BOOTTIME].offset = -- timespec_to_ktime(sleep); -- -+ hrtimer_update_base(base); - hrtimer_force_reprogram(base, 0); - raw_spin_unlock(&base->lock); - } -@@ -710,13 +708,25 @@ static int hrtimer_switch_to_hres(void) - base->clock_base[i].resolution = KTIME_HIGH_RES; - - tick_setup_sched_timer(); -- - /* "Retrigger" the interrupt to get things going */ - retrigger_next_event(NULL); - local_irq_restore(flags); - return 1; - } - -+/* -+ * Called from timekeeping code to reprogramm the hrtimer interrupt -+ * device. If called from the timer interrupt context we defer it to -+ * softirq context. -+ */ -+void clock_was_set_delayed(void) -+{ -+ struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); -+ -+ cpu_base->clock_was_set = 1; -+ __raise_softirq_irqoff(HRTIMER_SOFTIRQ); -+} -+ - #else - - static inline int hrtimer_hres_active(void) { return 0; } -@@ -1250,11 +1260,10 @@ void hrtimer_interrupt(struct clock_event_device *dev) - cpu_base->nr_events++; - dev->next_event.tv64 = KTIME_MAX; - -- entry_time = now = ktime_get(); -+ raw_spin_lock(&cpu_base->lock); -+ entry_time = now = hrtimer_update_base(cpu_base); - retry: - expires_next.tv64 = KTIME_MAX; -- -- raw_spin_lock(&cpu_base->lock); - /* - * We set expires_next to KTIME_MAX here with cpu_base->lock - * held to prevent that a timer is enqueued in our queue via -@@ -1330,8 +1339,12 @@ retry: - * We need to prevent that we loop forever in the hrtimer - * interrupt routine. We give it 3 attempts to avoid - * overreacting on some spurious event. -+ * -+ * Acquire base lock for updating the offsets and retrieving -+ * the current time. - */ -- now = ktime_get(); -+ raw_spin_lock(&cpu_base->lock); -+ now = hrtimer_update_base(cpu_base); - cpu_base->nr_retries++; - if (++retries < 3) - goto retry; -@@ -1343,6 +1356,7 @@ retry: - */ - cpu_base->nr_hangs++; - cpu_base->hang_detected = 1; -+ raw_spin_unlock(&cpu_base->lock); - delta = ktime_sub(now, entry_time); - if (delta.tv64 > cpu_base->max_hang_time.tv64) - cpu_base->max_hang_time = delta; -@@ -1395,6 +1409,13 @@ void hrtimer_peek_ahead_timers(void) - - static void run_hrtimer_softirq(struct softirq_action *h) - { -+ struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); -+ -+ if (cpu_base->clock_was_set) { -+ cpu_base->clock_was_set = 0; -+ clock_was_set(); -+ } -+ - hrtimer_peek_ahead_timers(); - } - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 2000e06..817bf70 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -2162,11 +2162,73 @@ unsigned long this_cpu_load(void) - } - - -+/* -+ * Global load-average calculations -+ * -+ * We take a distributed and async approach to calculating the global load-avg -+ * in order to minimize overhead. -+ * -+ * The global load average is an exponentially decaying average of nr_running + -+ * nr_uninterruptible. -+ * -+ * Once every LOAD_FREQ: -+ * -+ * nr_active = 0; -+ * for_each_possible_cpu(cpu) -+ * nr_active += cpu_of(cpu)->nr_running + cpu_of(cpu)->nr_uninterruptible; -+ * -+ * avenrun[n] = avenrun[0] * exp_n + nr_active * (1 - exp_n) -+ * -+ * Due to a number of reasons the above turns in the mess below: -+ * -+ * - for_each_possible_cpu() is prohibitively expensive on machines with -+ * serious number of cpus, therefore we need to take a distributed approach -+ * to calculating nr_active. -+ * -+ * \Sum_i x_i(t) = \Sum_i x_i(t) - x_i(t_0) | x_i(t_0) := 0 -+ * = \Sum_i { \Sum_j=1 x_i(t_j) - x_i(t_j-1) } -+ * -+ * So assuming nr_active := 0 when we start out -- true per definition, we -+ * can simply take per-cpu deltas and fold those into a global accumulate -+ * to obtain the same result. See calc_load_fold_active(). -+ * -+ * Furthermore, in order to avoid synchronizing all per-cpu delta folding -+ * across the machine, we assume 10 ticks is sufficient time for every -+ * cpu to have completed this task. -+ * -+ * This places an upper-bound on the IRQ-off latency of the machine. Then -+ * again, being late doesn't loose the delta, just wrecks the sample. -+ * -+ * - cpu_rq()->nr_uninterruptible isn't accurately tracked per-cpu because -+ * this would add another cross-cpu cacheline miss and atomic operation -+ * to the wakeup path. Instead we increment on whatever cpu the task ran -+ * when it went into uninterruptible state and decrement on whatever cpu -+ * did the wakeup. This means that only the sum of nr_uninterruptible over -+ * all cpus yields the correct result. -+ * -+ * This covers the NO_HZ=n code, for extra head-aches, see the comment below. -+ */ -+ - /* Variables and functions for calc_load */ - static atomic_long_t calc_load_tasks; - static unsigned long calc_load_update; - unsigned long avenrun[3]; --EXPORT_SYMBOL(avenrun); -+EXPORT_SYMBOL(avenrun); /* should be removed */ -+ -+/** -+ * get_avenrun - get the load average array -+ * @loads: pointer to dest load array -+ * @offset: offset to add -+ * @shift: shift count to shift the result left -+ * -+ * These values are estimates at best, so no need for locking. -+ */ -+void get_avenrun(unsigned long *loads, unsigned long offset, int shift) -+{ -+ loads[0] = (avenrun[0] + offset) << shift; -+ loads[1] = (avenrun[1] + offset) << shift; -+ loads[2] = (avenrun[2] + offset) << shift; -+} - - static long calc_load_fold_active(struct rq *this_rq) - { -@@ -2183,6 +2245,9 @@ static long calc_load_fold_active(struct rq *this_rq) - return delta; - } - -+/* -+ * a1 = a0 * e + a * (1 - e) -+ */ - static unsigned long - calc_load(unsigned long load, unsigned long exp, unsigned long active) - { -@@ -2194,30 +2259,118 @@ calc_load(unsigned long load, unsigned long exp, unsigned long active) - - #ifdef CONFIG_NO_HZ - /* -- * For NO_HZ we delay the active fold to the next LOAD_FREQ update. -+ * Handle NO_HZ for the global load-average. -+ * -+ * Since the above described distributed algorithm to compute the global -+ * load-average relies on per-cpu sampling from the tick, it is affected by -+ * NO_HZ. -+ * -+ * The basic idea is to fold the nr_active delta into a global idle-delta upon -+ * entering NO_HZ state such that we can include this as an 'extra' cpu delta -+ * when we read the global state. -+ * -+ * Obviously reality has to ruin such a delightfully simple scheme: -+ * -+ * - When we go NO_HZ idle during the window, we can negate our sample -+ * contribution, causing under-accounting. -+ * -+ * We avoid this by keeping two idle-delta counters and flipping them -+ * when the window starts, thus separating old and new NO_HZ load. -+ * -+ * The only trick is the slight shift in index flip for read vs write. -+ * -+ * 0s 5s 10s 15s -+ * +10 +10 +10 +10 -+ * |-|-----------|-|-----------|-|-----------|-| -+ * r:0 0 1 1 0 0 1 1 0 -+ * w:0 1 1 0 0 1 1 0 0 -+ * -+ * This ensures we'll fold the old idle contribution in this window while -+ * accumlating the new one. -+ * -+ * - When we wake up from NO_HZ idle during the window, we push up our -+ * contribution, since we effectively move our sample point to a known -+ * busy state. -+ * -+ * This is solved by pushing the window forward, and thus skipping the -+ * sample, for this cpu (effectively using the idle-delta for this cpu which -+ * was in effect at the time the window opened). This also solves the issue -+ * of having to deal with a cpu having been in NOHZ idle for multiple -+ * LOAD_FREQ intervals. - * - * When making the ILB scale, we should try to pull this in as well. - */ --static atomic_long_t calc_load_tasks_idle; -+static atomic_long_t calc_load_idle[2]; -+static int calc_load_idx; - --void calc_load_account_idle(struct rq *this_rq) -+static inline int calc_load_write_idx(void) - { -+ int idx = calc_load_idx; -+ -+ /* -+ * See calc_global_nohz(), if we observe the new index, we also -+ * need to observe the new update time. -+ */ -+ smp_rmb(); -+ -+ /* -+ * If the folding window started, make sure we start writing in the -+ * next idle-delta. -+ */ -+ if (!time_before(jiffies, calc_load_update)) -+ idx++; -+ -+ return idx & 1; -+} -+ -+static inline int calc_load_read_idx(void) -+{ -+ return calc_load_idx & 1; -+} -+ -+void calc_load_enter_idle(void) -+{ -+ struct rq *this_rq = this_rq(); - long delta; - -+ /* -+ * We're going into NOHZ mode, if there's any pending delta, fold it -+ * into the pending idle delta. -+ */ - delta = calc_load_fold_active(this_rq); -- if (delta) -- atomic_long_add(delta, &calc_load_tasks_idle); -+ if (delta) { -+ int idx = calc_load_write_idx(); -+ atomic_long_add(delta, &calc_load_idle[idx]); -+ } - } - --static long calc_load_fold_idle(void) -+void calc_load_exit_idle(void) - { -- long delta = 0; -+ struct rq *this_rq = this_rq(); -+ -+ /* -+ * If we're still before the sample window, we're done. -+ */ -+ if (time_before(jiffies, this_rq->calc_load_update)) -+ return; - - /* -- * Its got a race, we don't care... -+ * We woke inside or after the sample window, this means we're already -+ * accounted through the nohz accounting, so skip the entire deal and -+ * sync up for the next window. - */ -- if (atomic_long_read(&calc_load_tasks_idle)) -- delta = atomic_long_xchg(&calc_load_tasks_idle, 0); -+ this_rq->calc_load_update = calc_load_update; -+ if (time_before(jiffies, this_rq->calc_load_update + 10)) -+ this_rq->calc_load_update += LOAD_FREQ; -+} -+ -+static long calc_load_fold_idle(void) -+{ -+ int idx = calc_load_read_idx(); -+ long delta = 0; -+ -+ if (atomic_long_read(&calc_load_idle[idx])) -+ delta = atomic_long_xchg(&calc_load_idle[idx], 0); - - return delta; - } -@@ -2303,66 +2456,39 @@ static void calc_global_nohz(void) - { - long delta, active, n; - -- /* -- * If we crossed a calc_load_update boundary, make sure to fold -- * any pending idle changes, the respective CPUs might have -- * missed the tick driven calc_load_account_active() update -- * due to NO_HZ. -- */ -- delta = calc_load_fold_idle(); -- if (delta) -- atomic_long_add(delta, &calc_load_tasks); -- -- /* -- * It could be the one fold was all it took, we done! -- */ -- if (time_before(jiffies, calc_load_update + 10)) -- return; -- -- /* -- * Catch-up, fold however many we are behind still -- */ -- delta = jiffies - calc_load_update - 10; -- n = 1 + (delta / LOAD_FREQ); -+ if (!time_before(jiffies, calc_load_update + 10)) { -+ /* -+ * Catch-up, fold however many we are behind still -+ */ -+ delta = jiffies - calc_load_update - 10; -+ n = 1 + (delta / LOAD_FREQ); - -- active = atomic_long_read(&calc_load_tasks); -- active = active > 0 ? active * FIXED_1 : 0; -+ active = atomic_long_read(&calc_load_tasks); -+ active = active > 0 ? active * FIXED_1 : 0; - -- avenrun[0] = calc_load_n(avenrun[0], EXP_1, active, n); -- avenrun[1] = calc_load_n(avenrun[1], EXP_5, active, n); -- avenrun[2] = calc_load_n(avenrun[2], EXP_15, active, n); -+ avenrun[0] = calc_load_n(avenrun[0], EXP_1, active, n); -+ avenrun[1] = calc_load_n(avenrun[1], EXP_5, active, n); -+ avenrun[2] = calc_load_n(avenrun[2], EXP_15, active, n); - -- calc_load_update += n * LOAD_FREQ; --} --#else --void calc_load_account_idle(struct rq *this_rq) --{ --} -+ calc_load_update += n * LOAD_FREQ; -+ } - --static inline long calc_load_fold_idle(void) --{ -- return 0; -+ /* -+ * Flip the idle index... -+ * -+ * Make sure we first write the new time then flip the index, so that -+ * calc_load_write_idx() will see the new time when it reads the new -+ * index, this avoids a double flip messing things up. -+ */ -+ smp_wmb(); -+ calc_load_idx++; - } -+#else /* !CONFIG_NO_HZ */ - --static void calc_global_nohz(void) --{ --} --#endif -+static inline long calc_load_fold_idle(void) { return 0; } -+static inline void calc_global_nohz(void) { } - --/** -- * get_avenrun - get the load average array -- * @loads: pointer to dest load array -- * @offset: offset to add -- * @shift: shift count to shift the result left -- * -- * These values are estimates at best, so no need for locking. -- */ --void get_avenrun(unsigned long *loads, unsigned long offset, int shift) --{ -- loads[0] = (avenrun[0] + offset) << shift; -- loads[1] = (avenrun[1] + offset) << shift; -- loads[2] = (avenrun[2] + offset) << shift; --} -+#endif /* CONFIG_NO_HZ */ - - /* - * calc_load - update the avenrun load estimates 10 ticks after the -@@ -2370,11 +2496,18 @@ void get_avenrun(unsigned long *loads, unsigned long offset, int shift) - */ - void calc_global_load(unsigned long ticks) - { -- long active; -+ long active, delta; - - if (time_before(jiffies, calc_load_update + 10)) - return; - -+ /* -+ * Fold the 'old' idle-delta to include all NO_HZ cpus. -+ */ -+ delta = calc_load_fold_idle(); -+ if (delta) -+ atomic_long_add(delta, &calc_load_tasks); -+ - active = atomic_long_read(&calc_load_tasks); - active = active > 0 ? active * FIXED_1 : 0; - -@@ -2385,12 +2518,7 @@ void calc_global_load(unsigned long ticks) - calc_load_update += LOAD_FREQ; - - /* -- * Account one period with whatever state we found before -- * folding in the nohz state and ageing the entire idle period. -- * -- * This avoids loosing a sample when we go idle between -- * calc_load_account_active() (10 ticks ago) and now and thus -- * under-accounting. -+ * In case we idled for multiple LOAD_FREQ intervals, catch up in bulk. - */ - calc_global_nohz(); - } -@@ -2407,7 +2535,6 @@ static void calc_load_account_active(struct rq *this_rq) - return; - - delta = calc_load_fold_active(this_rq); -- delta += calc_load_fold_idle(); - if (delta) - atomic_long_add(delta, &calc_load_tasks); - -@@ -2415,6 +2542,10 @@ static void calc_load_account_active(struct rq *this_rq) - } - - /* -+ * End of global load-average stuff -+ */ -+ -+/* - * The exact cpuload at various idx values, calculated at every tick would be - * load = (2^idx - 1) / 2^idx * load + 1 / 2^idx * cur_load - * -diff --git a/kernel/sched/idle_task.c b/kernel/sched/idle_task.c -index 91b4c95..fdf7522 100644 ---- a/kernel/sched/idle_task.c -+++ b/kernel/sched/idle_task.c -@@ -25,7 +25,6 @@ static void check_preempt_curr_idle(struct rq *rq, struct task_struct *p, int fl - static struct task_struct *pick_next_task_idle(struct rq *rq) - { - schedstat_inc(rq, sched_goidle); -- calc_load_account_idle(rq); - return rq->idle; - } - -diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h -index fb3acba..116ced0 100644 ---- a/kernel/sched/sched.h -+++ b/kernel/sched/sched.h -@@ -940,8 +940,6 @@ static inline u64 sched_avg_period(void) - return (u64)sysctl_sched_time_avg * NSEC_PER_MSEC / 2; - } - --void calc_load_account_idle(struct rq *this_rq); -- - #ifdef CONFIG_SCHED_HRTICK - - /* -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index 6a3a5b9..fd4e160 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -401,6 +401,7 @@ static void tick_nohz_stop_sched_tick(struct tick_sched *ts) - */ - if (!ts->tick_stopped) { - select_nohz_load_balancer(1); -+ calc_load_enter_idle(); - - ts->idle_tick = hrtimer_get_expires(&ts->sched_timer); - ts->tick_stopped = 1; -@@ -591,6 +592,7 @@ void tick_nohz_idle_exit(void) - account_idle_ticks(ticks); - #endif - -+ calc_load_exit_idle(); - touch_softlockup_watchdog(); - /* - * Cancel the scheduled timer and restore the tick -diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c -index d42574df..7c50de8 100644 ---- a/kernel/time/timekeeping.c -+++ b/kernel/time/timekeeping.c -@@ -70,6 +70,12 @@ struct timekeeper { - /* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */ - struct timespec raw_time; - -+ /* Offset clock monotonic -> clock realtime */ -+ ktime_t offs_real; -+ -+ /* Offset clock monotonic -> clock boottime */ -+ ktime_t offs_boot; -+ - /* Seqlock for all timekeeper values */ - seqlock_t lock; - }; -@@ -172,6 +178,14 @@ static inline s64 timekeeping_get_ns_raw(void) - return clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift); - } - -+static void update_rt_offset(void) -+{ -+ struct timespec tmp, *wtm = &timekeeper.wall_to_monotonic; -+ -+ set_normalized_timespec(&tmp, -wtm->tv_sec, -wtm->tv_nsec); -+ timekeeper.offs_real = timespec_to_ktime(tmp); -+} -+ - /* must hold write on timekeeper.lock */ - static void timekeeping_update(bool clearntp) - { -@@ -179,6 +193,7 @@ static void timekeeping_update(bool clearntp) - timekeeper.ntp_error = 0; - ntp_clear(); - } -+ update_rt_offset(); - update_vsyscall(&timekeeper.xtime, &timekeeper.wall_to_monotonic, - timekeeper.clock, timekeeper.mult); - } -@@ -606,6 +621,7 @@ void __init timekeeping_init(void) - } - set_normalized_timespec(&timekeeper.wall_to_monotonic, - -boot.tv_sec, -boot.tv_nsec); -+ update_rt_offset(); - timekeeper.total_sleep_time.tv_sec = 0; - timekeeper.total_sleep_time.tv_nsec = 0; - write_sequnlock_irqrestore(&timekeeper.lock, flags); -@@ -614,6 +630,12 @@ void __init timekeeping_init(void) - /* time in seconds when suspend began */ - static struct timespec timekeeping_suspend_time; - -+static void update_sleep_time(struct timespec t) -+{ -+ timekeeper.total_sleep_time = t; -+ timekeeper.offs_boot = timespec_to_ktime(t); -+} -+ - /** - * __timekeeping_inject_sleeptime - Internal function to add sleep interval - * @delta: pointer to a timespec delta value -@@ -632,8 +654,7 @@ static void __timekeeping_inject_sleeptime(struct timespec *delta) - timekeeper.xtime = timespec_add(timekeeper.xtime, *delta); - timekeeper.wall_to_monotonic = - timespec_sub(timekeeper.wall_to_monotonic, *delta); -- timekeeper.total_sleep_time = timespec_add( -- timekeeper.total_sleep_time, *delta); -+ update_sleep_time(timespec_add(timekeeper.total_sleep_time, *delta)); - } - - -@@ -698,6 +719,7 @@ static void timekeeping_resume(void) - timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock); - timekeeper.ntp_error = 0; - timekeeping_suspended = 0; -+ timekeeping_update(false); - write_sequnlock_irqrestore(&timekeeper.lock, flags); - - touch_softlockup_watchdog(); -@@ -965,6 +987,8 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int shift) - leap = second_overflow(timekeeper.xtime.tv_sec); - timekeeper.xtime.tv_sec += leap; - timekeeper.wall_to_monotonic.tv_sec -= leap; -+ if (leap) -+ clock_was_set_delayed(); - } - - /* Accumulate raw time */ -@@ -1081,6 +1105,8 @@ static void update_wall_time(void) - leap = second_overflow(timekeeper.xtime.tv_sec); - timekeeper.xtime.tv_sec += leap; - timekeeper.wall_to_monotonic.tv_sec -= leap; -+ if (leap) -+ clock_was_set_delayed(); - } - - timekeeping_update(false); -@@ -1248,6 +1274,40 @@ void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim, - } while (read_seqretry(&timekeeper.lock, seq)); - } - -+#ifdef CONFIG_HIGH_RES_TIMERS -+/** -+ * ktime_get_update_offsets - hrtimer helper -+ * @offs_real: pointer to storage for monotonic -> realtime offset -+ * @offs_boot: pointer to storage for monotonic -> boottime offset -+ * -+ * Returns current monotonic time and updates the offsets -+ * Called from hrtimer_interupt() or retrigger_next_event() -+ */ -+ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot) -+{ -+ ktime_t now; -+ unsigned int seq; -+ u64 secs, nsecs; -+ -+ do { -+ seq = read_seqbegin(&timekeeper.lock); -+ -+ secs = timekeeper.xtime.tv_sec; -+ nsecs = timekeeper.xtime.tv_nsec; -+ nsecs += timekeeping_get_ns(); -+ /* If arch requires, add in gettimeoffset() */ -+ nsecs += arch_gettimeoffset(); -+ -+ *offs_real = timekeeper.offs_real; -+ *offs_boot = timekeeper.offs_boot; -+ } while (read_seqretry(&timekeeper.lock, seq)); -+ -+ now = ktime_add_ns(ktime_set(secs, 0), nsecs); -+ now = ktime_sub(now, *offs_real); -+ return now; -+} -+#endif -+ - /** - * ktime_get_monotonic_offset() - get wall_to_monotonic in ktime_t format - */ -diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c -index 1197e8d..d132b98 100644 ---- a/net/mac80211/mlme.c -+++ b/net/mac80211/mlme.c -@@ -2183,15 +2183,13 @@ ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, - sdata->name, mgmt->sa, status_code); - ieee80211_destroy_assoc_data(sdata, false); - } else { -- printk(KERN_DEBUG "%s: associated\n", sdata->name); -- - if (!ieee80211_assoc_success(sdata, *bss, mgmt, len)) { - /* oops -- internal error -- send timeout for now */ -- ieee80211_destroy_assoc_data(sdata, true); -- sta_info_destroy_addr(sdata, mgmt->bssid); -+ ieee80211_destroy_assoc_data(sdata, false); - cfg80211_put_bss(*bss); - return RX_MGMT_CFG80211_ASSOC_TIMEOUT; - } -+ printk(KERN_DEBUG "%s: associated\n", sdata->name); - - /* - * destroy assoc_data afterwards, as otherwise an idle -diff --git a/net/wireless/util.c b/net/wireless/util.c -index b5b6890..0eb6cc0 100644 ---- a/net/wireless/util.c -+++ b/net/wireless/util.c -@@ -805,7 +805,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev, - ntype == NL80211_IFTYPE_P2P_CLIENT)) - return -EBUSY; - -- if (ntype != otype) { -+ if (ntype != otype && netif_running(dev)) { - err = cfg80211_can_change_interface(rdev, dev->ieee80211_ptr, - ntype); - if (err) diff --git a/3.4.6/0000_README b/3.4.7/0000_README index 2236f0c..fd852d4 100644 --- a/3.4.6/0000_README +++ b/3.4.7/0000_README @@ -2,10 +2,6 @@ README ----------------------------------------------------------------------------- Individual Patch Descriptions: ----------------------------------------------------------------------------- -Patch: 1005_linux-3.4.6.patch -From: http://www.kernel.org -Desc: Linux 3.4.6 - Patch: 4420_grsecurity-2.9.1-3.4.7-201208011850.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/3.4.6/4420_grsecurity-2.9.1-3.4.7-201208011850.patch b/3.4.7/4420_grsecurity-2.9.1-3.4.7-201208011850.patch index 23880cf..23880cf 100644 --- a/3.4.6/4420_grsecurity-2.9.1-3.4.7-201208011850.patch +++ b/3.4.7/4420_grsecurity-2.9.1-3.4.7-201208011850.patch diff --git a/3.4.6/4430_grsec-remove-localversion-grsec.patch b/3.4.7/4430_grsec-remove-localversion-grsec.patch index 31cf878..31cf878 100644 --- a/3.4.6/4430_grsec-remove-localversion-grsec.patch +++ b/3.4.7/4430_grsec-remove-localversion-grsec.patch diff --git a/3.4.6/4435_grsec-mute-warnings.patch b/3.4.7/4435_grsec-mute-warnings.patch index e85abd6..e85abd6 100644 --- a/3.4.6/4435_grsec-mute-warnings.patch +++ b/3.4.7/4435_grsec-mute-warnings.patch diff --git a/3.4.6/4440_grsec-remove-protected-paths.patch b/3.4.7/4440_grsec-remove-protected-paths.patch index 637934a..637934a 100644 --- a/3.4.6/4440_grsec-remove-protected-paths.patch +++ b/3.4.7/4440_grsec-remove-protected-paths.patch diff --git a/3.4.6/4450_grsec-kconfig-default-gids.patch b/3.4.7/4450_grsec-kconfig-default-gids.patch index a2e6f84..a2e6f84 100644 --- a/3.4.6/4450_grsec-kconfig-default-gids.patch +++ b/3.4.7/4450_grsec-kconfig-default-gids.patch diff --git a/3.4.6/4465_selinux-avc_audit-log-curr_ip.patch b/3.4.7/4465_selinux-avc_audit-log-curr_ip.patch index 2548df6..2548df6 100644 --- a/3.4.6/4465_selinux-avc_audit-log-curr_ip.patch +++ b/3.4.7/4465_selinux-avc_audit-log-curr_ip.patch diff --git a/3.4.6/4470_disable-compat_vdso.patch b/3.4.7/4470_disable-compat_vdso.patch index 2a637c1..2a637c1 100644 --- a/3.4.6/4470_disable-compat_vdso.patch +++ b/3.4.7/4470_disable-compat_vdso.patch diff --git a/3.4.6/4480_fix-scsi-lpfc-Werror.patch b/3.4.7/4480_fix-scsi-lpfc-Werror.patch index e5bbb1c..e5bbb1c 100644 --- a/3.4.6/4480_fix-scsi-lpfc-Werror.patch +++ b/3.4.7/4480_fix-scsi-lpfc-Werror.patch |