mirror of
https://github.com/Fishwaldo/build.git
synced 2025-04-16 11:01:45 +00:00
728 lines
23 KiB
Diff
728 lines
23 KiB
Diff
diff --git a/Documentation/devicetree/bindings/dma/fsl-mxs-dma.txt b/Documentation/devicetree/bindings/dma/fsl-mxs-dma.txt
|
|
index a4873e5e3e36..e30e184f50c7 100644
|
|
--- a/Documentation/devicetree/bindings/dma/fsl-mxs-dma.txt
|
|
+++ b/Documentation/devicetree/bindings/dma/fsl-mxs-dma.txt
|
|
@@ -38,7 +38,7 @@ dma_apbx: dma-apbx@80024000 {
|
|
80 81 68 69
|
|
70 71 72 73
|
|
74 75 76 77>;
|
|
- interrupt-names = "auart4-rx", "aurat4-tx", "spdif-tx", "empty",
|
|
+ interrupt-names = "auart4-rx", "auart4-tx", "spdif-tx", "empty",
|
|
"saif0", "saif1", "i2c0", "i2c1",
|
|
"auart0-rx", "auart0-tx", "auart1-rx", "auart1-tx",
|
|
"auart2-rx", "auart2-tx", "auart3-rx", "auart3-tx";
|
|
diff --git a/Makefile b/Makefile
|
|
index cf99a9b53c6f..e26cb1e56266 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 10
|
|
-SUBLEVEL = 78
|
|
+SUBLEVEL = 79
|
|
EXTRAVERSION =
|
|
NAME = TOSSUG Baby Fish
|
|
|
|
diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
|
index 9746d0e7fcb4..5dfb3d354470 100644
|
|
--- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
|
+++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
|
@@ -32,6 +32,10 @@
|
|
0xf0000000 0 0xf0000000 0x8000000 /* Device Bus, NOR 128MiB */>;
|
|
|
|
internal-regs {
|
|
+ rtc@10300 {
|
|
+ /* No crystal connected to the internal RTC */
|
|
+ status = "disabled";
|
|
+ };
|
|
serial@12000 {
|
|
clock-frequency = <250000000>;
|
|
status = "okay";
|
|
diff --git a/arch/arm/boot/dts/imx23-olinuxino.dts b/arch/arm/boot/dts/imx23-olinuxino.dts
|
|
index d107c4af321f..6fef54416cbf 100644
|
|
--- a/arch/arm/boot/dts/imx23-olinuxino.dts
|
|
+++ b/arch/arm/boot/dts/imx23-olinuxino.dts
|
|
@@ -89,6 +89,7 @@
|
|
|
|
ahb@80080000 {
|
|
usb0: usb@80080000 {
|
|
+ dr_mode = "host";
|
|
vbus-supply = <®_usb0_vbus>;
|
|
status = "okay";
|
|
};
|
|
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi
|
|
index 97d1a550eb98..2a571bcacaf4 100644
|
|
--- a/arch/arm/boot/dts/imx25.dtsi
|
|
+++ b/arch/arm/boot/dts/imx25.dtsi
|
|
@@ -393,6 +393,7 @@
|
|
|
|
pwm4: pwm@53fc8000 {
|
|
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
|
+ #pwm-cells = <2>;
|
|
reg = <0x53fc8000 0x4000>;
|
|
clocks = <&clks 108>, <&clks 52>;
|
|
clock-names = "ipg", "per";
|
|
diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi
|
|
index 4c10a1968c0e..2e76b84c6bad 100644
|
|
--- a/arch/arm/boot/dts/imx28.dtsi
|
|
+++ b/arch/arm/boot/dts/imx28.dtsi
|
|
@@ -691,7 +691,7 @@
|
|
80 81 68 69
|
|
70 71 72 73
|
|
74 75 76 77>;
|
|
- interrupt-names = "auart4-rx", "aurat4-tx", "spdif-tx", "empty",
|
|
+ interrupt-names = "auart4-rx", "auart4-tx", "spdif-tx", "empty",
|
|
"saif0", "saif1", "i2c0", "i2c1",
|
|
"auart0-rx", "auart0-tx", "auart1-rx", "auart1-tx",
|
|
"auart2-rx", "auart2-tx", "auart3-rx", "auart3-tx";
|
|
diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c
|
|
index ee6367b8eaf7..e9b13b92ba1e 100644
|
|
--- a/drivers/acpi/acpica/dsopcode.c
|
|
+++ b/drivers/acpi/acpica/dsopcode.c
|
|
@@ -539,8 +539,7 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|
return_ACPI_STATUS(AE_NOT_EXIST);
|
|
}
|
|
|
|
- obj_desc->region.address =
|
|
- (acpi_physical_address) ACPI_TO_INTEGER(table);
|
|
+ obj_desc->region.address = ACPI_PTR_TO_PHYSADDR(table);
|
|
obj_desc->region.length = table->length;
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
|
|
diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c
|
|
index e57cd38004e3..0d2351596a3c 100644
|
|
--- a/drivers/acpi/acpica/tbinstal.c
|
|
+++ b/drivers/acpi/acpica/tbinstal.c
|
|
@@ -301,8 +301,7 @@ struct acpi_table_header *acpi_tb_table_override(struct acpi_table_header
|
|
ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
|
|
"%4.4s %p Attempted physical table override failed",
|
|
table_header->signature,
|
|
- ACPI_CAST_PTR(void,
|
|
- table_desc->address)));
|
|
+ ACPI_PHYSADDR_TO_PTR(table_desc->address)));
|
|
return (NULL);
|
|
}
|
|
|
|
@@ -318,7 +317,7 @@ struct acpi_table_header *acpi_tb_table_override(struct acpi_table_header
|
|
ACPI_INFO((AE_INFO,
|
|
"%4.4s %p %s table override, new table: %p",
|
|
table_header->signature,
|
|
- ACPI_CAST_PTR(void, table_desc->address),
|
|
+ ACPI_PHYSADDR_TO_PTR(table_desc->address),
|
|
override_type, new_table));
|
|
|
|
/* We can now unmap/delete the original table (if fully mapped) */
|
|
diff --git a/drivers/acpi/acpica/tbxfroot.c b/drivers/acpi/acpica/tbxfroot.c
|
|
index 7c2ecfb7c2c3..e12486031d97 100644
|
|
--- a/drivers/acpi/acpica/tbxfroot.c
|
|
+++ b/drivers/acpi/acpica/tbxfroot.c
|
|
@@ -118,7 +118,7 @@ static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
|
|
*
|
|
******************************************************************************/
|
|
|
|
-acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
|
+acpi_status acpi_find_root_pointer(acpi_physical_address * table_address)
|
|
{
|
|
u8 *table_ptr;
|
|
u8 *mem_rover;
|
|
@@ -176,7 +176,8 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
|
physical_address +=
|
|
(u32) ACPI_PTR_DIFF(mem_rover, table_ptr);
|
|
|
|
- *table_address = physical_address;
|
|
+ *table_address =
|
|
+ (acpi_physical_address) physical_address;
|
|
return_ACPI_STATUS(AE_OK);
|
|
}
|
|
}
|
|
@@ -209,7 +210,7 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
|
(ACPI_HI_RSDP_WINDOW_BASE +
|
|
ACPI_PTR_DIFF(mem_rover, table_ptr));
|
|
|
|
- *table_address = physical_address;
|
|
+ *table_address = (acpi_physical_address) physical_address;
|
|
return_ACPI_STATUS(AE_OK);
|
|
}
|
|
|
|
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
|
|
index ca1cb2d756c2..c3768fafff45 100644
|
|
--- a/drivers/gpio/gpiolib.c
|
|
+++ b/drivers/gpio/gpiolib.c
|
|
@@ -752,6 +752,7 @@ static struct class gpio_class = {
|
|
*/
|
|
static int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
|
{
|
|
+ struct gpio_chip *chip;
|
|
unsigned long flags;
|
|
int status;
|
|
const char *ioname = NULL;
|
|
@@ -769,8 +770,16 @@ static int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ chip = desc->chip;
|
|
+
|
|
mutex_lock(&sysfs_lock);
|
|
|
|
+ /* check if chip is being removed */
|
|
+ if (!chip || !chip->exported) {
|
|
+ status = -ENODEV;
|
|
+ goto fail_unlock;
|
|
+ }
|
|
+
|
|
spin_lock_irqsave(&gpio_lock, flags);
|
|
if (!test_bit(FLAG_REQUESTED, &desc->flags) ||
|
|
test_bit(FLAG_EXPORT, &desc->flags)) {
|
|
@@ -1040,6 +1049,8 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
|
{
|
|
int status;
|
|
struct device *dev;
|
|
+ struct gpio_desc *desc;
|
|
+ unsigned int i;
|
|
|
|
mutex_lock(&sysfs_lock);
|
|
dev = class_find_device(&gpio_class, NULL, chip, match_export);
|
|
@@ -1047,6 +1058,7 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
|
sysfs_remove_group(&dev->kobj, &gpiochip_attr_group);
|
|
put_device(dev);
|
|
device_unregister(dev);
|
|
+ /* prevent further gpiod exports */
|
|
chip->exported = 0;
|
|
status = 0;
|
|
} else
|
|
@@ -1056,6 +1068,13 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
|
if (status)
|
|
pr_debug("%s: chip %s status %d\n", __func__,
|
|
chip->label, status);
|
|
+
|
|
+ /* unregister gpiod class devices owned by sysfs */
|
|
+ for (i = 0; i < chip->ngpio; i++) {
|
|
+ desc = &chip->desc[i];
|
|
+ if (test_and_clear_bit(FLAG_SYSFS, &desc->flags))
|
|
+ gpiod_free(desc);
|
|
+ }
|
|
}
|
|
|
|
static int __init gpiolib_sysfs_init(void)
|
|
@@ -1265,6 +1284,8 @@ int gpiochip_remove(struct gpio_chip *chip)
|
|
int status = 0;
|
|
unsigned id;
|
|
|
|
+ gpiochip_unexport(chip);
|
|
+
|
|
spin_lock_irqsave(&gpio_lock, flags);
|
|
|
|
gpiochip_remove_pin_ranges(chip);
|
|
@@ -1285,9 +1306,6 @@ int gpiochip_remove(struct gpio_chip *chip)
|
|
|
|
spin_unlock_irqrestore(&gpio_lock, flags);
|
|
|
|
- if (status == 0)
|
|
- gpiochip_unexport(chip);
|
|
-
|
|
return status;
|
|
}
|
|
EXPORT_SYMBOL_GPL(gpiochip_remove);
|
|
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
|
|
index f5d1dc5b5563..54ebfbe370c6 100644
|
|
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
|
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
|
@@ -1007,12 +1007,28 @@ static int intel_dual_link_lvds_callback(const struct dmi_system_id *id)
|
|
static const struct dmi_system_id intel_dual_link_lvds[] = {
|
|
{
|
|
.callback = intel_dual_link_lvds_callback,
|
|
- .ident = "Apple MacBook Pro (Core i5/i7 Series)",
|
|
+ .ident = "Apple MacBook Pro 15\" (2010)",
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6,2"),
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .callback = intel_dual_link_lvds_callback,
|
|
+ .ident = "Apple MacBook Pro 15\" (2011)",
|
|
.matches = {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro8,2"),
|
|
},
|
|
},
|
|
+ {
|
|
+ .callback = intel_dual_link_lvds_callback,
|
|
+ .ident = "Apple MacBook Pro 15\" (2012)",
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro9,1"),
|
|
+ },
|
|
+ },
|
|
{ } /* terminating entry */
|
|
};
|
|
|
|
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
|
|
index 7ad66823d022..56998eca1a8d 100644
|
|
--- a/drivers/mmc/card/block.c
|
|
+++ b/drivers/mmc/card/block.c
|
|
@@ -908,6 +908,18 @@ static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type)
|
|
md->reset_done &= ~type;
|
|
}
|
|
|
|
+int mmc_access_rpmb(struct mmc_queue *mq)
|
|
+{
|
|
+ struct mmc_blk_data *md = mq->data;
|
|
+ /*
|
|
+ * If this is a RPMB partition access, return ture
|
|
+ */
|
|
+ if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB)
|
|
+ return true;
|
|
+
|
|
+ return false;
|
|
+}
|
|
+
|
|
static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
|
|
{
|
|
struct mmc_blk_data *md = mq->data;
|
|
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
|
|
index 9447a0e970d1..645519fe3acd 100644
|
|
--- a/drivers/mmc/card/queue.c
|
|
+++ b/drivers/mmc/card/queue.c
|
|
@@ -37,7 +37,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req)
|
|
return BLKPREP_KILL;
|
|
}
|
|
|
|
- if (mq && mmc_card_removed(mq->card))
|
|
+ if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq)))
|
|
return BLKPREP_KILL;
|
|
|
|
req->cmd_flags |= REQ_DONTPREP;
|
|
diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
|
|
index 5752d50049a3..99e6521e6169 100644
|
|
--- a/drivers/mmc/card/queue.h
|
|
+++ b/drivers/mmc/card/queue.h
|
|
@@ -73,4 +73,6 @@ extern void mmc_queue_bounce_post(struct mmc_queue_req *);
|
|
extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *);
|
|
extern void mmc_packed_clean(struct mmc_queue *);
|
|
|
|
+extern int mmc_access_rpmb(struct mmc_queue *);
|
|
+
|
|
#endif
|
|
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
|
|
index 9c9fc69a01b3..ea40c5139766 100644
|
|
--- a/drivers/pinctrl/core.c
|
|
+++ b/drivers/pinctrl/core.c
|
|
@@ -1077,7 +1077,7 @@ void devm_pinctrl_put(struct pinctrl *p)
|
|
EXPORT_SYMBOL_GPL(devm_pinctrl_put);
|
|
|
|
int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
|
- bool dup, bool locked)
|
|
+ bool dup)
|
|
{
|
|
int i, ret;
|
|
struct pinctrl_maps *maps_node;
|
|
@@ -1145,11 +1145,9 @@ int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
|
maps_node->maps = maps;
|
|
}
|
|
|
|
- if (!locked)
|
|
- mutex_lock(&pinctrl_maps_mutex);
|
|
+ mutex_lock(&pinctrl_maps_mutex);
|
|
list_add_tail(&maps_node->node, &pinctrl_maps);
|
|
- if (!locked)
|
|
- mutex_unlock(&pinctrl_maps_mutex);
|
|
+ mutex_unlock(&pinctrl_maps_mutex);
|
|
|
|
return 0;
|
|
}
|
|
@@ -1164,7 +1162,7 @@ int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
|
int pinctrl_register_mappings(struct pinctrl_map const *maps,
|
|
unsigned num_maps)
|
|
{
|
|
- return pinctrl_register_map(maps, num_maps, true, false);
|
|
+ return pinctrl_register_map(maps, num_maps, true);
|
|
}
|
|
|
|
void pinctrl_unregister_map(struct pinctrl_map const *map)
|
|
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h
|
|
index 75476b3d87da..b24ea846c867 100644
|
|
--- a/drivers/pinctrl/core.h
|
|
+++ b/drivers/pinctrl/core.h
|
|
@@ -183,7 +183,7 @@ static inline struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev,
|
|
}
|
|
|
|
int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
|
- bool dup, bool locked);
|
|
+ bool dup);
|
|
void pinctrl_unregister_map(struct pinctrl_map const *map);
|
|
|
|
extern int pinctrl_force_sleep(struct pinctrl_dev *pctldev);
|
|
diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c
|
|
index 340fb4e6c600..fd91c4c31f6b 100644
|
|
--- a/drivers/pinctrl/devicetree.c
|
|
+++ b/drivers/pinctrl/devicetree.c
|
|
@@ -92,7 +92,7 @@ static int dt_remember_or_free_map(struct pinctrl *p, const char *statename,
|
|
dt_map->num_maps = num_maps;
|
|
list_add_tail(&dt_map->node, &p->dt_maps);
|
|
|
|
- return pinctrl_register_map(map, num_maps, false, true);
|
|
+ return pinctrl_register_map(map, num_maps, false);
|
|
}
|
|
|
|
struct pinctrl_dev *of_pinctrl_get(struct device_node *np)
|
|
diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c
|
|
index 4fc32c8091e9..ff92155dbc88 100644
|
|
--- a/drivers/tty/hvc/hvc_xen.c
|
|
+++ b/drivers/tty/hvc/hvc_xen.c
|
|
@@ -299,11 +299,27 @@ static int xen_initial_domain_console_init(void)
|
|
return 0;
|
|
}
|
|
|
|
+static void xen_console_update_evtchn(struct xencons_info *info)
|
|
+{
|
|
+ if (xen_hvm_domain()) {
|
|
+ uint64_t v;
|
|
+ int err;
|
|
+
|
|
+ err = hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v);
|
|
+ if (!err && v)
|
|
+ info->evtchn = v;
|
|
+ } else
|
|
+ info->evtchn = xen_start_info->console.domU.evtchn;
|
|
+}
|
|
+
|
|
void xen_console_resume(void)
|
|
{
|
|
struct xencons_info *info = vtermno_to_xencons(HVC_COOKIE);
|
|
- if (info != NULL && info->irq)
|
|
+ if (info != NULL && info->irq) {
|
|
+ if (!xen_initial_domain())
|
|
+ xen_console_update_evtchn(info);
|
|
rebind_evtchn_irq(info->evtchn, info->irq);
|
|
+ }
|
|
}
|
|
|
|
static void xencons_disconnect_backend(struct xencons_info *info)
|
|
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c
|
|
index ecdbae19a766..090d8ce25bd1 100644
|
|
--- a/fs/nilfs2/btree.c
|
|
+++ b/fs/nilfs2/btree.c
|
|
@@ -388,7 +388,7 @@ static int nilfs_btree_root_broken(const struct nilfs_btree_node *node,
|
|
nchildren = nilfs_btree_node_get_nchildren(node);
|
|
|
|
if (unlikely(level < NILFS_BTREE_LEVEL_NODE_MIN ||
|
|
- level > NILFS_BTREE_LEVEL_MAX ||
|
|
+ level >= NILFS_BTREE_LEVEL_MAX ||
|
|
nchildren < 0 ||
|
|
nchildren > NILFS_BTREE_ROOT_NCHILDREN_MAX)) {
|
|
pr_crit("NILFS: bad btree root (inode number=%lu): level = %d, flags = 0x%x, nchildren = %d\n",
|
|
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
|
|
index 2b941113e423..2c119d5d04c9 100644
|
|
--- a/fs/ocfs2/dlm/dlmmaster.c
|
|
+++ b/fs/ocfs2/dlm/dlmmaster.c
|
|
@@ -729,6 +729,19 @@ lookup:
|
|
if (tmpres) {
|
|
spin_unlock(&dlm->spinlock);
|
|
spin_lock(&tmpres->spinlock);
|
|
+
|
|
+ /*
|
|
+ * Right after dlm spinlock was released, dlm_thread could have
|
|
+ * purged the lockres. Check if lockres got unhashed. If so
|
|
+ * start over.
|
|
+ */
|
|
+ if (hlist_unhashed(&tmpres->hash_node)) {
|
|
+ spin_unlock(&tmpres->spinlock);
|
|
+ dlm_lockres_put(tmpres);
|
|
+ tmpres = NULL;
|
|
+ goto lookup;
|
|
+ }
|
|
+
|
|
/* Wait on the thread that is mastering the resource */
|
|
if (tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN) {
|
|
__dlm_wait_on_lockres(tmpres);
|
|
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
|
|
index 454881e6450a..fcabb1597d5b 100644
|
|
--- a/include/acpi/acpixf.h
|
|
+++ b/include/acpi/acpixf.h
|
|
@@ -177,7 +177,7 @@ acpi_status acpi_load_tables(void);
|
|
*/
|
|
acpi_status acpi_reallocate_root_table(void);
|
|
|
|
-acpi_status acpi_find_root_pointer(acpi_size *rsdp_address);
|
|
+acpi_status acpi_find_root_pointer(acpi_physical_address *rsdp_address);
|
|
|
|
acpi_status acpi_unload_table_id(acpi_owner_id id);
|
|
|
|
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
|
|
index 6de0f2c14ec0..f05efb1160fb 100644
|
|
--- a/include/linux/interrupt.h
|
|
+++ b/include/linux/interrupt.h
|
|
@@ -11,8 +11,6 @@
|
|
#include <linux/irqnr.h>
|
|
#include <linux/hardirq.h>
|
|
#include <linux/irqflags.h>
|
|
-#include <linux/smp.h>
|
|
-#include <linux/percpu.h>
|
|
#include <linux/hrtimer.h>
|
|
#include <linux/kref.h>
|
|
#include <linux/workqueue.h>
|
|
@@ -488,15 +486,6 @@ extern void __raise_softirq_irqoff(unsigned int nr);
|
|
extern void raise_softirq_irqoff(unsigned int nr);
|
|
extern void raise_softirq(unsigned int nr);
|
|
|
|
-/* This is the worklist that queues up per-cpu softirq work.
|
|
- *
|
|
- * send_remote_sendirq() adds work to these lists, and
|
|
- * the softirq handler itself dequeues from them. The queues
|
|
- * are protected by disabling local cpu interrupts and they must
|
|
- * only be accessed by the local cpu that they are for.
|
|
- */
|
|
-DECLARE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
|
|
-
|
|
DECLARE_PER_CPU(struct task_struct *, ksoftirqd);
|
|
|
|
static inline struct task_struct *this_cpu_ksoftirqd(void)
|
|
@@ -504,17 +493,6 @@ static inline struct task_struct *this_cpu_ksoftirqd(void)
|
|
return this_cpu_read(ksoftirqd);
|
|
}
|
|
|
|
-/* Try to send a softirq to a remote cpu. If this cannot be done, the
|
|
- * work will be queued to the local cpu.
|
|
- */
|
|
-extern void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq);
|
|
-
|
|
-/* Like send_remote_softirq(), but the caller must disable local cpu interrupts
|
|
- * and compute the current cpu, passed in as 'this_cpu'.
|
|
- */
|
|
-extern void __send_remote_softirq(struct call_single_data *cp, int cpu,
|
|
- int this_cpu, int softirq);
|
|
-
|
|
/* Tasklets --- multithreaded analogue of BHs.
|
|
|
|
Main feature differing them of generic softirqs: tasklet
|
|
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h
|
|
index 98755767c7b0..1108acaacfc6 100644
|
|
--- a/include/linux/nilfs2_fs.h
|
|
+++ b/include/linux/nilfs2_fs.h
|
|
@@ -458,7 +458,7 @@ struct nilfs_btree_node {
|
|
/* level */
|
|
#define NILFS_BTREE_LEVEL_DATA 0
|
|
#define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1)
|
|
-#define NILFS_BTREE_LEVEL_MAX 14
|
|
+#define NILFS_BTREE_LEVEL_MAX 14 /* Max level (exclusive) */
|
|
|
|
/**
|
|
* struct nilfs_palloc_group_desc - block group descriptor
|
|
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
|
index 21956f00cb51..b538df367de3 100644
|
|
--- a/kernel/softirq.c
|
|
+++ b/kernel/softirq.c
|
|
@@ -6,8 +6,6 @@
|
|
* Distribute under GPLv2.
|
|
*
|
|
* Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903)
|
|
- *
|
|
- * Remote softirq infrastructure is by Jens Axboe.
|
|
*/
|
|
|
|
#include <linux/export.h>
|
|
@@ -620,146 +618,17 @@ void tasklet_hrtimer_init(struct tasklet_hrtimer *ttimer,
|
|
}
|
|
EXPORT_SYMBOL_GPL(tasklet_hrtimer_init);
|
|
|
|
-/*
|
|
- * Remote softirq bits
|
|
- */
|
|
-
|
|
-DEFINE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
|
|
-EXPORT_PER_CPU_SYMBOL(softirq_work_list);
|
|
-
|
|
-static void __local_trigger(struct call_single_data *cp, int softirq)
|
|
-{
|
|
- struct list_head *head = &__get_cpu_var(softirq_work_list[softirq]);
|
|
-
|
|
- list_add_tail(&cp->list, head);
|
|
-
|
|
- /* Trigger the softirq only if the list was previously empty. */
|
|
- if (head->next == &cp->list)
|
|
- raise_softirq_irqoff(softirq);
|
|
-}
|
|
-
|
|
-#ifdef CONFIG_USE_GENERIC_SMP_HELPERS
|
|
-static void remote_softirq_receive(void *data)
|
|
-{
|
|
- struct call_single_data *cp = data;
|
|
- unsigned long flags;
|
|
- int softirq;
|
|
-
|
|
- softirq = *(int *)cp->info;
|
|
- local_irq_save(flags);
|
|
- __local_trigger(cp, softirq);
|
|
- local_irq_restore(flags);
|
|
-}
|
|
-
|
|
-static int __try_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
|
-{
|
|
- if (cpu_online(cpu)) {
|
|
- cp->func = remote_softirq_receive;
|
|
- cp->info = &softirq;
|
|
- cp->flags = 0;
|
|
-
|
|
- __smp_call_function_single(cpu, cp, 0);
|
|
- return 0;
|
|
- }
|
|
- return 1;
|
|
-}
|
|
-#else /* CONFIG_USE_GENERIC_SMP_HELPERS */
|
|
-static int __try_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
|
-{
|
|
- return 1;
|
|
-}
|
|
-#endif
|
|
-
|
|
-/**
|
|
- * __send_remote_softirq - try to schedule softirq work on a remote cpu
|
|
- * @cp: private SMP call function data area
|
|
- * @cpu: the remote cpu
|
|
- * @this_cpu: the currently executing cpu
|
|
- * @softirq: the softirq for the work
|
|
- *
|
|
- * Attempt to schedule softirq work on a remote cpu. If this cannot be
|
|
- * done, the work is instead queued up on the local cpu.
|
|
- *
|
|
- * Interrupts must be disabled.
|
|
- */
|
|
-void __send_remote_softirq(struct call_single_data *cp, int cpu, int this_cpu, int softirq)
|
|
-{
|
|
- if (cpu == this_cpu || __try_remote_softirq(cp, cpu, softirq))
|
|
- __local_trigger(cp, softirq);
|
|
-}
|
|
-EXPORT_SYMBOL(__send_remote_softirq);
|
|
-
|
|
-/**
|
|
- * send_remote_softirq - try to schedule softirq work on a remote cpu
|
|
- * @cp: private SMP call function data area
|
|
- * @cpu: the remote cpu
|
|
- * @softirq: the softirq for the work
|
|
- *
|
|
- * Like __send_remote_softirq except that disabling interrupts and
|
|
- * computing the current cpu is done for the caller.
|
|
- */
|
|
-void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
|
-{
|
|
- unsigned long flags;
|
|
- int this_cpu;
|
|
-
|
|
- local_irq_save(flags);
|
|
- this_cpu = smp_processor_id();
|
|
- __send_remote_softirq(cp, cpu, this_cpu, softirq);
|
|
- local_irq_restore(flags);
|
|
-}
|
|
-EXPORT_SYMBOL(send_remote_softirq);
|
|
-
|
|
-static int __cpuinit remote_softirq_cpu_notify(struct notifier_block *self,
|
|
- unsigned long action, void *hcpu)
|
|
-{
|
|
- /*
|
|
- * If a CPU goes away, splice its entries to the current CPU
|
|
- * and trigger a run of the softirq
|
|
- */
|
|
- if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
|
|
- int cpu = (unsigned long) hcpu;
|
|
- int i;
|
|
-
|
|
- local_irq_disable();
|
|
- for (i = 0; i < NR_SOFTIRQS; i++) {
|
|
- struct list_head *head = &per_cpu(softirq_work_list[i], cpu);
|
|
- struct list_head *local_head;
|
|
-
|
|
- if (list_empty(head))
|
|
- continue;
|
|
-
|
|
- local_head = &__get_cpu_var(softirq_work_list[i]);
|
|
- list_splice_init(head, local_head);
|
|
- raise_softirq_irqoff(i);
|
|
- }
|
|
- local_irq_enable();
|
|
- }
|
|
-
|
|
- return NOTIFY_OK;
|
|
-}
|
|
-
|
|
-static struct notifier_block __cpuinitdata remote_softirq_cpu_notifier = {
|
|
- .notifier_call = remote_softirq_cpu_notify,
|
|
-};
|
|
-
|
|
void __init softirq_init(void)
|
|
{
|
|
int cpu;
|
|
|
|
for_each_possible_cpu(cpu) {
|
|
- int i;
|
|
-
|
|
per_cpu(tasklet_vec, cpu).tail =
|
|
&per_cpu(tasklet_vec, cpu).head;
|
|
per_cpu(tasklet_hi_vec, cpu).tail =
|
|
&per_cpu(tasklet_hi_vec, cpu).head;
|
|
- for (i = 0; i < NR_SOFTIRQS; i++)
|
|
- INIT_LIST_HEAD(&per_cpu(softirq_work_list[i], cpu));
|
|
}
|
|
|
|
- register_hotcpu_notifier(&remote_softirq_cpu_notifier);
|
|
-
|
|
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
|
|
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
|
|
}
|
|
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
|
|
index 603f1fa1b7a3..ca96f411b034 100644
|
|
--- a/mm/memory-failure.c
|
|
+++ b/mm/memory-failure.c
|
|
@@ -1117,10 +1117,10 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|
* The check (unnecessarily) ignores LRU pages being isolated and
|
|
* walked by the page reclaim code, however that's not a big loss.
|
|
*/
|
|
- if (!PageHuge(p) && !PageTransTail(p)) {
|
|
- if (!PageLRU(p))
|
|
- shake_page(p, 0);
|
|
- if (!PageLRU(p)) {
|
|
+ if (!PageHuge(p)) {
|
|
+ if (!PageLRU(hpage))
|
|
+ shake_page(hpage, 0);
|
|
+ if (!PageLRU(hpage)) {
|
|
/*
|
|
* shake_page could have turned it free.
|
|
*/
|
|
diff --git a/sound/oss/sequencer.c b/sound/oss/sequencer.c
|
|
index 4ff60a6427d9..2e67dd590be5 100644
|
|
--- a/sound/oss/sequencer.c
|
|
+++ b/sound/oss/sequencer.c
|
|
@@ -683,13 +683,8 @@ static int seq_timing_event(unsigned char *event_rec)
|
|
break;
|
|
|
|
case TMR_ECHO:
|
|
- if (seq_mode == SEQ_2)
|
|
- seq_copy_to_input(event_rec, 8);
|
|
- else
|
|
- {
|
|
- parm = (parm << 8 | SEQ_ECHO);
|
|
- seq_copy_to_input((unsigned char *) &parm, 4);
|
|
- }
|
|
+ parm = (parm << 8 | SEQ_ECHO);
|
|
+ seq_copy_to_input((unsigned char *) &parm, 4);
|
|
break;
|
|
|
|
default:;
|
|
@@ -1332,7 +1327,6 @@ int sequencer_ioctl(int dev, struct file *file, unsigned int cmd, void __user *a
|
|
int mode = translate_mode(file);
|
|
struct synth_info inf;
|
|
struct seq_event_rec event_rec;
|
|
- unsigned long flags;
|
|
int __user *p = arg;
|
|
|
|
orig_dev = dev = dev >> 4;
|
|
@@ -1487,9 +1481,7 @@ int sequencer_ioctl(int dev, struct file *file, unsigned int cmd, void __user *a
|
|
case SNDCTL_SEQ_OUTOFBAND:
|
|
if (copy_from_user(&event_rec, arg, sizeof(event_rec)))
|
|
return -EFAULT;
|
|
- spin_lock_irqsave(&lock,flags);
|
|
play_event(event_rec.arr);
|
|
- spin_unlock_irqrestore(&lock,flags);
|
|
return 0;
|
|
|
|
case SNDCTL_MIDI_INFO:
|