diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/cpufreq.h | 4 | ||||
| -rw-r--r-- | include/linux/device.h | 2 | ||||
| -rw-r--r-- | include/linux/dmar.h | 50 | ||||
| -rw-r--r-- | include/linux/intel-iommu.h | 3 | ||||
| -rw-r--r-- | include/linux/iommu.h | 32 | ||||
| -rw-r--r-- | include/linux/iova.h | 5 | ||||
| -rw-r--r-- | include/linux/kernfs.h | 1 | ||||
| -rw-r--r-- | include/linux/libata.h | 1 | ||||
| -rw-r--r-- | include/linux/mlx4/device.h | 4 | ||||
| -rw-r--r-- | include/linux/mutex.h | 4 | ||||
| -rw-r--r-- | include/linux/of_mdio.h | 8 | ||||
| -rw-r--r-- | include/linux/omap-iommu.h | 37 | ||||
| -rw-r--r-- | include/linux/osq_lock.h | 27 | ||||
| -rw-r--r-- | include/linux/pagemap.h | 12 | ||||
| -rw-r--r-- | include/linux/percpu-defs.h | 4 | ||||
| -rw-r--r-- | include/linux/platform_data/iommu-omap.h | 6 | ||||
| -rw-r--r-- | include/linux/rcupdate.h | 46 | ||||
| -rw-r--r-- | include/linux/rwsem-spinlock.h | 8 | ||||
| -rw-r--r-- | include/linux/rwsem.h | 34 | ||||
| -rw-r--r-- | include/linux/sched.h | 8 |
20 files changed, 142 insertions, 154 deletions
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index ec4112d257bc..8f8ae95c6e27 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
| @@ -482,8 +482,8 @@ extern struct cpufreq_governor cpufreq_gov_conservative; | |||
| 482 | *********************************************************************/ | 482 | *********************************************************************/ |
| 483 | 483 | ||
| 484 | /* Special Values of .frequency field */ | 484 | /* Special Values of .frequency field */ |
| 485 | #define CPUFREQ_ENTRY_INVALID ~0 | 485 | #define CPUFREQ_ENTRY_INVALID ~0u |
| 486 | #define CPUFREQ_TABLE_END ~1 | 486 | #define CPUFREQ_TABLE_END ~1u |
| 487 | /* Special Values of .flags field */ | 487 | /* Special Values of .flags field */ |
| 488 | #define CPUFREQ_BOOST_FREQ (1 << 0) | 488 | #define CPUFREQ_BOOST_FREQ (1 << 0) |
| 489 | 489 | ||
diff --git a/include/linux/device.h b/include/linux/device.h index af424acd393d..75f5bcb8930b 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
| @@ -124,7 +124,7 @@ struct bus_type { | |||
| 124 | 124 | ||
| 125 | const struct dev_pm_ops *pm; | 125 | const struct dev_pm_ops *pm; |
| 126 | 126 | ||
| 127 | struct iommu_ops *iommu_ops; | 127 | const struct iommu_ops *iommu_ops; |
| 128 | 128 | ||
| 129 | struct subsys_private *p; | 129 | struct subsys_private *p; |
| 130 | struct lock_class_key lock_key; | 130 | struct lock_class_key lock_key; |
diff --git a/include/linux/dmar.h b/include/linux/dmar.h index 23c8db129560..1deece46a0ca 100644 --- a/include/linux/dmar.h +++ b/include/linux/dmar.h | |||
| @@ -114,22 +114,30 @@ extern int dmar_remove_dev_scope(struct dmar_pci_notify_info *info, | |||
| 114 | /* Intel IOMMU detection */ | 114 | /* Intel IOMMU detection */ |
| 115 | extern int detect_intel_iommu(void); | 115 | extern int detect_intel_iommu(void); |
| 116 | extern int enable_drhd_fault_handling(void); | 116 | extern int enable_drhd_fault_handling(void); |
| 117 | #else | 117 | |
| 118 | struct dmar_pci_notify_info; | 118 | #ifdef CONFIG_INTEL_IOMMU |
| 119 | static inline int detect_intel_iommu(void) | 119 | extern int iommu_detected, no_iommu; |
| 120 | extern int intel_iommu_init(void); | ||
| 121 | extern int dmar_parse_one_rmrr(struct acpi_dmar_header *header); | ||
| 122 | extern int dmar_parse_one_atsr(struct acpi_dmar_header *header); | ||
| 123 | extern int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info); | ||
| 124 | #else /* !CONFIG_INTEL_IOMMU: */ | ||
| 125 | static inline int intel_iommu_init(void) { return -ENODEV; } | ||
| 126 | static inline int dmar_parse_one_rmrr(struct acpi_dmar_header *header) | ||
| 120 | { | 127 | { |
| 121 | return -ENODEV; | 128 | return 0; |
| 122 | } | 129 | } |
| 123 | 130 | static inline int dmar_parse_one_atsr(struct acpi_dmar_header *header) | |
| 124 | static inline int dmar_table_init(void) | ||
| 125 | { | 131 | { |
| 126 | return -ENODEV; | 132 | return 0; |
| 127 | } | 133 | } |
| 128 | static inline int enable_drhd_fault_handling(void) | 134 | static inline int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info) |
| 129 | { | 135 | { |
| 130 | return -1; | 136 | return 0; |
| 131 | } | 137 | } |
| 132 | #endif /* !CONFIG_DMAR_TABLE */ | 138 | #endif /* CONFIG_INTEL_IOMMU */ |
| 139 | |||
| 140 | #endif /* CONFIG_DMAR_TABLE */ | ||
| 133 | 141 | ||
| 134 | struct irte { | 142 | struct irte { |
| 135 | union { | 143 | union { |
| @@ -177,26 +185,4 @@ extern int dmar_set_interrupt(struct intel_iommu *iommu); | |||
| 177 | extern irqreturn_t dmar_fault(int irq, void *dev_id); | 185 | extern irqreturn_t dmar_fault(int irq, void *dev_id); |
| 178 | extern int arch_setup_dmar_msi(unsigned int irq); | 186 | extern int arch_setup_dmar_msi(unsigned int irq); |
| 179 | 187 | ||
| 180 | #ifdef CONFIG_INTEL_IOMMU | ||
| 181 | extern int iommu_detected, no_iommu; | ||
| 182 | extern int dmar_parse_one_rmrr(struct acpi_dmar_header *header); | ||
| 183 | extern int dmar_parse_one_atsr(struct acpi_dmar_header *header); | ||
| 184 | extern int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info); | ||
| 185 | extern int intel_iommu_init(void); | ||
| 186 | #else /* !CONFIG_INTEL_IOMMU: */ | ||
| 187 | static inline int intel_iommu_init(void) { return -ENODEV; } | ||
| 188 | static inline int dmar_parse_one_rmrr(struct acpi_dmar_header *header) | ||
| 189 | { | ||
| 190 | return 0; | ||
| 191 | } | ||
| 192 | static inline int dmar_parse_one_atsr(struct acpi_dmar_header *header) | ||
| 193 | { | ||
| 194 | return 0; | ||
| 195 | } | ||
| 196 | static inline int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info) | ||
| 197 | { | ||
| 198 | return 0; | ||
| 199 | } | ||
| 200 | #endif /* CONFIG_INTEL_IOMMU */ | ||
| 201 | |||
| 202 | #endif /* __DMAR_H__ */ | 188 | #endif /* __DMAR_H__ */ |
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 0a2da5188217..a65208a8fe18 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h | |||
| @@ -336,6 +336,7 @@ struct intel_iommu { | |||
| 336 | #ifdef CONFIG_IRQ_REMAP | 336 | #ifdef CONFIG_IRQ_REMAP |
| 337 | struct ir_table *ir_table; /* Interrupt remapping info */ | 337 | struct ir_table *ir_table; /* Interrupt remapping info */ |
| 338 | #endif | 338 | #endif |
| 339 | struct device *iommu_dev; /* IOMMU-sysfs device */ | ||
| 339 | int node; | 340 | int node; |
| 340 | }; | 341 | }; |
| 341 | 342 | ||
| @@ -365,4 +366,6 @@ extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu); | |||
| 365 | 366 | ||
| 366 | extern int dmar_ir_support(void); | 367 | extern int dmar_ir_support(void); |
| 367 | 368 | ||
| 369 | extern const struct attribute_group *intel_iommu_groups[]; | ||
| 370 | |||
| 368 | #endif | 371 | #endif |
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index b96a5b2136e4..20f9a527922a 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
| @@ -50,7 +50,7 @@ struct iommu_domain_geometry { | |||
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | struct iommu_domain { | 52 | struct iommu_domain { |
| 53 | struct iommu_ops *ops; | 53 | const struct iommu_ops *ops; |
| 54 | void *priv; | 54 | void *priv; |
| 55 | iommu_fault_handler_t handler; | 55 | iommu_fault_handler_t handler; |
| 56 | void *handler_token; | 56 | void *handler_token; |
| @@ -140,7 +140,7 @@ struct iommu_ops { | |||
| 140 | #define IOMMU_GROUP_NOTIFY_UNBIND_DRIVER 5 /* Pre Driver unbind */ | 140 | #define IOMMU_GROUP_NOTIFY_UNBIND_DRIVER 5 /* Pre Driver unbind */ |
| 141 | #define IOMMU_GROUP_NOTIFY_UNBOUND_DRIVER 6 /* Post Driver unbind */ | 141 | #define IOMMU_GROUP_NOTIFY_UNBOUND_DRIVER 6 /* Post Driver unbind */ |
| 142 | 142 | ||
| 143 | extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); | 143 | extern int bus_set_iommu(struct bus_type *bus, const struct iommu_ops *ops); |
| 144 | extern bool iommu_present(struct bus_type *bus); | 144 | extern bool iommu_present(struct bus_type *bus); |
| 145 | extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus); | 145 | extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus); |
| 146 | extern struct iommu_group *iommu_group_get_by_id(int id); | 146 | extern struct iommu_group *iommu_group_get_by_id(int id); |
| @@ -181,11 +181,18 @@ extern int iommu_group_register_notifier(struct iommu_group *group, | |||
| 181 | extern int iommu_group_unregister_notifier(struct iommu_group *group, | 181 | extern int iommu_group_unregister_notifier(struct iommu_group *group, |
| 182 | struct notifier_block *nb); | 182 | struct notifier_block *nb); |
| 183 | extern int iommu_group_id(struct iommu_group *group); | 183 | extern int iommu_group_id(struct iommu_group *group); |
| 184 | extern struct iommu_group *iommu_group_get_for_dev(struct device *dev); | ||
| 184 | 185 | ||
| 185 | extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr, | 186 | extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr, |
| 186 | void *data); | 187 | void *data); |
| 187 | extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr, | 188 | extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr, |
| 188 | void *data); | 189 | void *data); |
| 190 | struct device *iommu_device_create(struct device *parent, void *drvdata, | ||
| 191 | const struct attribute_group **groups, | ||
| 192 | const char *fmt, ...); | ||
| 193 | void iommu_device_destroy(struct device *dev); | ||
| 194 | int iommu_device_link(struct device *dev, struct device *link); | ||
| 195 | void iommu_device_unlink(struct device *dev, struct device *link); | ||
| 189 | 196 | ||
| 190 | /* Window handling function prototypes */ | 197 | /* Window handling function prototypes */ |
| 191 | extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr, | 198 | extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr, |
| @@ -396,6 +403,27 @@ static inline int iommu_domain_set_attr(struct iommu_domain *domain, | |||
| 396 | return -EINVAL; | 403 | return -EINVAL; |
| 397 | } | 404 | } |
| 398 | 405 | ||
| 406 | static inline struct device *iommu_device_create(struct device *parent, | ||
| 407 | void *drvdata, | ||
| 408 | const struct attribute_group **groups, | ||
| 409 | const char *fmt, ...) | ||
| 410 | { | ||
| 411 | return ERR_PTR(-ENODEV); | ||
| 412 | } | ||
| 413 | |||
| 414 | static inline void iommu_device_destroy(struct device *dev) | ||
| 415 | { | ||
| 416 | } | ||
| 417 | |||
| 418 | static inline int iommu_device_link(struct device *dev, struct device *link) | ||
| 419 | { | ||
| 420 | return -EINVAL; | ||
| 421 | } | ||
| 422 | |||
| 423 | static inline void iommu_device_unlink(struct device *dev, struct device *link) | ||
| 424 | { | ||
| 425 | } | ||
| 426 | |||
| 399 | #endif /* CONFIG_IOMMU_API */ | 427 | #endif /* CONFIG_IOMMU_API */ |
| 400 | 428 | ||
| 401 | #endif /* __LINUX_IOMMU_H */ | 429 | #endif /* __LINUX_IOMMU_H */ |
diff --git a/include/linux/iova.h b/include/linux/iova.h index 3277f4711349..19e81d5ccb6d 100644 --- a/include/linux/iova.h +++ b/include/linux/iova.h | |||
| @@ -34,6 +34,11 @@ struct iova_domain { | |||
| 34 | unsigned long dma_32bit_pfn; | 34 | unsigned long dma_32bit_pfn; |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | static inline unsigned long iova_size(struct iova *iova) | ||
| 38 | { | ||
| 39 | return iova->pfn_hi - iova->pfn_lo + 1; | ||
| 40 | } | ||
| 41 | |||
| 37 | struct iova *alloc_iova_mem(void); | 42 | struct iova *alloc_iova_mem(void); |
| 38 | void free_iova_mem(struct iova *iova); | 43 | void free_iova_mem(struct iova *iova); |
| 39 | void free_iova(struct iova_domain *iovad, unsigned long pfn); | 44 | void free_iova(struct iova_domain *iovad, unsigned long pfn); |
diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 145375ea0bd9..30faf797c2c3 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h | |||
| @@ -305,6 +305,7 @@ struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, | |||
| 305 | struct kernfs_root *root, unsigned long magic, | 305 | struct kernfs_root *root, unsigned long magic, |
| 306 | bool *new_sb_created, const void *ns); | 306 | bool *new_sb_created, const void *ns); |
| 307 | void kernfs_kill_sb(struct super_block *sb); | 307 | void kernfs_kill_sb(struct super_block *sb); |
| 308 | struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns); | ||
| 308 | 309 | ||
| 309 | void kernfs_init(void); | 310 | void kernfs_init(void); |
| 310 | 311 | ||
diff --git a/include/linux/libata.h b/include/linux/libata.h index 5ab4e3a76721..92abb497ab14 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -593,6 +593,7 @@ struct ata_host { | |||
| 593 | struct device *dev; | 593 | struct device *dev; |
| 594 | void __iomem * const *iomap; | 594 | void __iomem * const *iomap; |
| 595 | unsigned int n_ports; | 595 | unsigned int n_ports; |
| 596 | unsigned int n_tags; /* nr of NCQ tags */ | ||
| 596 | void *private_data; | 597 | void *private_data; |
| 597 | struct ata_port_operations *ops; | 598 | struct ata_port_operations *ops; |
| 598 | unsigned long flags; | 599 | unsigned long flags; |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index b12f4bbd064c..35b51e7af886 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
| @@ -578,8 +578,6 @@ struct mlx4_cq { | |||
| 578 | u32 cons_index; | 578 | u32 cons_index; |
| 579 | 579 | ||
| 580 | u16 irq; | 580 | u16 irq; |
| 581 | bool irq_affinity_change; | ||
| 582 | |||
| 583 | __be32 *set_ci_db; | 581 | __be32 *set_ci_db; |
| 584 | __be32 *arm_db; | 582 | __be32 *arm_db; |
| 585 | int arm_sn; | 583 | int arm_sn; |
| @@ -1167,6 +1165,8 @@ int mlx4_assign_eq(struct mlx4_dev *dev, char *name, struct cpu_rmap *rmap, | |||
| 1167 | int *vector); | 1165 | int *vector); |
| 1168 | void mlx4_release_eq(struct mlx4_dev *dev, int vec); | 1166 | void mlx4_release_eq(struct mlx4_dev *dev, int vec); |
| 1169 | 1167 | ||
| 1168 | int mlx4_eq_get_irq(struct mlx4_dev *dev, int vec); | ||
| 1169 | |||
| 1170 | int mlx4_get_phys_port_id(struct mlx4_dev *dev); | 1170 | int mlx4_get_phys_port_id(struct mlx4_dev *dev); |
| 1171 | int mlx4_wol_read(struct mlx4_dev *dev, u64 *config, int port); | 1171 | int mlx4_wol_read(struct mlx4_dev *dev, u64 *config, int port); |
| 1172 | int mlx4_wol_write(struct mlx4_dev *dev, u64 config, int port); | 1172 | int mlx4_wol_write(struct mlx4_dev *dev, u64 config, int port); |
diff --git a/include/linux/mutex.h b/include/linux/mutex.h index 11692dea18aa..42aa9b9ecd5f 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/lockdep.h> | 17 | #include <linux/lockdep.h> |
| 18 | #include <linux/atomic.h> | 18 | #include <linux/atomic.h> |
| 19 | #include <asm/processor.h> | 19 | #include <asm/processor.h> |
| 20 | #include <linux/osq_lock.h> | ||
| 20 | 21 | ||
| 21 | /* | 22 | /* |
| 22 | * Simple, straightforward mutexes with strict semantics: | 23 | * Simple, straightforward mutexes with strict semantics: |
| @@ -46,7 +47,6 @@ | |||
| 46 | * - detects multi-task circular deadlocks and prints out all affected | 47 | * - detects multi-task circular deadlocks and prints out all affected |
| 47 | * locks and tasks (and only those tasks) | 48 | * locks and tasks (and only those tasks) |
| 48 | */ | 49 | */ |
| 49 | struct optimistic_spin_queue; | ||
| 50 | struct mutex { | 50 | struct mutex { |
| 51 | /* 1: unlocked, 0: locked, negative: locked, possible waiters */ | 51 | /* 1: unlocked, 0: locked, negative: locked, possible waiters */ |
| 52 | atomic_t count; | 52 | atomic_t count; |
| @@ -56,7 +56,7 @@ struct mutex { | |||
| 56 | struct task_struct *owner; | 56 | struct task_struct *owner; |
| 57 | #endif | 57 | #endif |
| 58 | #ifdef CONFIG_MUTEX_SPIN_ON_OWNER | 58 | #ifdef CONFIG_MUTEX_SPIN_ON_OWNER |
| 59 | struct optimistic_spin_queue *osq; /* Spinner MCS lock */ | 59 | struct optimistic_spin_queue osq; /* Spinner MCS lock */ |
| 60 | #endif | 60 | #endif |
| 61 | #ifdef CONFIG_DEBUG_MUTEXES | 61 | #ifdef CONFIG_DEBUG_MUTEXES |
| 62 | const char *name; | 62 | const char *name; |
diff --git a/include/linux/of_mdio.h b/include/linux/of_mdio.h index a70c9493d55a..d449018d0726 100644 --- a/include/linux/of_mdio.h +++ b/include/linux/of_mdio.h | |||
| @@ -25,9 +25,6 @@ struct phy_device *of_phy_attach(struct net_device *dev, | |||
| 25 | 25 | ||
| 26 | extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np); | 26 | extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np); |
| 27 | 27 | ||
| 28 | extern void of_mdiobus_link_phydev(struct mii_bus *mdio, | ||
| 29 | struct phy_device *phydev); | ||
| 30 | |||
| 31 | #else /* CONFIG_OF */ | 28 | #else /* CONFIG_OF */ |
| 32 | static inline int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) | 29 | static inline int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) |
| 33 | { | 30 | { |
| @@ -63,11 +60,6 @@ static inline struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np) | |||
| 63 | { | 60 | { |
| 64 | return NULL; | 61 | return NULL; |
| 65 | } | 62 | } |
| 66 | |||
| 67 | static inline void of_mdiobus_link_phydev(struct mii_bus *mdio, | ||
| 68 | struct phy_device *phydev) | ||
| 69 | { | ||
| 70 | } | ||
| 71 | #endif /* CONFIG_OF */ | 63 | #endif /* CONFIG_OF */ |
| 72 | 64 | ||
| 73 | #if defined(CONFIG_OF) && defined(CONFIG_FIXED_PHY) | 65 | #if defined(CONFIG_OF) && defined(CONFIG_FIXED_PHY) |
diff --git a/include/linux/omap-iommu.h b/include/linux/omap-iommu.h index cac78de09c07..c1aede46718b 100644 --- a/include/linux/omap-iommu.h +++ b/include/linux/omap-iommu.h | |||
| @@ -10,41 +10,8 @@ | |||
| 10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef _INTEL_IOMMU_H_ | 13 | #ifndef _OMAP_IOMMU_H_ |
| 14 | #define _INTEL_IOMMU_H_ | 14 | #define _OMAP_IOMMU_H_ |
| 15 | |||
| 16 | struct iovm_struct { | ||
| 17 | struct omap_iommu *iommu; /* iommu object which this belongs to */ | ||
| 18 | u32 da_start; /* area definition */ | ||
| 19 | u32 da_end; | ||
| 20 | u32 flags; /* IOVMF_: see below */ | ||
| 21 | struct list_head list; /* linked in ascending order */ | ||
| 22 | const struct sg_table *sgt; /* keep 'page' <-> 'da' mapping */ | ||
| 23 | void *va; /* mpu side mapped address */ | ||
| 24 | }; | ||
| 25 | |||
| 26 | #define MMU_RAM_ENDIAN_SHIFT 9 | ||
| 27 | #define MMU_RAM_ENDIAN_LITTLE (0 << MMU_RAM_ENDIAN_SHIFT) | ||
| 28 | #define MMU_RAM_ELSZ_8 (0 << MMU_RAM_ELSZ_SHIFT) | ||
| 29 | #define IOVMF_ENDIAN_LITTLE MMU_RAM_ENDIAN_LITTLE | ||
| 30 | #define MMU_RAM_ELSZ_SHIFT 7 | ||
| 31 | #define IOVMF_ELSZ_8 MMU_RAM_ELSZ_8 | ||
| 32 | |||
| 33 | struct iommu_domain; | ||
| 34 | |||
| 35 | extern struct iovm_struct *omap_find_iovm_area(struct device *dev, u32 da); | ||
| 36 | extern u32 | ||
| 37 | omap_iommu_vmap(struct iommu_domain *domain, struct device *dev, u32 da, | ||
| 38 | const struct sg_table *sgt, u32 flags); | ||
| 39 | extern struct sg_table *omap_iommu_vunmap(struct iommu_domain *domain, | ||
| 40 | struct device *dev, u32 da); | ||
| 41 | extern u32 | ||
| 42 | omap_iommu_vmalloc(struct iommu_domain *domain, struct device *dev, | ||
| 43 | u32 da, size_t bytes, u32 flags); | ||
| 44 | extern void | ||
| 45 | omap_iommu_vfree(struct iommu_domain *domain, struct device *dev, | ||
| 46 | const u32 da); | ||
| 47 | extern void *omap_da_to_va(struct device *dev, u32 da); | ||
| 48 | 15 | ||
| 49 | extern void omap_iommu_save_ctx(struct device *dev); | 16 | extern void omap_iommu_save_ctx(struct device *dev); |
| 50 | extern void omap_iommu_restore_ctx(struct device *dev); | 17 | extern void omap_iommu_restore_ctx(struct device *dev); |
diff --git a/include/linux/osq_lock.h b/include/linux/osq_lock.h new file mode 100644 index 000000000000..90230d5811c5 --- /dev/null +++ b/include/linux/osq_lock.h | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | #ifndef __LINUX_OSQ_LOCK_H | ||
| 2 | #define __LINUX_OSQ_LOCK_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * An MCS like lock especially tailored for optimistic spinning for sleeping | ||
| 6 | * lock implementations (mutex, rwsem, etc). | ||
| 7 | */ | ||
| 8 | |||
| 9 | #define OSQ_UNLOCKED_VAL (0) | ||
| 10 | |||
| 11 | struct optimistic_spin_queue { | ||
| 12 | /* | ||
| 13 | * Stores an encoded value of the CPU # of the tail node in the queue. | ||
| 14 | * If the queue is empty, then it's set to OSQ_UNLOCKED_VAL. | ||
| 15 | */ | ||
| 16 | atomic_t tail; | ||
| 17 | }; | ||
| 18 | |||
| 19 | /* Init macro and function. */ | ||
| 20 | #define OSQ_LOCK_UNLOCKED { ATOMIC_INIT(OSQ_UNLOCKED_VAL) } | ||
| 21 | |||
| 22 | static inline void osq_lock_init(struct optimistic_spin_queue *lock) | ||
| 23 | { | ||
| 24 | atomic_set(&lock->tail, OSQ_UNLOCKED_VAL); | ||
| 25 | } | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 0a97b583ee8d..e1474ae18c88 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
| @@ -399,6 +399,18 @@ static inline struct page *read_mapping_page(struct address_space *mapping, | |||
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | /* | 401 | /* |
| 402 | * Get the offset in PAGE_SIZE. | ||
| 403 | * (TODO: hugepage should have ->index in PAGE_SIZE) | ||
| 404 | */ | ||
| 405 | static inline pgoff_t page_to_pgoff(struct page *page) | ||
| 406 | { | ||
| 407 | if (unlikely(PageHeadHuge(page))) | ||
| 408 | return page->index << compound_order(page); | ||
| 409 | else | ||
| 410 | return page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | ||
| 411 | } | ||
| 412 | |||
| 413 | /* | ||
| 402 | * Return byte-offset into filesystem object for page. | 414 | * Return byte-offset into filesystem object for page. |
| 403 | */ | 415 | */ |
| 404 | static inline loff_t page_offset(struct page *page) | 416 | static inline loff_t page_offset(struct page *page) |
diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h index a5fc7d01aad6..dec01d6c3f80 100644 --- a/include/linux/percpu-defs.h +++ b/include/linux/percpu-defs.h | |||
| @@ -146,10 +146,10 @@ | |||
| 146 | * Declaration/definition used for per-CPU variables that must be read mostly. | 146 | * Declaration/definition used for per-CPU variables that must be read mostly. |
| 147 | */ | 147 | */ |
| 148 | #define DECLARE_PER_CPU_READ_MOSTLY(type, name) \ | 148 | #define DECLARE_PER_CPU_READ_MOSTLY(type, name) \ |
| 149 | DECLARE_PER_CPU_SECTION(type, name, "..readmostly") | 149 | DECLARE_PER_CPU_SECTION(type, name, "..read_mostly") |
| 150 | 150 | ||
| 151 | #define DEFINE_PER_CPU_READ_MOSTLY(type, name) \ | 151 | #define DEFINE_PER_CPU_READ_MOSTLY(type, name) \ |
| 152 | DEFINE_PER_CPU_SECTION(type, name, "..readmostly") | 152 | DEFINE_PER_CPU_SECTION(type, name, "..read_mostly") |
| 153 | 153 | ||
| 154 | /* | 154 | /* |
| 155 | * Intermodule exports for per-CPU variables. sparse forgets about | 155 | * Intermodule exports for per-CPU variables. sparse forgets about |
diff --git a/include/linux/platform_data/iommu-omap.h b/include/linux/platform_data/iommu-omap.h index 5b429c43a297..54a0a9582fad 100644 --- a/include/linux/platform_data/iommu-omap.h +++ b/include/linux/platform_data/iommu-omap.h | |||
| @@ -31,14 +31,10 @@ struct omap_iommu_arch_data { | |||
| 31 | 31 | ||
| 32 | /** | 32 | /** |
| 33 | * struct omap_mmu_dev_attr - OMAP mmu device attributes for omap_hwmod | 33 | * struct omap_mmu_dev_attr - OMAP mmu device attributes for omap_hwmod |
| 34 | * @da_start: device address where the va space starts. | ||
| 35 | * @da_end: device address where the va space ends. | ||
| 36 | * @nr_tlb_entries: number of entries supported by the translation | 34 | * @nr_tlb_entries: number of entries supported by the translation |
| 37 | * look-aside buffer (TLB). | 35 | * look-aside buffer (TLB). |
| 38 | */ | 36 | */ |
| 39 | struct omap_mmu_dev_attr { | 37 | struct omap_mmu_dev_attr { |
| 40 | u32 da_start; | ||
| 41 | u32 da_end; | ||
| 42 | int nr_tlb_entries; | 38 | int nr_tlb_entries; |
| 43 | }; | 39 | }; |
| 44 | 40 | ||
| @@ -46,8 +42,6 @@ struct iommu_platform_data { | |||
| 46 | const char *name; | 42 | const char *name; |
| 47 | const char *reset_name; | 43 | const char *reset_name; |
| 48 | int nr_tlb_entries; | 44 | int nr_tlb_entries; |
| 49 | u32 da_start; | ||
| 50 | u32 da_end; | ||
| 51 | 45 | ||
| 52 | int (*assert_reset)(struct platform_device *pdev, const char *name); | 46 | int (*assert_reset)(struct platform_device *pdev, const char *name); |
| 53 | int (*deassert_reset)(struct platform_device *pdev, const char *name); | 47 | int (*deassert_reset)(struct platform_device *pdev, const char *name); |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 5a75d19aa661..6a94cc8b1ca0 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
| @@ -44,7 +44,6 @@ | |||
| 44 | #include <linux/debugobjects.h> | 44 | #include <linux/debugobjects.h> |
| 45 | #include <linux/bug.h> | 45 | #include <linux/bug.h> |
| 46 | #include <linux/compiler.h> | 46 | #include <linux/compiler.h> |
| 47 | #include <linux/percpu.h> | ||
| 48 | #include <asm/barrier.h> | 47 | #include <asm/barrier.h> |
| 49 | 48 | ||
| 50 | extern int rcu_expedited; /* for sysctl */ | 49 | extern int rcu_expedited; /* for sysctl */ |
| @@ -300,41 +299,6 @@ bool __rcu_is_watching(void); | |||
| 300 | #endif /* #if defined(CONFIG_DEBUG_LOCK_ALLOC) || defined(CONFIG_RCU_TRACE) || defined(CONFIG_SMP) */ | 299 | #endif /* #if defined(CONFIG_DEBUG_LOCK_ALLOC) || defined(CONFIG_RCU_TRACE) || defined(CONFIG_SMP) */ |
| 301 | 300 | ||
| 302 | /* | 301 | /* |
| 303 | * Hooks for cond_resched() and friends to avoid RCU CPU stall warnings. | ||
| 304 | */ | ||
| 305 | |||
| 306 | #define RCU_COND_RESCHED_LIM 256 /* ms vs. 100s of ms. */ | ||
| 307 | DECLARE_PER_CPU(int, rcu_cond_resched_count); | ||
| 308 | void rcu_resched(void); | ||
| 309 | |||
| 310 | /* | ||
| 311 | * Is it time to report RCU quiescent states? | ||
| 312 | * | ||
| 313 | * Note unsynchronized access to rcu_cond_resched_count. Yes, we might | ||
| 314 | * increment some random CPU's count, and possibly also load the result from | ||
| 315 | * yet another CPU's count. We might even clobber some other CPU's attempt | ||
| 316 | * to zero its counter. This is all OK because the goal is not precision, | ||
| 317 | * but rather reasonable amortization of rcu_note_context_switch() overhead | ||
| 318 | * and extremely high probability of avoiding RCU CPU stall warnings. | ||
| 319 | * Note that this function has to be preempted in just the wrong place, | ||
| 320 | * many thousands of times in a row, for anything bad to happen. | ||
| 321 | */ | ||
| 322 | static inline bool rcu_should_resched(void) | ||
| 323 | { | ||
| 324 | return raw_cpu_inc_return(rcu_cond_resched_count) >= | ||
| 325 | RCU_COND_RESCHED_LIM; | ||
| 326 | } | ||
| 327 | |||
| 328 | /* | ||
| 329 | * Report quiscent states to RCU if it is time to do so. | ||
| 330 | */ | ||
| 331 | static inline void rcu_cond_resched(void) | ||
| 332 | { | ||
| 333 | if (unlikely(rcu_should_resched())) | ||
| 334 | rcu_resched(); | ||
| 335 | } | ||
| 336 | |||
| 337 | /* | ||
| 338 | * Infrastructure to implement the synchronize_() primitives in | 302 | * Infrastructure to implement the synchronize_() primitives in |
| 339 | * TREE_RCU and rcu_barrier_() primitives in TINY_RCU. | 303 | * TREE_RCU and rcu_barrier_() primitives in TINY_RCU. |
| 340 | */ | 304 | */ |
| @@ -358,9 +322,19 @@ void wait_rcu_gp(call_rcu_func_t crf); | |||
| 358 | * initialization. | 322 | * initialization. |
| 359 | */ | 323 | */ |
| 360 | #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD | 324 | #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD |
| 325 | void init_rcu_head(struct rcu_head *head); | ||
| 326 | void destroy_rcu_head(struct rcu_head *head); | ||
| 361 | void init_rcu_head_on_stack(struct rcu_head *head); | 327 | void init_rcu_head_on_stack(struct rcu_head *head); |
| 362 | void destroy_rcu_head_on_stack(struct rcu_head *head); | 328 | void destroy_rcu_head_on_stack(struct rcu_head *head); |
| 363 | #else /* !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ | 329 | #else /* !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ |
| 330 | static inline void init_rcu_head(struct rcu_head *head) | ||
| 331 | { | ||
| 332 | } | ||
| 333 | |||
| 334 | static inline void destroy_rcu_head(struct rcu_head *head) | ||
| 335 | { | ||
| 336 | } | ||
| 337 | |||
| 364 | static inline void init_rcu_head_on_stack(struct rcu_head *head) | 338 | static inline void init_rcu_head_on_stack(struct rcu_head *head) |
| 365 | { | 339 | { |
| 366 | } | 340 | } |
diff --git a/include/linux/rwsem-spinlock.h b/include/linux/rwsem-spinlock.h index d5b13bc07a0b..561e8615528d 100644 --- a/include/linux/rwsem-spinlock.h +++ b/include/linux/rwsem-spinlock.h | |||
| @@ -15,13 +15,13 @@ | |||
| 15 | #ifdef __KERNEL__ | 15 | #ifdef __KERNEL__ |
| 16 | /* | 16 | /* |
| 17 | * the rw-semaphore definition | 17 | * the rw-semaphore definition |
| 18 | * - if activity is 0 then there are no active readers or writers | 18 | * - if count is 0 then there are no active readers or writers |
| 19 | * - if activity is +ve then that is the number of active readers | 19 | * - if count is +ve then that is the number of active readers |
| 20 | * - if activity is -1 then there is one active writer | 20 | * - if count is -1 then there is one active writer |
| 21 | * - if wait_list is not empty, then there are processes waiting for the semaphore | 21 | * - if wait_list is not empty, then there are processes waiting for the semaphore |
| 22 | */ | 22 | */ |
| 23 | struct rw_semaphore { | 23 | struct rw_semaphore { |
| 24 | __s32 activity; | 24 | __s32 count; |
| 25 | raw_spinlock_t wait_lock; | 25 | raw_spinlock_t wait_lock; |
| 26 | struct list_head wait_list; | 26 | struct list_head wait_list; |
| 27 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 27 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index 8d79708146aa..035d3c57fc8a 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h | |||
| @@ -13,10 +13,11 @@ | |||
| 13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| 14 | #include <linux/list.h> | 14 | #include <linux/list.h> |
| 15 | #include <linux/spinlock.h> | 15 | #include <linux/spinlock.h> |
| 16 | |||
| 17 | #include <linux/atomic.h> | 16 | #include <linux/atomic.h> |
| 17 | #ifdef CONFIG_RWSEM_SPIN_ON_OWNER | ||
| 18 | #include <linux/osq_lock.h> | ||
| 19 | #endif | ||
| 18 | 20 | ||
| 19 | struct optimistic_spin_queue; | ||
| 20 | struct rw_semaphore; | 21 | struct rw_semaphore; |
| 21 | 22 | ||
| 22 | #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK | 23 | #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK |
| @@ -25,15 +26,15 @@ struct rw_semaphore; | |||
| 25 | /* All arch specific implementations share the same struct */ | 26 | /* All arch specific implementations share the same struct */ |
| 26 | struct rw_semaphore { | 27 | struct rw_semaphore { |
| 27 | long count; | 28 | long count; |
| 28 | raw_spinlock_t wait_lock; | ||
| 29 | struct list_head wait_list; | 29 | struct list_head wait_list; |
| 30 | #ifdef CONFIG_SMP | 30 | raw_spinlock_t wait_lock; |
| 31 | #ifdef CONFIG_RWSEM_SPIN_ON_OWNER | ||
| 32 | struct optimistic_spin_queue osq; /* spinner MCS lock */ | ||
| 31 | /* | 33 | /* |
| 32 | * Write owner. Used as a speculative check to see | 34 | * Write owner. Used as a speculative check to see |
| 33 | * if the owner is running on the cpu. | 35 | * if the owner is running on the cpu. |
| 34 | */ | 36 | */ |
| 35 | struct task_struct *owner; | 37 | struct task_struct *owner; |
| 36 | struct optimistic_spin_queue *osq; /* spinner MCS lock */ | ||
| 37 | #endif | 38 | #endif |
| 38 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 39 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 39 | struct lockdep_map dep_map; | 40 | struct lockdep_map dep_map; |
| @@ -64,22 +65,19 @@ static inline int rwsem_is_locked(struct rw_semaphore *sem) | |||
| 64 | # define __RWSEM_DEP_MAP_INIT(lockname) | 65 | # define __RWSEM_DEP_MAP_INIT(lockname) |
| 65 | #endif | 66 | #endif |
| 66 | 67 | ||
| 67 | #if defined(CONFIG_SMP) && !defined(CONFIG_RWSEM_GENERIC_SPINLOCK) | 68 | #ifdef CONFIG_RWSEM_SPIN_ON_OWNER |
| 68 | #define __RWSEM_INITIALIZER(name) \ | 69 | #define __RWSEM_OPT_INIT(lockname) , .osq = OSQ_LOCK_UNLOCKED, .owner = NULL |
| 69 | { RWSEM_UNLOCKED_VALUE, \ | ||
| 70 | __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ | ||
| 71 | LIST_HEAD_INIT((name).wait_list), \ | ||
| 72 | NULL, /* owner */ \ | ||
| 73 | NULL /* mcs lock */ \ | ||
| 74 | __RWSEM_DEP_MAP_INIT(name) } | ||
| 75 | #else | 70 | #else |
| 76 | #define __RWSEM_INITIALIZER(name) \ | 71 | #define __RWSEM_OPT_INIT(lockname) |
| 77 | { RWSEM_UNLOCKED_VALUE, \ | ||
| 78 | __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ | ||
| 79 | LIST_HEAD_INIT((name).wait_list) \ | ||
| 80 | __RWSEM_DEP_MAP_INIT(name) } | ||
| 81 | #endif | 72 | #endif |
| 82 | 73 | ||
| 74 | #define __RWSEM_INITIALIZER(name) \ | ||
| 75 | { .count = RWSEM_UNLOCKED_VALUE, \ | ||
| 76 | .wait_list = LIST_HEAD_INIT((name).wait_list), \ | ||
| 77 | .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock) \ | ||
| 78 | __RWSEM_OPT_INIT(name) \ | ||
| 79 | __RWSEM_DEP_MAP_INIT(name) } | ||
| 80 | |||
| 83 | #define DECLARE_RWSEM(name) \ | 81 | #define DECLARE_RWSEM(name) \ |
| 84 | struct rw_semaphore name = __RWSEM_INITIALIZER(name) | 82 | struct rw_semaphore name = __RWSEM_INITIALIZER(name) |
| 85 | 83 | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index 306f4f0c987a..0376b054a0d0 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -872,21 +872,21 @@ enum cpu_idle_type { | |||
| 872 | #define SD_NUMA 0x4000 /* cross-node balancing */ | 872 | #define SD_NUMA 0x4000 /* cross-node balancing */ |
| 873 | 873 | ||
| 874 | #ifdef CONFIG_SCHED_SMT | 874 | #ifdef CONFIG_SCHED_SMT |
| 875 | static inline const int cpu_smt_flags(void) | 875 | static inline int cpu_smt_flags(void) |
| 876 | { | 876 | { |
| 877 | return SD_SHARE_CPUCAPACITY | SD_SHARE_PKG_RESOURCES; | 877 | return SD_SHARE_CPUCAPACITY | SD_SHARE_PKG_RESOURCES; |
| 878 | } | 878 | } |
| 879 | #endif | 879 | #endif |
| 880 | 880 | ||
| 881 | #ifdef CONFIG_SCHED_MC | 881 | #ifdef CONFIG_SCHED_MC |
| 882 | static inline const int cpu_core_flags(void) | 882 | static inline int cpu_core_flags(void) |
| 883 | { | 883 | { |
| 884 | return SD_SHARE_PKG_RESOURCES; | 884 | return SD_SHARE_PKG_RESOURCES; |
| 885 | } | 885 | } |
| 886 | #endif | 886 | #endif |
| 887 | 887 | ||
| 888 | #ifdef CONFIG_NUMA | 888 | #ifdef CONFIG_NUMA |
| 889 | static inline const int cpu_numa_flags(void) | 889 | static inline int cpu_numa_flags(void) |
| 890 | { | 890 | { |
| 891 | return SD_NUMA; | 891 | return SD_NUMA; |
| 892 | } | 892 | } |
| @@ -999,7 +999,7 @@ void free_sched_domains(cpumask_var_t doms[], unsigned int ndoms); | |||
| 999 | bool cpus_share_cache(int this_cpu, int that_cpu); | 999 | bool cpus_share_cache(int this_cpu, int that_cpu); |
| 1000 | 1000 | ||
| 1001 | typedef const struct cpumask *(*sched_domain_mask_f)(int cpu); | 1001 | typedef const struct cpumask *(*sched_domain_mask_f)(int cpu); |
| 1002 | typedef const int (*sched_domain_flags_f)(void); | 1002 | typedef int (*sched_domain_flags_f)(void); |
| 1003 | 1003 | ||
| 1004 | #define SDTL_OVERLAP 0x01 | 1004 | #define SDTL_OVERLAP 0x01 |
| 1005 | 1005 | ||
