linux 3.19-rc4
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUsuDQAAoJEHm+PkMAQRiGnecH/0RO9UKnEduOTRPaZGXAjGI8 N0FvNia8qn7f+XnvN62pG/YZZqi2uvuy37vwAXMtS6KXEgaDG9Wq4fVrhOaJ5VgL QOmPdVGUa+1PuPcMYj/QLIFRfIHvIY/XVZWXrcIyYfQdBAAoJ2q23qx/yFmdyTwf +enAv+PV4ZVNMEANyN9KS7xX5gPbSDl36AOhm6lXDvrlem4mbnhRuUtYez9R8KTK VNfkKZQRDOgl4/ns0ndzpAUhaDj1JJGoLRgMXKna33XgtzSEL4XijvImdnoIXp5N Z98Jc1N5Vg5OcUFeGJC3bRR27m39xoOHQk2ufY43uAIfB3Ez/C7m/r7b50ZVWfs= =J7TO -----END PGP SIGNATURE----- Merge tag 'v3.19-rc4' into next Merge with mainline to bring in the latest thermal and other changes.
This commit is contained in:
commit
0c49cd295d
15497 changed files with 878449 additions and 621464 deletions
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h> /* for struct resource */
|
||||
#include <linux/device.h>
|
||||
#include <linux/property.h>
|
||||
|
||||
#ifndef _LINUX
|
||||
#define _LINUX
|
||||
|
|
@ -123,6 +124,10 @@ int acpi_numa_init (void);
|
|||
|
||||
int acpi_table_init (void);
|
||||
int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
|
||||
int __init acpi_parse_entries(char *id, unsigned long table_size,
|
||||
acpi_tbl_entry_handler handler,
|
||||
struct acpi_table_header *table_header,
|
||||
int entry_id, unsigned int max_entries);
|
||||
int __init acpi_table_parse_entries(char *id, unsigned long table_size,
|
||||
int entry_id,
|
||||
acpi_tbl_entry_handler handler,
|
||||
|
|
@ -142,12 +147,13 @@ void acpi_numa_arch_fixup(void);
|
|||
|
||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||
/* Arch dependent functions for cpu hotplug support */
|
||||
int acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu);
|
||||
int acpi_unmap_lsapic(int cpu);
|
||||
int acpi_map_cpu(acpi_handle handle, int physid, int *pcpu);
|
||||
int acpi_unmap_cpu(int cpu);
|
||||
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
|
||||
|
||||
int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base);
|
||||
int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base);
|
||||
int acpi_ioapic_registered(acpi_handle handle, u32 gsi_base);
|
||||
void acpi_irq_stats_init(void);
|
||||
extern u32 acpi_irq_handled;
|
||||
extern u32 acpi_irq_not_handled;
|
||||
|
|
@ -423,15 +429,13 @@ extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),
|
|||
const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
|
||||
const struct device *dev);
|
||||
|
||||
static inline bool acpi_driver_match_device(struct device *dev,
|
||||
const struct device_driver *drv)
|
||||
{
|
||||
return !!acpi_match_device(drv->acpi_match_table, dev);
|
||||
}
|
||||
|
||||
extern bool acpi_driver_match_device(struct device *dev,
|
||||
const struct device_driver *drv);
|
||||
int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
|
||||
int acpi_device_modalias(struct device *, char *, int);
|
||||
void acpi_walk_dep_device_list(acpi_handle handle);
|
||||
|
||||
struct platform_device *acpi_create_platform_device(struct acpi_device *);
|
||||
#define ACPI_PTR(_ptr) (_ptr)
|
||||
|
||||
#else /* !CONFIG_ACPI */
|
||||
|
|
@ -442,6 +446,23 @@ int acpi_device_modalias(struct device *, char *, int);
|
|||
#define ACPI_COMPANION_SET(dev, adev) do { } while (0)
|
||||
#define ACPI_HANDLE(dev) (NULL)
|
||||
|
||||
struct fwnode_handle;
|
||||
|
||||
static inline bool is_acpi_node(struct fwnode_handle *fwnode)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline struct acpi_device *acpi_node(struct fwnode_handle *fwnode)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline const char *acpi_dev_name(struct acpi_device *adev)
|
||||
{
|
||||
return NULL;
|
||||
|
|
@ -552,16 +573,26 @@ static inline void arch_reserve_mem_area(acpi_physical_address addr,
|
|||
#define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ACPI) && defined(CONFIG_PM_RUNTIME)
|
||||
#if defined(CONFIG_ACPI) && defined(CONFIG_PM)
|
||||
int acpi_dev_runtime_suspend(struct device *dev);
|
||||
int acpi_dev_runtime_resume(struct device *dev);
|
||||
int acpi_subsys_runtime_suspend(struct device *dev);
|
||||
int acpi_subsys_runtime_resume(struct device *dev);
|
||||
struct acpi_device *acpi_dev_pm_get_node(struct device *dev);
|
||||
int acpi_dev_pm_attach(struct device *dev, bool power_on);
|
||||
#else
|
||||
static inline int acpi_dev_runtime_suspend(struct device *dev) { return 0; }
|
||||
static inline int acpi_dev_runtime_resume(struct device *dev) { return 0; }
|
||||
static inline int acpi_subsys_runtime_suspend(struct device *dev) { return 0; }
|
||||
static inline int acpi_subsys_runtime_resume(struct device *dev) { return 0; }
|
||||
static inline struct acpi_device *acpi_dev_pm_get_node(struct device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)
|
||||
|
|
@ -584,22 +615,6 @@ static inline int acpi_subsys_suspend(struct device *dev) { return 0; }
|
|||
static inline int acpi_subsys_freeze(struct device *dev) { return 0; }
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ACPI) && defined(CONFIG_PM)
|
||||
struct acpi_device *acpi_dev_pm_get_node(struct device *dev);
|
||||
int acpi_dev_pm_attach(struct device *dev, bool power_on);
|
||||
void acpi_dev_pm_detach(struct device *dev, bool power_off);
|
||||
#else
|
||||
static inline struct acpi_device *acpi_dev_pm_get_node(struct device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline void acpi_dev_pm_detach(struct device *dev, bool power_off) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
__printf(3, 4)
|
||||
void acpi_handle_printk(const char *level, acpi_handle handle,
|
||||
|
|
@ -660,4 +675,114 @@ do { \
|
|||
#endif
|
||||
#endif
|
||||
|
||||
struct acpi_gpio_params {
|
||||
unsigned int crs_entry_index;
|
||||
unsigned int line_index;
|
||||
bool active_low;
|
||||
};
|
||||
|
||||
struct acpi_gpio_mapping {
|
||||
const char *name;
|
||||
const struct acpi_gpio_params *data;
|
||||
unsigned int size;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB)
|
||||
int acpi_dev_add_driver_gpios(struct acpi_device *adev,
|
||||
const struct acpi_gpio_mapping *gpios);
|
||||
|
||||
static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev)
|
||||
{
|
||||
if (adev)
|
||||
adev->driver_gpios = NULL;
|
||||
}
|
||||
#else
|
||||
static inline int acpi_dev_add_driver_gpios(struct acpi_device *adev,
|
||||
const struct acpi_gpio_mapping *gpios)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev) {}
|
||||
#endif
|
||||
|
||||
/* Device properties */
|
||||
|
||||
#define MAX_ACPI_REFERENCE_ARGS 8
|
||||
struct acpi_reference_args {
|
||||
struct acpi_device *adev;
|
||||
size_t nargs;
|
||||
u64 args[MAX_ACPI_REFERENCE_ARGS];
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
int acpi_dev_get_property(struct acpi_device *adev, const char *name,
|
||||
acpi_object_type type, const union acpi_object **obj);
|
||||
int acpi_dev_get_property_array(struct acpi_device *adev, const char *name,
|
||||
acpi_object_type type,
|
||||
const union acpi_object **obj);
|
||||
int acpi_dev_get_property_reference(struct acpi_device *adev,
|
||||
const char *name, size_t index,
|
||||
struct acpi_reference_args *args);
|
||||
|
||||
int acpi_dev_prop_get(struct acpi_device *adev, const char *propname,
|
||||
void **valptr);
|
||||
int acpi_dev_prop_read_single(struct acpi_device *adev, const char *propname,
|
||||
enum dev_prop_type proptype, void *val);
|
||||
int acpi_dev_prop_read(struct acpi_device *adev, const char *propname,
|
||||
enum dev_prop_type proptype, void *val, size_t nval);
|
||||
|
||||
struct acpi_device *acpi_get_next_child(struct device *dev,
|
||||
struct acpi_device *child);
|
||||
#else
|
||||
static inline int acpi_dev_get_property(struct acpi_device *adev,
|
||||
const char *name, acpi_object_type type,
|
||||
const union acpi_object **obj)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
static inline int acpi_dev_get_property_array(struct acpi_device *adev,
|
||||
const char *name,
|
||||
acpi_object_type type,
|
||||
const union acpi_object **obj)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
static inline int acpi_dev_get_property_reference(struct acpi_device *adev,
|
||||
const char *name, const char *cells_name,
|
||||
size_t index, struct acpi_reference_args *args)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline int acpi_dev_prop_get(struct acpi_device *adev,
|
||||
const char *propname,
|
||||
void **valptr)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline int acpi_dev_prop_read_single(struct acpi_device *adev,
|
||||
const char *propname,
|
||||
enum dev_prop_type proptype,
|
||||
void *val)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline int acpi_dev_prop_read(struct acpi_device *adev,
|
||||
const char *propname,
|
||||
enum dev_prop_type proptype,
|
||||
void *val, size_t nval)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline struct acpi_device *acpi_get_next_child(struct device *dev,
|
||||
struct acpi_device *child)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /*_LINUX_ACPI_H*/
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@
|
|||
#ifndef _AER_H_
|
||||
#define _AER_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define AER_NONFATAL 0
|
||||
#define AER_FATAL 1
|
||||
#define AER_CORRECTABLE 2
|
||||
|
|
|
|||
|
|
@ -22,19 +22,6 @@ struct ata_port_info;
|
|||
struct ahci_host_priv;
|
||||
struct platform_device;
|
||||
|
||||
/*
|
||||
* Note ahci_platform_data is deprecated, it is only kept around for use
|
||||
* by the old da850 and spear13xx ahci code.
|
||||
* New drivers should instead declare their own platform_driver struct, and
|
||||
* use ahci_platform* functions in their own probe, suspend and resume methods.
|
||||
*/
|
||||
struct ahci_platform_data {
|
||||
int (*init)(struct device *dev, void __iomem *addr);
|
||||
void (*exit)(struct device *dev);
|
||||
int (*suspend)(struct device *dev);
|
||||
int (*resume)(struct device *dev);
|
||||
};
|
||||
|
||||
int ahci_platform_enable_clks(struct ahci_host_priv *hpriv);
|
||||
void ahci_platform_disable_clks(struct ahci_host_priv *hpriv);
|
||||
int ahci_platform_enable_resources(struct ahci_host_priv *hpriv);
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
#define AMBA_NR_IRQS 9
|
||||
#define AMBA_CID 0xb105f00d
|
||||
#define CORESIGHT_CID 0xb105900d
|
||||
|
||||
struct clk;
|
||||
|
||||
|
|
@ -44,10 +45,15 @@ struct amba_driver {
|
|||
const struct amba_id *id_table;
|
||||
};
|
||||
|
||||
/*
|
||||
* Constants for the designer field of the Peripheral ID register. When bit 7
|
||||
* is set to '1', bits [6:0] should be the JEP106 manufacturer identity code.
|
||||
*/
|
||||
enum amba_vendor {
|
||||
AMBA_VENDOR_ARM = 0x41,
|
||||
AMBA_VENDOR_ST = 0x80,
|
||||
AMBA_VENDOR_QCOM = 0x51,
|
||||
AMBA_VENDOR_LSI = 0xb6,
|
||||
};
|
||||
|
||||
extern struct bus_type amba_bustype;
|
||||
|
|
@ -92,6 +98,16 @@ void amba_release_regions(struct amba_device *);
|
|||
#define amba_pclk_disable(d) \
|
||||
do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0)
|
||||
|
||||
static inline int amba_pclk_prepare(struct amba_device *dev)
|
||||
{
|
||||
return clk_prepare(dev->pclk);
|
||||
}
|
||||
|
||||
static inline void amba_pclk_unprepare(struct amba_device *dev)
|
||||
{
|
||||
clk_unprepare(dev->pclk);
|
||||
}
|
||||
|
||||
/* Some drivers don't use the struct amba_device */
|
||||
#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
|
||||
#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
|
||||
|
|
|
|||
|
|
@ -8,11 +8,6 @@ struct pata_platform_info {
|
|||
* spacing used by ata_std_ports().
|
||||
*/
|
||||
unsigned int ioport_shift;
|
||||
/*
|
||||
* Indicate platform specific irq types and initial
|
||||
* IRQ flags when call request_irq()
|
||||
*/
|
||||
unsigned int irq_flags;
|
||||
};
|
||||
|
||||
extern int __pata_platform_probe(struct device *dev,
|
||||
|
|
|
|||
|
|
@ -31,8 +31,11 @@ struct ath9k_platform_data {
|
|||
u32 gpio_mask;
|
||||
u32 gpio_val;
|
||||
|
||||
bool endian_check;
|
||||
bool is_clk_25mhz;
|
||||
bool tx_gain_buffalo;
|
||||
bool disable_2ghz;
|
||||
bool disable_5ghz;
|
||||
|
||||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef __LINUX_ATMEL_MCI_H
|
||||
#define __LINUX_ATMEL_MCI_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define ATMCI_MAX_NR_SLOTS 2
|
||||
|
||||
/**
|
||||
|
|
@ -9,6 +11,7 @@
|
|||
* @detect_pin: GPIO pin wired to the card detect switch
|
||||
* @wp_pin: GPIO pin wired to the write protect sensor
|
||||
* @detect_is_active_high: The state of the detect pin when it is active
|
||||
* @non_removable: The slot is not removable, only detect once
|
||||
*
|
||||
* If a given slot is not present on the board, @bus_width should be
|
||||
* set to 0. The other fields are ignored in this case.
|
||||
|
|
@ -24,6 +27,7 @@ struct mci_slot_pdata {
|
|||
int detect_pin;
|
||||
int wp_pin;
|
||||
bool detect_is_active_high;
|
||||
bool non_removable;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -44,12 +44,13 @@ struct atmel_tcb_config {
|
|||
/**
|
||||
* struct atmel_tc - information about a Timer/Counter Block
|
||||
* @pdev: physical device
|
||||
* @iomem: resource associated with the I/O register
|
||||
* @regs: mapping through which the I/O registers can be accessed
|
||||
* @id: block id
|
||||
* @tcb_config: configuration data from SoC
|
||||
* @irq: irq for each of the three channels
|
||||
* @clk: internal clock source for each of the three channels
|
||||
* @node: list node, for tclib internal use
|
||||
* @allocated: if already used, for tclib internal use
|
||||
*
|
||||
* On some platforms, each TC channel has its own clocks and IRQs,
|
||||
* while on others, all TC channels share the same clock and IRQ.
|
||||
|
|
@ -61,15 +62,16 @@ struct atmel_tcb_config {
|
|||
*/
|
||||
struct atmel_tc {
|
||||
struct platform_device *pdev;
|
||||
struct resource *iomem;
|
||||
void __iomem *regs;
|
||||
int id;
|
||||
const struct atmel_tcb_config *tcb_config;
|
||||
int irq[3];
|
||||
struct clk *clk[3];
|
||||
struct list_head node;
|
||||
bool allocated;
|
||||
};
|
||||
|
||||
extern struct atmel_tc *atmel_tc_alloc(unsigned block, const char *name);
|
||||
extern struct atmel_tc *atmel_tc_alloc(unsigned block);
|
||||
extern void atmel_tc_free(struct atmel_tc *tc);
|
||||
|
||||
/* platform-specific ATMEL_TC_TIMER_CLOCKx divisors (0 means 32KiHz) */
|
||||
|
|
@ -258,5 +260,10 @@ extern const u8 atmel_tc_divisors[5];
|
|||
#define ATMEL_TC_LDRAS (1 << 5) /* RA loading */
|
||||
#define ATMEL_TC_LDRBS (1 << 6) /* RB loading */
|
||||
#define ATMEL_TC_ETRGS (1 << 7) /* external trigger */
|
||||
#define ATMEL_TC_ALL_IRQ (ATMEL_TC_COVFS | ATMEL_TC_LOVRS | \
|
||||
ATMEL_TC_CPAS | ATMEL_TC_CPBS | \
|
||||
ATMEL_TC_CPCS | ATMEL_TC_LDRAS | \
|
||||
ATMEL_TC_LDRBS | ATMEL_TC_ETRGS) \
|
||||
/* all IRQs */
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -3,42 +3,6 @@
|
|||
#define _LINUX_ATOMIC_H
|
||||
#include <asm/atomic.h>
|
||||
|
||||
/*
|
||||
* Provide __deprecated wrappers for the new interface, avoid flag day changes.
|
||||
* We need the ugly external functions to break header recursion hell.
|
||||
*/
|
||||
#ifndef smp_mb__before_atomic_inc
|
||||
static inline void __deprecated smp_mb__before_atomic_inc(void)
|
||||
{
|
||||
extern void __smp_mb__before_atomic(void);
|
||||
__smp_mb__before_atomic();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef smp_mb__after_atomic_inc
|
||||
static inline void __deprecated smp_mb__after_atomic_inc(void)
|
||||
{
|
||||
extern void __smp_mb__after_atomic(void);
|
||||
__smp_mb__after_atomic();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef smp_mb__before_atomic_dec
|
||||
static inline void __deprecated smp_mb__before_atomic_dec(void)
|
||||
{
|
||||
extern void __smp_mb__before_atomic(void);
|
||||
__smp_mb__before_atomic();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef smp_mb__after_atomic_dec
|
||||
static inline void __deprecated smp_mb__after_atomic_dec(void)
|
||||
{
|
||||
extern void __smp_mb__after_atomic(void);
|
||||
__smp_mb__after_atomic();
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* atomic_add_unless - add unless the number is already a given value
|
||||
* @v: pointer of type atomic_t
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ struct sk_buff;
|
|||
|
||||
struct audit_krule {
|
||||
int vers_ops;
|
||||
u32 pflags;
|
||||
u32 flags;
|
||||
u32 listnr;
|
||||
u32 action;
|
||||
|
|
@ -64,14 +65,21 @@ struct audit_krule {
|
|||
u64 prio;
|
||||
};
|
||||
|
||||
/* Flag to indicate legacy AUDIT_LOGINUID unset usage */
|
||||
#define AUDIT_LOGINUID_LEGACY 0x1
|
||||
|
||||
struct audit_field {
|
||||
u32 type;
|
||||
u32 val;
|
||||
kuid_t uid;
|
||||
kgid_t gid;
|
||||
union {
|
||||
u32 val;
|
||||
kuid_t uid;
|
||||
kgid_t gid;
|
||||
struct {
|
||||
char *lsm_str;
|
||||
void *lsm_rule;
|
||||
};
|
||||
};
|
||||
u32 op;
|
||||
char *lsm_str;
|
||||
void *lsm_rule;
|
||||
};
|
||||
|
||||
extern int is_audit_feature_set(int which);
|
||||
|
|
@ -86,7 +94,7 @@ extern unsigned compat_dir_class[];
|
|||
extern unsigned compat_chattr_class[];
|
||||
extern unsigned compat_signal_class[];
|
||||
|
||||
extern int __weak audit_classify_compat_syscall(int abi, unsigned syscall);
|
||||
extern int audit_classify_compat_syscall(int abi, unsigned syscall);
|
||||
|
||||
/* audit_names->type values */
|
||||
#define AUDIT_TYPE_UNKNOWN 0 /* we don't know yet */
|
||||
|
|
@ -109,12 +117,13 @@ extern void audit_log_session_info(struct audit_buffer *ab);
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_AUDITSYSCALL
|
||||
#include <asm/syscall.h> /* for syscall_get_arch() */
|
||||
|
||||
/* These are defined in auditsc.c */
|
||||
/* Public API */
|
||||
extern int audit_alloc(struct task_struct *task);
|
||||
extern void __audit_free(struct task_struct *task);
|
||||
extern void __audit_syscall_entry(int arch,
|
||||
int major, unsigned long a0, unsigned long a1,
|
||||
extern void __audit_syscall_entry(int major, unsigned long a0, unsigned long a1,
|
||||
unsigned long a2, unsigned long a3);
|
||||
extern void __audit_syscall_exit(int ret_success, long ret_value);
|
||||
extern struct filename *__audit_reusename(const __user char *uptr);
|
||||
|
|
@ -125,6 +134,7 @@ extern void audit_putname(struct filename *name);
|
|||
#define AUDIT_INODE_HIDDEN 2 /* audit record should be hidden */
|
||||
extern void __audit_inode(struct filename *name, const struct dentry *dentry,
|
||||
unsigned int flags);
|
||||
extern void __audit_file(const struct file *);
|
||||
extern void __audit_inode_child(const struct inode *parent,
|
||||
const struct dentry *dentry,
|
||||
const unsigned char type);
|
||||
|
|
@ -141,12 +151,12 @@ static inline void audit_free(struct task_struct *task)
|
|||
if (unlikely(task->audit_context))
|
||||
__audit_free(task);
|
||||
}
|
||||
static inline void audit_syscall_entry(int arch, int major, unsigned long a0,
|
||||
static inline void audit_syscall_entry(int major, unsigned long a0,
|
||||
unsigned long a1, unsigned long a2,
|
||||
unsigned long a3)
|
||||
{
|
||||
if (unlikely(current->audit_context))
|
||||
__audit_syscall_entry(arch, major, a0, a1, a2, a3);
|
||||
__audit_syscall_entry(major, a0, a1, a2, a3);
|
||||
}
|
||||
static inline void audit_syscall_exit(void *pt_regs)
|
||||
{
|
||||
|
|
@ -178,6 +188,11 @@ static inline void audit_inode(struct filename *name,
|
|||
__audit_inode(name, dentry, flags);
|
||||
}
|
||||
}
|
||||
static inline void audit_file(struct file *file)
|
||||
{
|
||||
if (unlikely(!audit_dummy_context()))
|
||||
__audit_file(file);
|
||||
}
|
||||
static inline void audit_inode_parent_hidden(struct filename *name,
|
||||
const struct dentry *dentry)
|
||||
{
|
||||
|
|
@ -322,7 +337,7 @@ static inline int audit_alloc(struct task_struct *task)
|
|||
}
|
||||
static inline void audit_free(struct task_struct *task)
|
||||
{ }
|
||||
static inline void audit_syscall_entry(int arch, int major, unsigned long a0,
|
||||
static inline void audit_syscall_entry(int major, unsigned long a0,
|
||||
unsigned long a1, unsigned long a2,
|
||||
unsigned long a3)
|
||||
{ }
|
||||
|
|
@ -352,6 +367,9 @@ static inline void audit_inode(struct filename *name,
|
|||
const struct dentry *dentry,
|
||||
unsigned int parent)
|
||||
{ }
|
||||
static inline void audit_file(struct file *file)
|
||||
{
|
||||
}
|
||||
static inline void audit_inode_parent_hidden(struct filename *name,
|
||||
const struct dentry *dentry)
|
||||
{ }
|
||||
|
|
|
|||
|
|
@ -28,12 +28,10 @@ struct dentry;
|
|||
* Bits in backing_dev_info.state
|
||||
*/
|
||||
enum bdi_state {
|
||||
BDI_wb_alloc, /* Default embedded wb allocated */
|
||||
BDI_async_congested, /* The async (write) queue is getting full */
|
||||
BDI_sync_congested, /* The sync queue is getting full */
|
||||
BDI_registered, /* bdi_register() was done */
|
||||
BDI_writeback_running, /* Writeback is in progress */
|
||||
BDI_unused, /* Available bits start here */
|
||||
};
|
||||
|
||||
typedef int (congested_fn)(void *, int);
|
||||
|
|
@ -50,7 +48,6 @@ enum bdi_stat_item {
|
|||
|
||||
struct bdi_writeback {
|
||||
struct backing_dev_info *bdi; /* our parent bdi */
|
||||
unsigned int nr;
|
||||
|
||||
unsigned long last_old_flush; /* last old data flush */
|
||||
|
||||
|
|
@ -124,7 +121,6 @@ void bdi_start_background_writeback(struct backing_dev_info *bdi);
|
|||
void bdi_writeback_workfn(struct work_struct *work);
|
||||
int bdi_has_dirty_io(struct backing_dev_info *bdi);
|
||||
void bdi_wakeup_thread_delayed(struct backing_dev_info *bdi);
|
||||
void bdi_lock_two(struct bdi_writeback *wb1, struct bdi_writeback *wb2);
|
||||
|
||||
extern spinlock_t bdi_lock;
|
||||
extern struct list_head bdi_list;
|
||||
|
|
|
|||
|
|
@ -27,10 +27,13 @@
|
|||
* counter raised only while it is under our special handling;
|
||||
*
|
||||
* iii. after the lockless scan step have selected a potential balloon page for
|
||||
* isolation, re-test the page->mapping flags and the page ref counter
|
||||
* isolation, re-test the PageBalloon mark and the PagePrivate flag
|
||||
* under the proper page lock, to ensure isolating a valid balloon page
|
||||
* (not yet isolated, nor under release procedure)
|
||||
*
|
||||
* iv. isolation or dequeueing procedure must clear PagePrivate flag under
|
||||
* page lock together with removing page from balloon device page list.
|
||||
*
|
||||
* The functions provided by this interface are placed to help on coping with
|
||||
* the aforementioned balloon page corner case, as well as to ensure the simple
|
||||
* set of exposed rules are satisfied while we are dealing with balloon pages
|
||||
|
|
@ -54,43 +57,22 @@
|
|||
* balloon driver as a page book-keeper for its registered balloon devices.
|
||||
*/
|
||||
struct balloon_dev_info {
|
||||
void *balloon_device; /* balloon device descriptor */
|
||||
struct address_space *mapping; /* balloon special page->mapping */
|
||||
unsigned long isolated_pages; /* # of isolated pages for migration */
|
||||
spinlock_t pages_lock; /* Protection to pages list */
|
||||
struct list_head pages; /* Pages enqueued & handled to Host */
|
||||
int (*migratepage)(struct balloon_dev_info *, struct page *newpage,
|
||||
struct page *page, enum migrate_mode mode);
|
||||
};
|
||||
|
||||
extern struct page *balloon_page_enqueue(struct balloon_dev_info *b_dev_info);
|
||||
extern struct page *balloon_page_dequeue(struct balloon_dev_info *b_dev_info);
|
||||
extern struct balloon_dev_info *balloon_devinfo_alloc(
|
||||
void *balloon_dev_descriptor);
|
||||
|
||||
static inline void balloon_devinfo_free(struct balloon_dev_info *b_dev_info)
|
||||
static inline void balloon_devinfo_init(struct balloon_dev_info *balloon)
|
||||
{
|
||||
kfree(b_dev_info);
|
||||
}
|
||||
|
||||
/*
|
||||
* balloon_page_free - release a balloon page back to the page free lists
|
||||
* @page: ballooned page to be set free
|
||||
*
|
||||
* This function must be used to properly set free an isolated/dequeued balloon
|
||||
* page at the end of a sucessful page migration, or at the balloon driver's
|
||||
* page release procedure.
|
||||
*/
|
||||
static inline void balloon_page_free(struct page *page)
|
||||
{
|
||||
/*
|
||||
* Balloon pages always get an extra refcount before being isolated
|
||||
* and before being dequeued to help on sorting out fortuite colisions
|
||||
* between a thread attempting to isolate and another thread attempting
|
||||
* to release the very same balloon page.
|
||||
*
|
||||
* Before we handle the page back to Buddy, lets drop its extra refcnt.
|
||||
*/
|
||||
put_page(page);
|
||||
__free_page(page);
|
||||
balloon->isolated_pages = 0;
|
||||
spin_lock_init(&balloon->pages_lock);
|
||||
INIT_LIST_HEAD(&balloon->pages);
|
||||
balloon->migratepage = NULL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BALLOON_COMPACTION
|
||||
|
|
@ -98,107 +80,58 @@ extern bool balloon_page_isolate(struct page *page);
|
|||
extern void balloon_page_putback(struct page *page);
|
||||
extern int balloon_page_migrate(struct page *newpage,
|
||||
struct page *page, enum migrate_mode mode);
|
||||
extern struct address_space
|
||||
*balloon_mapping_alloc(struct balloon_dev_info *b_dev_info,
|
||||
const struct address_space_operations *a_ops);
|
||||
|
||||
static inline void balloon_mapping_free(struct address_space *balloon_mapping)
|
||||
{
|
||||
kfree(balloon_mapping);
|
||||
}
|
||||
|
||||
/*
|
||||
* page_flags_cleared - helper to perform balloon @page ->flags tests.
|
||||
*
|
||||
* As balloon pages are obtained from buddy and we do not play with page->flags
|
||||
* at driver level (exception made when we get the page lock for compaction),
|
||||
* we can safely identify a ballooned page by checking if the
|
||||
* PAGE_FLAGS_CHECK_AT_PREP page->flags are all cleared. This approach also
|
||||
* helps us skip ballooned pages that are locked for compaction or release, thus
|
||||
* mitigating their racy check at balloon_page_movable()
|
||||
*/
|
||||
static inline bool page_flags_cleared(struct page *page)
|
||||
{
|
||||
return !(page->flags & PAGE_FLAGS_CHECK_AT_PREP);
|
||||
}
|
||||
|
||||
/*
|
||||
* __is_movable_balloon_page - helper to perform @page mapping->flags tests
|
||||
* __is_movable_balloon_page - helper to perform @page PageBalloon tests
|
||||
*/
|
||||
static inline bool __is_movable_balloon_page(struct page *page)
|
||||
{
|
||||
struct address_space *mapping = page->mapping;
|
||||
return mapping_balloon(mapping);
|
||||
return PageBalloon(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* balloon_page_movable - test page->mapping->flags to identify balloon pages
|
||||
* that can be moved by compaction/migration.
|
||||
*
|
||||
* This function is used at core compaction's page isolation scheme, therefore
|
||||
* most pages exposed to it are not enlisted as balloon pages and so, to avoid
|
||||
* undesired side effects like racing against __free_pages(), we cannot afford
|
||||
* holding the page locked while testing page->mapping->flags here.
|
||||
* balloon_page_movable - test PageBalloon to identify balloon pages
|
||||
* and PagePrivate to check that the page is not
|
||||
* isolated and can be moved by compaction/migration.
|
||||
*
|
||||
* As we might return false positives in the case of a balloon page being just
|
||||
* released under us, the page->mapping->flags need to be re-tested later,
|
||||
* under the proper page lock, at the functions that will be coping with the
|
||||
* balloon page case.
|
||||
* released under us, this need to be re-tested later, under the page lock.
|
||||
*/
|
||||
static inline bool balloon_page_movable(struct page *page)
|
||||
{
|
||||
/*
|
||||
* Before dereferencing and testing mapping->flags, let's make sure
|
||||
* this is not a page that uses ->mapping in a different way
|
||||
*/
|
||||
if (page_flags_cleared(page) && !page_mapped(page) &&
|
||||
page_count(page) == 1)
|
||||
return __is_movable_balloon_page(page);
|
||||
|
||||
return false;
|
||||
return PageBalloon(page) && PagePrivate(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* isolated_balloon_page - identify an isolated balloon page on private
|
||||
* compaction/migration page lists.
|
||||
*
|
||||
* After a compaction thread isolates a balloon page for migration, it raises
|
||||
* the page refcount to prevent concurrent compaction threads from re-isolating
|
||||
* the same page. For that reason putback_movable_pages(), or other routines
|
||||
* that need to identify isolated balloon pages on private pagelists, cannot
|
||||
* rely on balloon_page_movable() to accomplish the task.
|
||||
*/
|
||||
static inline bool isolated_balloon_page(struct page *page)
|
||||
{
|
||||
/* Already isolated balloon pages, by default, have a raised refcount */
|
||||
if (page_flags_cleared(page) && !page_mapped(page) &&
|
||||
page_count(page) >= 2)
|
||||
return __is_movable_balloon_page(page);
|
||||
|
||||
return false;
|
||||
return PageBalloon(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* balloon_page_insert - insert a page into the balloon's page list and make
|
||||
* the page->mapping assignment accordingly.
|
||||
* the page->private assignment accordingly.
|
||||
* @balloon : pointer to balloon device
|
||||
* @page : page to be assigned as a 'balloon page'
|
||||
* @mapping : allocated special 'balloon_mapping'
|
||||
* @head : balloon's device page list head
|
||||
*
|
||||
* Caller must ensure the page is locked and the spin_lock protecting balloon
|
||||
* pages list is held before inserting a page into the balloon device.
|
||||
*/
|
||||
static inline void balloon_page_insert(struct page *page,
|
||||
struct address_space *mapping,
|
||||
struct list_head *head)
|
||||
static inline void balloon_page_insert(struct balloon_dev_info *balloon,
|
||||
struct page *page)
|
||||
{
|
||||
page->mapping = mapping;
|
||||
list_add(&page->lru, head);
|
||||
__SetPageBalloon(page);
|
||||
SetPagePrivate(page);
|
||||
set_page_private(page, (unsigned long)balloon);
|
||||
list_add(&page->lru, &balloon->pages);
|
||||
}
|
||||
|
||||
/*
|
||||
* balloon_page_delete - delete a page from balloon's page list and clear
|
||||
* the page->mapping assignement accordingly.
|
||||
* the page->private assignement accordingly.
|
||||
* @page : page to be released from balloon's page list
|
||||
*
|
||||
* Caller must ensure the page is locked and the spin_lock protecting balloon
|
||||
|
|
@ -206,8 +139,12 @@ static inline void balloon_page_insert(struct page *page,
|
|||
*/
|
||||
static inline void balloon_page_delete(struct page *page)
|
||||
{
|
||||
page->mapping = NULL;
|
||||
list_del(&page->lru);
|
||||
__ClearPageBalloon(page);
|
||||
set_page_private(page, 0);
|
||||
if (PagePrivate(page)) {
|
||||
ClearPagePrivate(page);
|
||||
list_del(&page->lru);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -216,11 +153,7 @@ static inline void balloon_page_delete(struct page *page)
|
|||
*/
|
||||
static inline struct balloon_dev_info *balloon_page_device(struct page *page)
|
||||
{
|
||||
struct address_space *mapping = page->mapping;
|
||||
if (likely(mapping))
|
||||
return mapping->private_data;
|
||||
|
||||
return NULL;
|
||||
return (struct balloon_dev_info *)page_private(page);
|
||||
}
|
||||
|
||||
static inline gfp_t balloon_mapping_gfp_mask(void)
|
||||
|
|
@ -228,36 +161,26 @@ static inline gfp_t balloon_mapping_gfp_mask(void)
|
|||
return GFP_HIGHUSER_MOVABLE;
|
||||
}
|
||||
|
||||
static inline bool balloon_compaction_check(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_BALLOON_COMPACTION */
|
||||
|
||||
static inline void *balloon_mapping_alloc(void *balloon_device,
|
||||
const struct address_space_operations *a_ops)
|
||||
static inline void balloon_page_insert(struct balloon_dev_info *balloon,
|
||||
struct page *page)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
static inline void balloon_mapping_free(struct address_space *balloon_mapping)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void balloon_page_insert(struct page *page,
|
||||
struct address_space *mapping,
|
||||
struct list_head *head)
|
||||
{
|
||||
list_add(&page->lru, head);
|
||||
__SetPageBalloon(page);
|
||||
list_add(&page->lru, &balloon->pages);
|
||||
}
|
||||
|
||||
static inline void balloon_page_delete(struct page *page)
|
||||
{
|
||||
__ClearPageBalloon(page);
|
||||
list_del(&page->lru);
|
||||
}
|
||||
|
||||
static inline bool __is_movable_balloon_page(struct page *page)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool balloon_page_movable(struct page *page)
|
||||
{
|
||||
return false;
|
||||
|
|
@ -289,9 +212,5 @@ static inline gfp_t balloon_mapping_gfp_mask(void)
|
|||
return GFP_HIGHUSER;
|
||||
}
|
||||
|
||||
static inline bool balloon_compaction_check(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_BALLOON_COMPACTION */
|
||||
#endif /* _LINUX_BALLOON_COMPACTION_H */
|
||||
|
|
|
|||
|
|
@ -267,7 +267,7 @@ struct bcma_device {
|
|||
u8 core_unit;
|
||||
|
||||
u32 addr;
|
||||
u32 addr1;
|
||||
u32 addr_s[8];
|
||||
u32 wrap;
|
||||
|
||||
void __iomem *io_addr;
|
||||
|
|
@ -323,6 +323,8 @@ struct bcma_bus {
|
|||
struct pci_dev *host_pci;
|
||||
/* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */
|
||||
struct sdio_func *host_sdio;
|
||||
/* Pointer to platform device (only for BCMA_HOSTTYPE_SOC) */
|
||||
struct platform_device *host_pdev;
|
||||
};
|
||||
|
||||
struct bcma_chipinfo chipinfo;
|
||||
|
|
@ -332,10 +334,10 @@ struct bcma_bus {
|
|||
struct bcma_device *mapped_core;
|
||||
struct list_head cores;
|
||||
u8 nr_cores;
|
||||
u8 init_done:1;
|
||||
u8 num;
|
||||
|
||||
struct bcma_drv_cc drv_cc;
|
||||
struct bcma_drv_cc_b drv_cc_b;
|
||||
struct bcma_drv_pci drv_pci[2];
|
||||
struct bcma_drv_pcie2 drv_pcie2;
|
||||
struct bcma_drv_mips drv_mips;
|
||||
|
|
@ -445,4 +447,6 @@ extern u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset);
|
|||
#define BCMA_DMA_TRANSLATION_DMA64_CMT 0x80000000 /* Client Mode Translation for 64-bit DMA */
|
||||
extern u32 bcma_core_dma_translation(struct bcma_device *core);
|
||||
|
||||
extern unsigned int bcma_core_irq(struct bcma_device *core, int num);
|
||||
|
||||
#endif /* LINUX_BCMA_H_ */
|
||||
|
|
|
|||
|
|
@ -644,6 +644,12 @@ struct bcma_drv_cc {
|
|||
#endif
|
||||
};
|
||||
|
||||
struct bcma_drv_cc_b {
|
||||
struct bcma_device *core;
|
||||
u8 setup_done:1;
|
||||
void __iomem *mii;
|
||||
};
|
||||
|
||||
/* Register access */
|
||||
#define bcma_cc_read32(cc, offset) \
|
||||
bcma_read32((cc)->core, offset)
|
||||
|
|
@ -699,4 +705,6 @@ extern void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid);
|
|||
|
||||
extern u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc);
|
||||
|
||||
void bcma_chipco_b_mii_write(struct bcma_drv_cc_b *ccb, u32 offset, u32 value);
|
||||
|
||||
#endif /* LINUX_BCMA_DRIVER_CC_H_ */
|
||||
|
|
|
|||
|
|
@ -43,12 +43,12 @@ struct bcma_drv_mips {
|
|||
extern void bcma_core_mips_init(struct bcma_drv_mips *mcore);
|
||||
extern void bcma_core_mips_early_init(struct bcma_drv_mips *mcore);
|
||||
|
||||
extern unsigned int bcma_core_irq(struct bcma_device *core);
|
||||
extern unsigned int bcma_core_mips_irq(struct bcma_device *dev);
|
||||
#else
|
||||
static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { }
|
||||
static inline void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) { }
|
||||
|
||||
static inline unsigned int bcma_core_irq(struct bcma_device *core)
|
||||
static inline unsigned int bcma_core_mips_irq(struct bcma_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,11 @@
|
|||
#define BCMA_RESET_CTL_RESET 0x0001
|
||||
#define BCMA_RESET_ST 0x0804
|
||||
|
||||
#define BCMA_NS_ROM_IOST_BOOT_DEV_MASK 0x0003
|
||||
#define BCMA_NS_ROM_IOST_BOOT_DEV_NOR 0x0000
|
||||
#define BCMA_NS_ROM_IOST_BOOT_DEV_NAND 0x0001
|
||||
#define BCMA_NS_ROM_IOST_BOOT_DEV_ROM 0x0002
|
||||
|
||||
/* BCMA PCI config space registers. */
|
||||
#define BCMA_PCI_PMCSR 0x44
|
||||
#define BCMA_PCI_PE 0x100
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ struct bcma_soc {
|
|||
};
|
||||
|
||||
int __init bcma_host_soc_register(struct bcma_soc *soc);
|
||||
int __init bcma_host_soc_init(struct bcma_soc *soc);
|
||||
|
||||
int bcma_bus_register(struct bcma_bus *bus);
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,10 @@ struct linux_binprm {
|
|||
#define BINPRM_FLAGS_EXECFD_BIT 1
|
||||
#define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
|
||||
|
||||
/* filename of the binary will be inaccessible after exec */
|
||||
#define BINPRM_FLAGS_PATH_INACCESSIBLE_BIT 2
|
||||
#define BINPRM_FLAGS_PATH_INACCESSIBLE (1 << BINPRM_FLAGS_PATH_INACCESSIBLE_BIT)
|
||||
|
||||
/* Function parameter for binfmt->coredump */
|
||||
struct coredump_params {
|
||||
const siginfo_t *siginfo;
|
||||
|
|
|
|||
|
|
@ -292,7 +292,24 @@ static inline unsigned bio_segments(struct bio *bio)
|
|||
*/
|
||||
#define bio_get(bio) atomic_inc(&(bio)->bi_cnt)
|
||||
|
||||
enum bip_flags {
|
||||
BIP_BLOCK_INTEGRITY = 1 << 0, /* block layer owns integrity data */
|
||||
BIP_MAPPED_INTEGRITY = 1 << 1, /* ref tag has been remapped */
|
||||
BIP_CTRL_NOCHECK = 1 << 2, /* disable HBA integrity checking */
|
||||
BIP_DISK_NOCHECK = 1 << 3, /* disable disk integrity checking */
|
||||
BIP_IP_CHECKSUM = 1 << 4, /* IP checksum */
|
||||
};
|
||||
|
||||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
|
||||
static inline struct bio_integrity_payload *bio_integrity(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_rw & REQ_INTEGRITY)
|
||||
return bio->bi_integrity;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* bio integrity payload
|
||||
*/
|
||||
|
|
@ -301,21 +318,40 @@ struct bio_integrity_payload {
|
|||
|
||||
struct bvec_iter bip_iter;
|
||||
|
||||
/* kill - should just use bip_vec */
|
||||
void *bip_buf; /* generated integrity data */
|
||||
|
||||
bio_end_io_t *bip_end_io; /* saved I/O completion fn */
|
||||
|
||||
unsigned short bip_slab; /* slab the bip came from */
|
||||
unsigned short bip_vcnt; /* # of integrity bio_vecs */
|
||||
unsigned short bip_max_vcnt; /* integrity bio_vec slots */
|
||||
unsigned bip_owns_buf:1; /* should free bip_buf */
|
||||
unsigned short bip_flags; /* control flags */
|
||||
|
||||
struct work_struct bip_work; /* I/O completion */
|
||||
|
||||
struct bio_vec *bip_vec;
|
||||
struct bio_vec bip_inline_vecs[0];/* embedded bvec array */
|
||||
};
|
||||
|
||||
static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag)
|
||||
{
|
||||
struct bio_integrity_payload *bip = bio_integrity(bio);
|
||||
|
||||
if (bip)
|
||||
return bip->bip_flags & flag;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline sector_t bip_get_seed(struct bio_integrity_payload *bip)
|
||||
{
|
||||
return bip->bip_iter.bi_sector;
|
||||
}
|
||||
|
||||
static inline void bip_set_seed(struct bio_integrity_payload *bip,
|
||||
sector_t seed)
|
||||
{
|
||||
bip->bip_iter.bi_sector = seed;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BLK_DEV_INTEGRITY */
|
||||
|
||||
extern void bio_trim(struct bio *bio, int offset, int size);
|
||||
|
|
@ -342,6 +378,7 @@ static inline struct bio *bio_next_split(struct bio *bio, int sectors,
|
|||
}
|
||||
|
||||
extern struct bio_set *bioset_create(unsigned int, unsigned int);
|
||||
extern struct bio_set *bioset_create_nobvec(unsigned int, unsigned int);
|
||||
extern void bioset_free(struct bio_set *);
|
||||
extern mempool_t *biovec_create_pool(int pool_entries);
|
||||
|
||||
|
|
@ -353,7 +390,6 @@ extern struct bio *bio_clone_fast(struct bio *, gfp_t, struct bio_set *);
|
|||
extern struct bio *bio_clone_bioset(struct bio *, gfp_t, struct bio_set *bs);
|
||||
|
||||
extern struct bio_set *fs_bio_set;
|
||||
unsigned int bio_integrity_tag_size(struct bio *bio);
|
||||
|
||||
static inline struct bio *bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
|
||||
{
|
||||
|
|
@ -407,6 +443,11 @@ extern struct bio *bio_copy_kern(struct request_queue *, void *, unsigned int,
|
|||
extern void bio_set_pages_dirty(struct bio *bio);
|
||||
extern void bio_check_pages_dirty(struct bio *bio);
|
||||
|
||||
void generic_start_io_acct(int rw, unsigned long sectors,
|
||||
struct hd_struct *part);
|
||||
void generic_end_io_acct(int rw, struct hd_struct *part,
|
||||
unsigned long start_time);
|
||||
|
||||
#ifndef ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
|
||||
# error "You should define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE for your platform"
|
||||
#endif
|
||||
|
|
@ -661,14 +702,10 @@ struct biovec_slab {
|
|||
for_each_bio(_bio) \
|
||||
bip_for_each_vec(_bvl, _bio->bi_integrity, _iter)
|
||||
|
||||
#define bio_integrity(bio) (bio->bi_integrity != NULL)
|
||||
|
||||
extern struct bio_integrity_payload *bio_integrity_alloc(struct bio *, gfp_t, unsigned int);
|
||||
extern void bio_integrity_free(struct bio *);
|
||||
extern int bio_integrity_add_page(struct bio *, struct page *, unsigned int, unsigned int);
|
||||
extern int bio_integrity_enabled(struct bio *bio);
|
||||
extern int bio_integrity_set_tag(struct bio *, void *, unsigned int);
|
||||
extern int bio_integrity_get_tag(struct bio *, void *, unsigned int);
|
||||
extern bool bio_integrity_enabled(struct bio *bio);
|
||||
extern int bio_integrity_prep(struct bio *);
|
||||
extern void bio_integrity_endio(struct bio *, int);
|
||||
extern void bio_integrity_advance(struct bio *, unsigned int);
|
||||
|
|
@ -680,14 +717,14 @@ extern void bio_integrity_init(void);
|
|||
|
||||
#else /* CONFIG_BLK_DEV_INTEGRITY */
|
||||
|
||||
static inline int bio_integrity(struct bio *bio)
|
||||
static inline void *bio_integrity(struct bio *bio)
|
||||
{
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int bio_integrity_enabled(struct bio *bio)
|
||||
static inline bool bio_integrity_enabled(struct bio *bio)
|
||||
{
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int bioset_integrity_create(struct bio_set *bs, int pool_size)
|
||||
|
|
@ -733,6 +770,11 @@ static inline void bio_integrity_init(void)
|
|||
return;
|
||||
}
|
||||
|
||||
static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BLK_DEV_INTEGRITY */
|
||||
|
||||
#endif /* CONFIG_BLOCK */
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
* bitmap_set(dst, pos, nbits) Set specified bit area
|
||||
* bitmap_clear(dst, pos, nbits) Clear specified bit area
|
||||
* bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
|
||||
* bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
|
||||
* bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
|
||||
* bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
|
||||
* bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
|
||||
|
|
@ -60,6 +61,7 @@
|
|||
* bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region
|
||||
* bitmap_release_region(bitmap, pos, order) Free specified bit region
|
||||
* bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region
|
||||
* bitmap_print_to_pagebuf(list, buf, mask, nbits) Print bitmap src as list/hex
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
@ -114,11 +116,36 @@ extern int __bitmap_weight(const unsigned long *bitmap, unsigned int nbits);
|
|||
|
||||
extern void bitmap_set(unsigned long *map, unsigned int start, int len);
|
||||
extern void bitmap_clear(unsigned long *map, unsigned int start, int len);
|
||||
extern unsigned long bitmap_find_next_zero_area(unsigned long *map,
|
||||
unsigned long size,
|
||||
unsigned long start,
|
||||
unsigned int nr,
|
||||
unsigned long align_mask);
|
||||
|
||||
extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
|
||||
unsigned long size,
|
||||
unsigned long start,
|
||||
unsigned int nr,
|
||||
unsigned long align_mask,
|
||||
unsigned long align_offset);
|
||||
|
||||
/**
|
||||
* bitmap_find_next_zero_area - find a contiguous aligned zero area
|
||||
* @map: The address to base the search on
|
||||
* @size: The bitmap size in bits
|
||||
* @start: The bitnumber to start searching at
|
||||
* @nr: The number of zeroed bits we're looking for
|
||||
* @align_mask: Alignment mask for zero area
|
||||
*
|
||||
* The @align_mask should be one less than a power of 2; the effect is that
|
||||
* the bit offset of all zero areas this function finds is multiples of that
|
||||
* power of 2. A @align_mask of 0 means no alignment is required.
|
||||
*/
|
||||
static inline unsigned long
|
||||
bitmap_find_next_zero_area(unsigned long *map,
|
||||
unsigned long size,
|
||||
unsigned long start,
|
||||
unsigned int nr,
|
||||
unsigned long align_mask)
|
||||
{
|
||||
return bitmap_find_next_zero_area_off(map, size, start, nr,
|
||||
align_mask, 0);
|
||||
}
|
||||
|
||||
extern int bitmap_scnprintf(char *buf, unsigned int len,
|
||||
const unsigned long *src, int nbits);
|
||||
|
|
@ -145,6 +172,8 @@ extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int o
|
|||
extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
|
||||
extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits);
|
||||
extern int bitmap_ord_to_pos(const unsigned long *bitmap, int n, int bits);
|
||||
extern int bitmap_print_to_pagebuf(bool list, char *buf,
|
||||
const unsigned long *maskp, int nmaskbits);
|
||||
|
||||
#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG))
|
||||
#define BITMAP_LAST_WORD_MASK(nbits) \
|
||||
|
|
|
|||
|
|
@ -18,8 +18,11 @@
|
|||
* position @h. For example
|
||||
* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
|
||||
*/
|
||||
#define GENMASK(h, l) (((U32_C(1) << ((h) - (l) + 1)) - 1) << (l))
|
||||
#define GENMASK_ULL(h, l) (((U64_C(1) << ((h) - (l) + 1)) - 1) << (l))
|
||||
#define GENMASK(h, l) \
|
||||
(((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
|
||||
|
||||
#define GENMASK_ULL(h, l) \
|
||||
(((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h))))
|
||||
|
||||
extern unsigned int __sw_hweight8(unsigned int w);
|
||||
extern unsigned int __sw_hweight16(unsigned int w);
|
||||
|
|
@ -32,26 +35,6 @@ extern unsigned long __sw_hweight64(__u64 w);
|
|||
*/
|
||||
#include <asm/bitops.h>
|
||||
|
||||
/*
|
||||
* Provide __deprecated wrappers for the new interface, avoid flag day changes.
|
||||
* We need the ugly external functions to break header recursion hell.
|
||||
*/
|
||||
#ifndef smp_mb__before_clear_bit
|
||||
static inline void __deprecated smp_mb__before_clear_bit(void)
|
||||
{
|
||||
extern void __smp_mb__before_atomic(void);
|
||||
__smp_mb__before_atomic();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef smp_mb__after_clear_bit
|
||||
static inline void __deprecated smp_mb__after_clear_bit(void)
|
||||
{
|
||||
extern void __smp_mb__after_atomic(void);
|
||||
__smp_mb__after_atomic();
|
||||
}
|
||||
#endif
|
||||
|
||||
#define for_each_set_bit(bit, addr, size) \
|
||||
for ((bit) = find_first_bit((addr), (size)); \
|
||||
(bit) < (size); \
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/blkdev.h>
|
||||
|
||||
struct blk_mq_tags;
|
||||
struct blk_flush_queue;
|
||||
|
||||
struct blk_mq_cpu_notifier {
|
||||
struct list_head list;
|
||||
|
|
@ -34,6 +35,7 @@ struct blk_mq_hw_ctx {
|
|||
|
||||
struct request_queue *queue;
|
||||
unsigned int queue_num;
|
||||
struct blk_flush_queue *fq;
|
||||
|
||||
void *driver_data;
|
||||
|
||||
|
|
@ -77,8 +79,15 @@ struct blk_mq_tag_set {
|
|||
struct list_head tag_list;
|
||||
};
|
||||
|
||||
typedef int (queue_rq_fn)(struct blk_mq_hw_ctx *, struct request *);
|
||||
struct blk_mq_queue_data {
|
||||
struct request *rq;
|
||||
struct list_head *list;
|
||||
bool last;
|
||||
};
|
||||
|
||||
typedef int (queue_rq_fn)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *);
|
||||
typedef struct blk_mq_hw_ctx *(map_queue_fn)(struct request_queue *, const int);
|
||||
typedef enum blk_eh_timer_return (timeout_fn)(struct request *, bool);
|
||||
typedef int (init_hctx_fn)(struct blk_mq_hw_ctx *, void *, unsigned int);
|
||||
typedef void (exit_hctx_fn)(struct blk_mq_hw_ctx *, unsigned int);
|
||||
typedef int (init_request_fn)(void *, struct request *, unsigned int,
|
||||
|
|
@ -86,6 +95,9 @@ typedef int (init_request_fn)(void *, struct request *, unsigned int,
|
|||
typedef void (exit_request_fn)(void *, struct request *, unsigned int,
|
||||
unsigned int);
|
||||
|
||||
typedef void (busy_iter_fn)(struct blk_mq_hw_ctx *, struct request *, void *,
|
||||
bool);
|
||||
|
||||
struct blk_mq_ops {
|
||||
/*
|
||||
* Queue request
|
||||
|
|
@ -100,7 +112,7 @@ struct blk_mq_ops {
|
|||
/*
|
||||
* Called on request timeout
|
||||
*/
|
||||
rq_timed_out_fn *timeout;
|
||||
timeout_fn *timeout;
|
||||
|
||||
softirq_done_fn *complete;
|
||||
|
||||
|
|
@ -115,6 +127,10 @@ struct blk_mq_ops {
|
|||
/*
|
||||
* Called for every command allocated by the block layer to allow
|
||||
* the driver to set up driver specific data.
|
||||
*
|
||||
* Tag greater than or equal to queue_depth is for setting up
|
||||
* flush request.
|
||||
*
|
||||
* Ditto for exit/teardown.
|
||||
*/
|
||||
init_request_fn *init_request;
|
||||
|
|
@ -130,6 +146,7 @@ enum {
|
|||
BLK_MQ_F_TAG_SHARED = 1 << 1,
|
||||
BLK_MQ_F_SG_MERGE = 1 << 2,
|
||||
BLK_MQ_F_SYSFS_UP = 1 << 3,
|
||||
BLK_MQ_F_DEFER_ISSUE = 1 << 4,
|
||||
|
||||
BLK_MQ_S_STOPPED = 0,
|
||||
BLK_MQ_S_TAG_ACTIVE = 1,
|
||||
|
|
@ -140,6 +157,7 @@ enum {
|
|||
};
|
||||
|
||||
struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
|
||||
void blk_mq_finish_init(struct request_queue *q);
|
||||
int blk_mq_register_disk(struct gendisk *);
|
||||
void blk_mq_unregister_disk(struct gendisk *);
|
||||
|
||||
|
|
@ -151,16 +169,35 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule);
|
|||
void blk_mq_insert_request(struct request *, bool, bool, bool);
|
||||
void blk_mq_run_queues(struct request_queue *q, bool async);
|
||||
void blk_mq_free_request(struct request *rq);
|
||||
void blk_mq_free_hctx_request(struct blk_mq_hw_ctx *, struct request *rq);
|
||||
bool blk_mq_can_queue(struct blk_mq_hw_ctx *);
|
||||
struct request *blk_mq_alloc_request(struct request_queue *q, int rw,
|
||||
gfp_t gfp, bool reserved);
|
||||
struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag);
|
||||
|
||||
enum {
|
||||
BLK_MQ_UNIQUE_TAG_BITS = 16,
|
||||
BLK_MQ_UNIQUE_TAG_MASK = (1 << BLK_MQ_UNIQUE_TAG_BITS) - 1,
|
||||
};
|
||||
|
||||
u32 blk_mq_unique_tag(struct request *rq);
|
||||
|
||||
static inline u16 blk_mq_unique_tag_to_hwq(u32 unique_tag)
|
||||
{
|
||||
return unique_tag >> BLK_MQ_UNIQUE_TAG_BITS;
|
||||
}
|
||||
|
||||
static inline u16 blk_mq_unique_tag_to_tag(u32 unique_tag)
|
||||
{
|
||||
return unique_tag & BLK_MQ_UNIQUE_TAG_MASK;
|
||||
}
|
||||
|
||||
struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *, const int ctx_index);
|
||||
struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_tag_set *, unsigned int, int);
|
||||
|
||||
void blk_mq_end_io(struct request *rq, int error);
|
||||
void __blk_mq_end_io(struct request *rq, int error);
|
||||
void blk_mq_start_request(struct request *rq);
|
||||
void blk_mq_end_request(struct request *rq, int error);
|
||||
void __blk_mq_end_request(struct request *rq, int error);
|
||||
|
||||
void blk_mq_requeue_request(struct request *rq);
|
||||
void blk_mq_add_to_requeue_list(struct request *rq, bool at_head);
|
||||
|
|
@ -173,7 +210,8 @@ void blk_mq_stop_hw_queues(struct request_queue *q);
|
|||
void blk_mq_start_hw_queues(struct request_queue *q);
|
||||
void blk_mq_start_stopped_hw_queues(struct request_queue *q, bool async);
|
||||
void blk_mq_delay_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs);
|
||||
void blk_mq_tag_busy_iter(struct blk_mq_tags *tags, void (*fn)(void *data, unsigned long *), void *data);
|
||||
void blk_mq_tag_busy_iter(struct blk_mq_hw_ctx *hctx, busy_iter_fn *fn,
|
||||
void *priv);
|
||||
|
||||
/*
|
||||
* Driver command data is immediately after the request. So subtract request
|
||||
|
|
|
|||
|
|
@ -78,9 +78,11 @@ struct bio {
|
|||
struct io_context *bi_ioc;
|
||||
struct cgroup_subsys_state *bi_css;
|
||||
#endif
|
||||
union {
|
||||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
struct bio_integrity_payload *bi_integrity; /* data integrity */
|
||||
struct bio_integrity_payload *bi_integrity; /* data integrity */
|
||||
#endif
|
||||
};
|
||||
|
||||
unsigned short bi_vcnt; /* how many bio_vec's */
|
||||
|
||||
|
|
@ -118,10 +120,8 @@ struct bio {
|
|||
#define BIO_USER_MAPPED 6 /* contains user pages */
|
||||
#define BIO_EOPNOTSUPP 7 /* not supported */
|
||||
#define BIO_NULL_MAPPED 8 /* contains invalid user pages */
|
||||
#define BIO_FS_INTEGRITY 9 /* fs owns integrity data, not block layer */
|
||||
#define BIO_QUIET 10 /* Make BIO Quiet */
|
||||
#define BIO_MAPPED_INTEGRITY 11/* integrity metadata has been remapped */
|
||||
#define BIO_SNAP_STABLE 12 /* bio data must be snapshotted during write */
|
||||
#define BIO_QUIET 9 /* Make BIO Quiet */
|
||||
#define BIO_SNAP_STABLE 10 /* bio data must be snapshotted during write */
|
||||
|
||||
/*
|
||||
* Flags starting here get preserved by bio_reset() - this includes
|
||||
|
|
@ -162,6 +162,7 @@ enum rq_flag_bits {
|
|||
__REQ_WRITE_SAME, /* write same block many times */
|
||||
|
||||
__REQ_NOIDLE, /* don't anticipate more IO after this one */
|
||||
__REQ_INTEGRITY, /* I/O includes block integrity payload */
|
||||
__REQ_FUA, /* forced unit access */
|
||||
__REQ_FLUSH, /* request for cache flush */
|
||||
|
||||
|
|
@ -186,9 +187,7 @@ enum rq_flag_bits {
|
|||
__REQ_FLUSH_SEQ, /* request for flush sequence */
|
||||
__REQ_IO_STAT, /* account I/O stat */
|
||||
__REQ_MIXED_MERGE, /* merge of different types, fail separately */
|
||||
__REQ_KERNEL, /* direct IO to kernel pages */
|
||||
__REQ_PM, /* runtime pm request */
|
||||
__REQ_END, /* last of chain of requests */
|
||||
__REQ_HASHED, /* on IO scheduler merge hash */
|
||||
__REQ_MQ_INFLIGHT, /* track inflight for MQ */
|
||||
__REQ_NR_BITS, /* stops here */
|
||||
|
|
@ -204,13 +203,14 @@ enum rq_flag_bits {
|
|||
#define REQ_DISCARD (1ULL << __REQ_DISCARD)
|
||||
#define REQ_WRITE_SAME (1ULL << __REQ_WRITE_SAME)
|
||||
#define REQ_NOIDLE (1ULL << __REQ_NOIDLE)
|
||||
#define REQ_INTEGRITY (1ULL << __REQ_INTEGRITY)
|
||||
|
||||
#define REQ_FAILFAST_MASK \
|
||||
(REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER)
|
||||
#define REQ_COMMON_MASK \
|
||||
(REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | \
|
||||
REQ_DISCARD | REQ_WRITE_SAME | REQ_NOIDLE | REQ_FLUSH | REQ_FUA | \
|
||||
REQ_SECURE)
|
||||
REQ_SECURE | REQ_INTEGRITY)
|
||||
#define REQ_CLONE_MASK REQ_COMMON_MASK
|
||||
|
||||
#define BIO_NO_ADVANCE_ITER_MASK (REQ_DISCARD|REQ_WRITE_SAME)
|
||||
|
|
@ -240,9 +240,7 @@ enum rq_flag_bits {
|
|||
#define REQ_IO_STAT (1ULL << __REQ_IO_STAT)
|
||||
#define REQ_MIXED_MERGE (1ULL << __REQ_MIXED_MERGE)
|
||||
#define REQ_SECURE (1ULL << __REQ_SECURE)
|
||||
#define REQ_KERNEL (1ULL << __REQ_KERNEL)
|
||||
#define REQ_PM (1ULL << __REQ_PM)
|
||||
#define REQ_END (1ULL << __REQ_END)
|
||||
#define REQ_HASHED (1ULL << __REQ_HASHED)
|
||||
#define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT)
|
||||
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ struct request;
|
|||
struct sg_io_hdr;
|
||||
struct bsg_job;
|
||||
struct blkcg_gq;
|
||||
struct blk_flush_queue;
|
||||
|
||||
#define BLKDEV_MIN_RQ 4
|
||||
#define BLKDEV_MAX_RQ 128 /* Default maximum */
|
||||
|
|
@ -397,7 +398,7 @@ struct request_queue {
|
|||
*/
|
||||
struct kobject mq_kobj;
|
||||
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
#ifdef CONFIG_PM
|
||||
struct device *dev;
|
||||
int rpm_status;
|
||||
unsigned int nr_pending;
|
||||
|
|
@ -455,14 +456,7 @@ struct request_queue {
|
|||
*/
|
||||
unsigned int flush_flags;
|
||||
unsigned int flush_not_queueable:1;
|
||||
unsigned int flush_queue_delayed:1;
|
||||
unsigned int flush_pending_idx:1;
|
||||
unsigned int flush_running_idx:1;
|
||||
unsigned long flush_pending_since;
|
||||
struct list_head flush_queue[2];
|
||||
struct list_head flush_data_in_flight;
|
||||
struct request *flush_rq;
|
||||
spinlock_t mq_flush_lock;
|
||||
struct blk_flush_queue *fq;
|
||||
|
||||
struct list_head requeue_list;
|
||||
spinlock_t requeue_lock;
|
||||
|
|
@ -865,7 +859,7 @@ extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *,
|
|||
|
||||
static inline struct request_queue *bdev_get_queue(struct block_device *bdev)
|
||||
{
|
||||
return bdev->bd_disk->queue;
|
||||
return bdev->bd_disk->queue; /* this is never NULL */
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1063,7 +1057,7 @@ extern void blk_put_queue(struct request_queue *);
|
|||
/*
|
||||
* block layer runtime pm functions
|
||||
*/
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
#ifdef CONFIG_PM
|
||||
extern void blk_pm_runtime_init(struct request_queue *q, struct device *dev);
|
||||
extern int blk_pre_runtime_suspend(struct request_queue *q);
|
||||
extern void blk_post_runtime_suspend(struct request_queue *q, int err);
|
||||
|
|
@ -1142,8 +1136,6 @@ static inline bool blk_needs_flush_plug(struct task_struct *tsk)
|
|||
/*
|
||||
* tag stuff
|
||||
*/
|
||||
#define blk_rq_tagged(rq) \
|
||||
((rq)->mq_ctx || ((rq)->cmd_flags & REQ_QUEUED))
|
||||
extern int blk_queue_start_tag(struct request_queue *, struct request *);
|
||||
extern struct request *blk_queue_find_tag(struct request_queue *, int);
|
||||
extern void blk_queue_end_tag(struct request_queue *, struct request *);
|
||||
|
|
@ -1192,7 +1184,6 @@ extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm);
|
|||
enum blk_default_limits {
|
||||
BLK_MAX_SEGMENTS = 128,
|
||||
BLK_SAFE_MAX_SECTORS = 255,
|
||||
BLK_DEF_MAX_SECTORS = 1024,
|
||||
BLK_MAX_SEGMENT_SIZE = 65536,
|
||||
BLK_SEG_BOUNDARY_MASK = 0xFFFFFFFFUL,
|
||||
};
|
||||
|
|
@ -1285,10 +1276,9 @@ static inline int queue_alignment_offset(struct request_queue *q)
|
|||
static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t sector)
|
||||
{
|
||||
unsigned int granularity = max(lim->physical_block_size, lim->io_min);
|
||||
unsigned int alignment = (sector << 9) & (granularity - 1);
|
||||
unsigned int alignment = sector_div(sector, granularity >> 9) << 9;
|
||||
|
||||
return (granularity + lim->alignment_offset - alignment)
|
||||
& (granularity - 1);
|
||||
return (granularity + lim->alignment_offset - alignment) % granularity;
|
||||
}
|
||||
|
||||
static inline int bdev_alignment_offset(struct block_device *bdev)
|
||||
|
|
@ -1464,32 +1454,31 @@ static inline uint64_t rq_io_start_time_ns(struct request *req)
|
|||
|
||||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
|
||||
#define INTEGRITY_FLAG_READ 2 /* verify data integrity on read */
|
||||
#define INTEGRITY_FLAG_WRITE 4 /* generate data integrity on write */
|
||||
enum blk_integrity_flags {
|
||||
BLK_INTEGRITY_VERIFY = 1 << 0,
|
||||
BLK_INTEGRITY_GENERATE = 1 << 1,
|
||||
BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2,
|
||||
BLK_INTEGRITY_IP_CHECKSUM = 1 << 3,
|
||||
};
|
||||
|
||||
struct blk_integrity_exchg {
|
||||
struct blk_integrity_iter {
|
||||
void *prot_buf;
|
||||
void *data_buf;
|
||||
sector_t sector;
|
||||
sector_t seed;
|
||||
unsigned int data_size;
|
||||
unsigned short sector_size;
|
||||
unsigned short interval;
|
||||
const char *disk_name;
|
||||
};
|
||||
|
||||
typedef void (integrity_gen_fn) (struct blk_integrity_exchg *);
|
||||
typedef int (integrity_vrfy_fn) (struct blk_integrity_exchg *);
|
||||
typedef void (integrity_set_tag_fn) (void *, void *, unsigned int);
|
||||
typedef void (integrity_get_tag_fn) (void *, void *, unsigned int);
|
||||
typedef int (integrity_processing_fn) (struct blk_integrity_iter *);
|
||||
|
||||
struct blk_integrity {
|
||||
integrity_gen_fn *generate_fn;
|
||||
integrity_vrfy_fn *verify_fn;
|
||||
integrity_set_tag_fn *set_tag_fn;
|
||||
integrity_get_tag_fn *get_tag_fn;
|
||||
integrity_processing_fn *generate_fn;
|
||||
integrity_processing_fn *verify_fn;
|
||||
|
||||
unsigned short flags;
|
||||
unsigned short tuple_size;
|
||||
unsigned short sector_size;
|
||||
unsigned short interval;
|
||||
unsigned short tag_size;
|
||||
|
||||
const char *name;
|
||||
|
|
@ -1504,10 +1493,10 @@ extern int blk_integrity_compare(struct gendisk *, struct gendisk *);
|
|||
extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *,
|
||||
struct scatterlist *);
|
||||
extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *);
|
||||
extern int blk_integrity_merge_rq(struct request_queue *, struct request *,
|
||||
struct request *);
|
||||
extern int blk_integrity_merge_bio(struct request_queue *, struct request *,
|
||||
struct bio *);
|
||||
extern bool blk_integrity_merge_rq(struct request_queue *, struct request *,
|
||||
struct request *);
|
||||
extern bool blk_integrity_merge_bio(struct request_queue *, struct request *,
|
||||
struct bio *);
|
||||
|
||||
static inline
|
||||
struct blk_integrity *bdev_get_integrity(struct block_device *bdev)
|
||||
|
|
@ -1520,12 +1509,9 @@ static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
|
|||
return disk->integrity;
|
||||
}
|
||||
|
||||
static inline int blk_integrity_rq(struct request *rq)
|
||||
static inline bool blk_integrity_rq(struct request *rq)
|
||||
{
|
||||
if (rq->bio == NULL)
|
||||
return 0;
|
||||
|
||||
return bio_integrity(rq->bio);
|
||||
return rq->cmd_flags & REQ_INTEGRITY;
|
||||
}
|
||||
|
||||
static inline void blk_queue_max_integrity_segments(struct request_queue *q,
|
||||
|
|
@ -1564,7 +1550,7 @@ static inline int blk_rq_map_integrity_sg(struct request_queue *q,
|
|||
}
|
||||
static inline struct blk_integrity *bdev_get_integrity(struct block_device *b)
|
||||
{
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
|
||||
{
|
||||
|
|
@ -1590,17 +1576,17 @@ static inline unsigned short queue_max_integrity_segments(struct request_queue *
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int blk_integrity_merge_rq(struct request_queue *rq,
|
||||
struct request *r1,
|
||||
struct request *r2)
|
||||
static inline bool blk_integrity_merge_rq(struct request_queue *rq,
|
||||
struct request *r1,
|
||||
struct request *r2)
|
||||
{
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
static inline int blk_integrity_merge_bio(struct request_queue *rq,
|
||||
struct request *r,
|
||||
struct bio *b)
|
||||
static inline bool blk_integrity_merge_bio(struct request_queue *rq,
|
||||
struct request *r,
|
||||
struct bio *b)
|
||||
{
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
static inline bool blk_integrity_is_initialized(struct gendisk *g)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ extern unsigned long init_bootmem_node(pg_data_t *pgdat,
|
|||
extern unsigned long init_bootmem(unsigned long addr, unsigned long memend);
|
||||
|
||||
extern unsigned long free_all_bootmem(void);
|
||||
extern void reset_node_managed_pages(pg_data_t *pgdat);
|
||||
extern void reset_all_zones_managed_pages(void);
|
||||
|
||||
extern void free_bootmem_node(pg_data_t *pgdat,
|
||||
|
|
|
|||
145
include/linux/bpf.h
Normal file
145
include/linux/bpf.h
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _LINUX_BPF_H
|
||||
#define _LINUX_BPF_H 1
|
||||
|
||||
#include <uapi/linux/bpf.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/file.h>
|
||||
|
||||
struct bpf_map;
|
||||
|
||||
/* map is generic key/value storage optionally accesible by eBPF programs */
|
||||
struct bpf_map_ops {
|
||||
/* funcs callable from userspace (via syscall) */
|
||||
struct bpf_map *(*map_alloc)(union bpf_attr *attr);
|
||||
void (*map_free)(struct bpf_map *);
|
||||
int (*map_get_next_key)(struct bpf_map *map, void *key, void *next_key);
|
||||
|
||||
/* funcs callable from userspace and from eBPF programs */
|
||||
void *(*map_lookup_elem)(struct bpf_map *map, void *key);
|
||||
int (*map_update_elem)(struct bpf_map *map, void *key, void *value, u64 flags);
|
||||
int (*map_delete_elem)(struct bpf_map *map, void *key);
|
||||
};
|
||||
|
||||
struct bpf_map {
|
||||
atomic_t refcnt;
|
||||
enum bpf_map_type map_type;
|
||||
u32 key_size;
|
||||
u32 value_size;
|
||||
u32 max_entries;
|
||||
struct bpf_map_ops *ops;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
struct bpf_map_type_list {
|
||||
struct list_head list_node;
|
||||
struct bpf_map_ops *ops;
|
||||
enum bpf_map_type type;
|
||||
};
|
||||
|
||||
void bpf_register_map_type(struct bpf_map_type_list *tl);
|
||||
void bpf_map_put(struct bpf_map *map);
|
||||
struct bpf_map *bpf_map_get(struct fd f);
|
||||
|
||||
/* function argument constraints */
|
||||
enum bpf_arg_type {
|
||||
ARG_ANYTHING = 0, /* any argument is ok */
|
||||
|
||||
/* the following constraints used to prototype
|
||||
* bpf_map_lookup/update/delete_elem() functions
|
||||
*/
|
||||
ARG_CONST_MAP_PTR, /* const argument used as pointer to bpf_map */
|
||||
ARG_PTR_TO_MAP_KEY, /* pointer to stack used as map key */
|
||||
ARG_PTR_TO_MAP_VALUE, /* pointer to stack used as map value */
|
||||
|
||||
/* the following constraints used to prototype bpf_memcmp() and other
|
||||
* functions that access data on eBPF program stack
|
||||
*/
|
||||
ARG_PTR_TO_STACK, /* any pointer to eBPF program stack */
|
||||
ARG_CONST_STACK_SIZE, /* number of bytes accessed from stack */
|
||||
};
|
||||
|
||||
/* type of values returned from helper functions */
|
||||
enum bpf_return_type {
|
||||
RET_INTEGER, /* function returns integer */
|
||||
RET_VOID, /* function doesn't return anything */
|
||||
RET_PTR_TO_MAP_VALUE_OR_NULL, /* returns a pointer to map elem value or NULL */
|
||||
};
|
||||
|
||||
/* eBPF function prototype used by verifier to allow BPF_CALLs from eBPF programs
|
||||
* to in-kernel helper functions and for adjusting imm32 field in BPF_CALL
|
||||
* instructions after verifying
|
||||
*/
|
||||
struct bpf_func_proto {
|
||||
u64 (*func)(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
|
||||
bool gpl_only;
|
||||
enum bpf_return_type ret_type;
|
||||
enum bpf_arg_type arg1_type;
|
||||
enum bpf_arg_type arg2_type;
|
||||
enum bpf_arg_type arg3_type;
|
||||
enum bpf_arg_type arg4_type;
|
||||
enum bpf_arg_type arg5_type;
|
||||
};
|
||||
|
||||
/* bpf_context is intentionally undefined structure. Pointer to bpf_context is
|
||||
* the first argument to eBPF programs.
|
||||
* For socket filters: 'struct bpf_context *' == 'struct sk_buff *'
|
||||
*/
|
||||
struct bpf_context;
|
||||
|
||||
enum bpf_access_type {
|
||||
BPF_READ = 1,
|
||||
BPF_WRITE = 2
|
||||
};
|
||||
|
||||
struct bpf_verifier_ops {
|
||||
/* return eBPF function prototype for verification */
|
||||
const struct bpf_func_proto *(*get_func_proto)(enum bpf_func_id func_id);
|
||||
|
||||
/* return true if 'size' wide access at offset 'off' within bpf_context
|
||||
* with 'type' (read or write) is allowed
|
||||
*/
|
||||
bool (*is_valid_access)(int off, int size, enum bpf_access_type type);
|
||||
};
|
||||
|
||||
struct bpf_prog_type_list {
|
||||
struct list_head list_node;
|
||||
struct bpf_verifier_ops *ops;
|
||||
enum bpf_prog_type type;
|
||||
};
|
||||
|
||||
void bpf_register_prog_type(struct bpf_prog_type_list *tl);
|
||||
|
||||
struct bpf_prog;
|
||||
|
||||
struct bpf_prog_aux {
|
||||
atomic_t refcnt;
|
||||
bool is_gpl_compatible;
|
||||
enum bpf_prog_type prog_type;
|
||||
struct bpf_verifier_ops *ops;
|
||||
struct bpf_map **used_maps;
|
||||
u32 used_map_cnt;
|
||||
struct bpf_prog *prog;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_BPF_SYSCALL
|
||||
void bpf_prog_put(struct bpf_prog *prog);
|
||||
#else
|
||||
static inline void bpf_prog_put(struct bpf_prog *prog) {}
|
||||
#endif
|
||||
struct bpf_prog *bpf_prog_get(u32 ufd);
|
||||
/* verify correctness of eBPF program */
|
||||
int bpf_check(struct bpf_prog *fp, union bpf_attr *attr);
|
||||
|
||||
/* verifier prototypes for helper functions called from eBPF programs */
|
||||
extern struct bpf_func_proto bpf_map_lookup_elem_proto;
|
||||
extern struct bpf_func_proto bpf_map_update_elem_proto;
|
||||
extern struct bpf_func_proto bpf_map_delete_elem_proto;
|
||||
|
||||
#endif /* _LINUX_BPF_H */
|
||||
|
|
@ -13,7 +13,11 @@
|
|||
#define PHY_ID_BCM5461 0x002060c0
|
||||
#define PHY_ID_BCM57780 0x03625d90
|
||||
|
||||
#define PHY_ID_BCM7250 0xae025280
|
||||
#define PHY_ID_BCM7364 0xae025260
|
||||
#define PHY_ID_BCM7366 0x600d8490
|
||||
#define PHY_ID_BCM7425 0x03625e60
|
||||
#define PHY_ID_BCM7429 0x600d8730
|
||||
#define PHY_ID_BCM7439 0x600d8480
|
||||
#define PHY_ID_BCM7445 0x600d8510
|
||||
|
||||
|
|
@ -21,9 +25,9 @@
|
|||
#define PHY_BCM_OUI_1 0x00206000
|
||||
#define PHY_BCM_OUI_2 0x0143bc00
|
||||
#define PHY_BCM_OUI_3 0x03625c00
|
||||
#define PHY_BCM_OUI_4 0x600d0000
|
||||
#define PHY_BCM_OUI_4 0x600d8400
|
||||
#define PHY_BCM_OUI_5 0x03625e00
|
||||
|
||||
#define PHY_BCM_OUI_6 0xae025000
|
||||
|
||||
#define PHY_BCM_FLAGS_MODE_COPPER 0x00000001
|
||||
#define PHY_BCM_FLAGS_MODE_1000BX 0x00000002
|
||||
|
|
@ -38,7 +42,8 @@
|
|||
#define PHY_BRCM_CLEAR_RGMII_MODE 0x00004000
|
||||
#define PHY_BRCM_DIS_TXCRXC_NOENRGY 0x00008000
|
||||
/* Broadcom BCM7xxx specific workarounds */
|
||||
#define PHY_BRCM_100MBPS_WAR 0x00010000
|
||||
#define PHY_BRCM_7XXX_REV(x) (((x) >> 8) & 0xff)
|
||||
#define PHY_BRCM_7XXX_PATCH(x) ((x) & 0xff)
|
||||
#define PHY_BCM_FLAGS_VALID 0x80000000
|
||||
|
||||
/* Broadcom BCM54XX register definitions, common to most Broadcom PHYs */
|
||||
|
|
@ -92,4 +97,130 @@
|
|||
|
||||
#define MII_BCM54XX_AUXCTL_SHDWSEL_AUXCTL 0x0000
|
||||
|
||||
/*
|
||||
* Broadcom LED source encodings. These are used in BCM5461, BCM5481,
|
||||
* BCM5482, and possibly some others.
|
||||
*/
|
||||
#define BCM_LED_SRC_LINKSPD1 0x0
|
||||
#define BCM_LED_SRC_LINKSPD2 0x1
|
||||
#define BCM_LED_SRC_XMITLED 0x2
|
||||
#define BCM_LED_SRC_ACTIVITYLED 0x3
|
||||
#define BCM_LED_SRC_FDXLED 0x4
|
||||
#define BCM_LED_SRC_SLAVE 0x5
|
||||
#define BCM_LED_SRC_INTR 0x6
|
||||
#define BCM_LED_SRC_QUALITY 0x7
|
||||
#define BCM_LED_SRC_RCVLED 0x8
|
||||
#define BCM_LED_SRC_MULTICOLOR1 0xa
|
||||
#define BCM_LED_SRC_OPENSHORT 0xb
|
||||
#define BCM_LED_SRC_OFF 0xe /* Tied high */
|
||||
#define BCM_LED_SRC_ON 0xf /* Tied low */
|
||||
|
||||
|
||||
/*
|
||||
* BCM5482: Shadow registers
|
||||
* Shadow values go into bits [14:10] of register 0x1c to select a shadow
|
||||
* register to access.
|
||||
*/
|
||||
/* 00101: Spare Control Register 3 */
|
||||
#define BCM54XX_SHD_SCR3 0x05
|
||||
#define BCM54XX_SHD_SCR3_DEF_CLK125 0x0001
|
||||
#define BCM54XX_SHD_SCR3_DLLAPD_DIS 0x0002
|
||||
#define BCM54XX_SHD_SCR3_TRDDAPD 0x0004
|
||||
|
||||
/* 01010: Auto Power-Down */
|
||||
#define BCM54XX_SHD_APD 0x0a
|
||||
#define BCM54XX_SHD_APD_EN 0x0020
|
||||
|
||||
#define BCM5482_SHD_LEDS1 0x0d /* 01101: LED Selector 1 */
|
||||
/* LED3 / ~LINKSPD[2] selector */
|
||||
#define BCM5482_SHD_LEDS1_LED3(src) ((src & 0xf) << 4)
|
||||
/* LED1 / ~LINKSPD[1] selector */
|
||||
#define BCM5482_SHD_LEDS1_LED1(src) ((src & 0xf) << 0)
|
||||
#define BCM54XX_SHD_RGMII_MODE 0x0b /* 01011: RGMII Mode Selector */
|
||||
#define BCM5482_SHD_SSD 0x14 /* 10100: Secondary SerDes control */
|
||||
#define BCM5482_SHD_SSD_LEDM 0x0008 /* SSD LED Mode enable */
|
||||
#define BCM5482_SHD_SSD_EN 0x0001 /* SSD enable */
|
||||
#define BCM5482_SHD_MODE 0x1f /* 11111: Mode Control Register */
|
||||
#define BCM5482_SHD_MODE_1000BX 0x0001 /* Enable 1000BASE-X registers */
|
||||
|
||||
|
||||
/*
|
||||
* EXPANSION SHADOW ACCESS REGISTERS. (PHY REG 0x15, 0x16, and 0x17)
|
||||
*/
|
||||
#define MII_BCM54XX_EXP_AADJ1CH0 0x001f
|
||||
#define MII_BCM54XX_EXP_AADJ1CH0_SWP_ABCD_OEN 0x0200
|
||||
#define MII_BCM54XX_EXP_AADJ1CH0_SWSEL_THPF 0x0100
|
||||
#define MII_BCM54XX_EXP_AADJ1CH3 0x601f
|
||||
#define MII_BCM54XX_EXP_AADJ1CH3_ADCCKADJ 0x0002
|
||||
#define MII_BCM54XX_EXP_EXP08 0x0F08
|
||||
#define MII_BCM54XX_EXP_EXP08_RJCT_2MHZ 0x0001
|
||||
#define MII_BCM54XX_EXP_EXP08_EARLY_DAC_WAKE 0x0200
|
||||
#define MII_BCM54XX_EXP_EXP75 0x0f75
|
||||
#define MII_BCM54XX_EXP_EXP75_VDACCTRL 0x003c
|
||||
#define MII_BCM54XX_EXP_EXP75_CM_OSC 0x0001
|
||||
#define MII_BCM54XX_EXP_EXP96 0x0f96
|
||||
#define MII_BCM54XX_EXP_EXP96_MYST 0x0010
|
||||
#define MII_BCM54XX_EXP_EXP97 0x0f97
|
||||
#define MII_BCM54XX_EXP_EXP97_MYST 0x0c0c
|
||||
|
||||
/*
|
||||
* BCM5482: Secondary SerDes registers
|
||||
*/
|
||||
#define BCM5482_SSD_1000BX_CTL 0x00 /* 1000BASE-X Control */
|
||||
#define BCM5482_SSD_1000BX_CTL_PWRDOWN 0x0800 /* Power-down SSD */
|
||||
#define BCM5482_SSD_SGMII_SLAVE 0x15 /* SGMII Slave Register */
|
||||
#define BCM5482_SSD_SGMII_SLAVE_EN 0x0002 /* Slave mode enable */
|
||||
#define BCM5482_SSD_SGMII_SLAVE_AD 0x0001 /* Slave auto-detection */
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Fast Ethernet Transceiver definitions. */
|
||||
/*****************************************************************************/
|
||||
|
||||
#define MII_BRCM_FET_INTREG 0x1a /* Interrupt register */
|
||||
#define MII_BRCM_FET_IR_MASK 0x0100 /* Mask all interrupts */
|
||||
#define MII_BRCM_FET_IR_LINK_EN 0x0200 /* Link status change enable */
|
||||
#define MII_BRCM_FET_IR_SPEED_EN 0x0400 /* Link speed change enable */
|
||||
#define MII_BRCM_FET_IR_DUPLEX_EN 0x0800 /* Duplex mode change enable */
|
||||
#define MII_BRCM_FET_IR_ENABLE 0x4000 /* Interrupt enable */
|
||||
|
||||
#define MII_BRCM_FET_BRCMTEST 0x1f /* Brcm test register */
|
||||
#define MII_BRCM_FET_BT_SRE 0x0080 /* Shadow register enable */
|
||||
|
||||
|
||||
/*** Shadow register definitions ***/
|
||||
|
||||
#define MII_BRCM_FET_SHDW_MISCCTRL 0x10 /* Shadow misc ctrl */
|
||||
#define MII_BRCM_FET_SHDW_MC_FAME 0x4000 /* Force Auto MDIX enable */
|
||||
|
||||
#define MII_BRCM_FET_SHDW_AUXMODE4 0x1a /* Auxiliary mode 4 */
|
||||
#define MII_BRCM_FET_SHDW_AM4_LED_MASK 0x0003
|
||||
#define MII_BRCM_FET_SHDW_AM4_LED_MODE1 0x0001
|
||||
|
||||
#define MII_BRCM_FET_SHDW_AUXSTAT2 0x1b /* Auxiliary status 2 */
|
||||
#define MII_BRCM_FET_SHDW_AS2_APDE 0x0020 /* Auto power down enable */
|
||||
|
||||
/*
|
||||
* Indirect register access functions for the 1000BASE-T/100BASE-TX/10BASE-T
|
||||
* 0x1c shadow registers.
|
||||
*/
|
||||
static inline int bcm54xx_shadow_read(struct phy_device *phydev, u16 shadow)
|
||||
{
|
||||
phy_write(phydev, MII_BCM54XX_SHD, MII_BCM54XX_SHD_VAL(shadow));
|
||||
return MII_BCM54XX_SHD_DATA(phy_read(phydev, MII_BCM54XX_SHD));
|
||||
}
|
||||
|
||||
static inline int bcm54xx_shadow_write(struct phy_device *phydev, u16 shadow,
|
||||
u16 val)
|
||||
{
|
||||
return phy_write(phydev, MII_BCM54XX_SHD,
|
||||
MII_BCM54XX_SHD_WRITE |
|
||||
MII_BCM54XX_SHD_VAL(shadow) |
|
||||
MII_BCM54XX_SHD_DATA(val));
|
||||
}
|
||||
|
||||
#define BRCM_CL45VEN_EEE_CONTROL 0x803d
|
||||
#define LPI_FEATURE_EN 0x8000
|
||||
#define LPI_FEATURE_EN_DIG1000X 0x4000
|
||||
|
||||
#endif /* _LINUX_BRCMPHY_H */
|
||||
|
|
|
|||
|
|
@ -175,12 +175,13 @@ void __wait_on_buffer(struct buffer_head *);
|
|||
wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
|
||||
struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block,
|
||||
unsigned size);
|
||||
struct buffer_head *__getblk(struct block_device *bdev, sector_t block,
|
||||
unsigned size);
|
||||
struct buffer_head *__getblk_gfp(struct block_device *bdev, sector_t block,
|
||||
unsigned size, gfp_t gfp);
|
||||
void __brelse(struct buffer_head *);
|
||||
void __bforget(struct buffer_head *);
|
||||
void __breadahead(struct block_device *, sector_t block, unsigned int size);
|
||||
struct buffer_head *__bread(struct block_device *, sector_t block, unsigned size);
|
||||
struct buffer_head *__bread_gfp(struct block_device *,
|
||||
sector_t block, unsigned size, gfp_t gfp);
|
||||
void invalidate_bh_lrus(void);
|
||||
struct buffer_head *alloc_buffer_head(gfp_t gfp_flags);
|
||||
void free_buffer_head(struct buffer_head * bh);
|
||||
|
|
@ -295,7 +296,13 @@ static inline void bforget(struct buffer_head *bh)
|
|||
static inline struct buffer_head *
|
||||
sb_bread(struct super_block *sb, sector_t block)
|
||||
{
|
||||
return __bread(sb->s_bdev, block, sb->s_blocksize);
|
||||
return __bread_gfp(sb->s_bdev, block, sb->s_blocksize, __GFP_MOVABLE);
|
||||
}
|
||||
|
||||
static inline struct buffer_head *
|
||||
sb_bread_unmovable(struct super_block *sb, sector_t block)
|
||||
{
|
||||
return __bread_gfp(sb->s_bdev, block, sb->s_blocksize, 0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
@ -307,7 +314,7 @@ sb_breadahead(struct super_block *sb, sector_t block)
|
|||
static inline struct buffer_head *
|
||||
sb_getblk(struct super_block *sb, sector_t block)
|
||||
{
|
||||
return __getblk(sb->s_bdev, block, sb->s_blocksize);
|
||||
return __getblk_gfp(sb->s_bdev, block, sb->s_blocksize, __GFP_MOVABLE);
|
||||
}
|
||||
|
||||
static inline struct buffer_head *
|
||||
|
|
@ -344,6 +351,36 @@ static inline void lock_buffer(struct buffer_head *bh)
|
|||
__lock_buffer(bh);
|
||||
}
|
||||
|
||||
static inline struct buffer_head *getblk_unmovable(struct block_device *bdev,
|
||||
sector_t block,
|
||||
unsigned size)
|
||||
{
|
||||
return __getblk_gfp(bdev, block, size, 0);
|
||||
}
|
||||
|
||||
static inline struct buffer_head *__getblk(struct block_device *bdev,
|
||||
sector_t block,
|
||||
unsigned size)
|
||||
{
|
||||
return __getblk_gfp(bdev, block, size, __GFP_MOVABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
* __bread() - reads a specified block and returns the bh
|
||||
* @bdev: the block_device to read from
|
||||
* @block: number of block
|
||||
* @size: size (in bytes) to read
|
||||
*
|
||||
* Reads a specified block, and returns buffer head that contains it.
|
||||
* The page cache is allocated from movable area so that it can be migrated.
|
||||
* It returns NULL if the block was unreadable.
|
||||
*/
|
||||
static inline struct buffer_head *
|
||||
__bread(struct block_device *bdev, sector_t block, unsigned size)
|
||||
{
|
||||
return __bread_gfp(bdev, block, size, __GFP_MOVABLE);
|
||||
}
|
||||
|
||||
extern int __set_page_dirty_buffers(struct page *page);
|
||||
|
||||
#else /* CONFIG_BLOCK */
|
||||
|
|
|
|||
100
include/linux/cacheinfo.h
Normal file
100
include/linux/cacheinfo.h
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
#ifndef _LINUX_CACHEINFO_H
|
||||
#define _LINUX_CACHEINFO_H
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
struct device_node;
|
||||
struct attribute;
|
||||
|
||||
enum cache_type {
|
||||
CACHE_TYPE_NOCACHE = 0,
|
||||
CACHE_TYPE_INST = BIT(0),
|
||||
CACHE_TYPE_DATA = BIT(1),
|
||||
CACHE_TYPE_SEPARATE = CACHE_TYPE_INST | CACHE_TYPE_DATA,
|
||||
CACHE_TYPE_UNIFIED = BIT(2),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cacheinfo - represent a cache leaf node
|
||||
* @type: type of the cache - data, inst or unified
|
||||
* @level: represents the hierarcy in the multi-level cache
|
||||
* @coherency_line_size: size of each cache line usually representing
|
||||
* the minimum amount of data that gets transferred from memory
|
||||
* @number_of_sets: total number of sets, a set is a collection of cache
|
||||
* lines sharing the same index
|
||||
* @ways_of_associativity: number of ways in which a particular memory
|
||||
* block can be placed in the cache
|
||||
* @physical_line_partition: number of physical cache lines sharing the
|
||||
* same cachetag
|
||||
* @size: Total size of the cache
|
||||
* @shared_cpu_map: logical cpumask representing all the cpus sharing
|
||||
* this cache node
|
||||
* @attributes: bitfield representing various cache attributes
|
||||
* @of_node: if devicetree is used, this represents either the cpu node in
|
||||
* case there's no explicit cache node or the cache node itself in the
|
||||
* device tree
|
||||
* @disable_sysfs: indicates whether this node is visible to the user via
|
||||
* sysfs or not
|
||||
* @priv: pointer to any private data structure specific to particular
|
||||
* cache design
|
||||
*
|
||||
* While @of_node, @disable_sysfs and @priv are used for internal book
|
||||
* keeping, the remaining members form the core properties of the cache
|
||||
*/
|
||||
struct cacheinfo {
|
||||
enum cache_type type;
|
||||
unsigned int level;
|
||||
unsigned int coherency_line_size;
|
||||
unsigned int number_of_sets;
|
||||
unsigned int ways_of_associativity;
|
||||
unsigned int physical_line_partition;
|
||||
unsigned int size;
|
||||
cpumask_t shared_cpu_map;
|
||||
unsigned int attributes;
|
||||
#define CACHE_WRITE_THROUGH BIT(0)
|
||||
#define CACHE_WRITE_BACK BIT(1)
|
||||
#define CACHE_WRITE_POLICY_MASK \
|
||||
(CACHE_WRITE_THROUGH | CACHE_WRITE_BACK)
|
||||
#define CACHE_READ_ALLOCATE BIT(2)
|
||||
#define CACHE_WRITE_ALLOCATE BIT(3)
|
||||
#define CACHE_ALLOCATE_POLICY_MASK \
|
||||
(CACHE_READ_ALLOCATE | CACHE_WRITE_ALLOCATE)
|
||||
|
||||
struct device_node *of_node;
|
||||
bool disable_sysfs;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct cpu_cacheinfo {
|
||||
struct cacheinfo *info_list;
|
||||
unsigned int num_levels;
|
||||
unsigned int num_leaves;
|
||||
};
|
||||
|
||||
/*
|
||||
* Helpers to make sure "func" is executed on the cpu whose cache
|
||||
* attributes are being detected
|
||||
*/
|
||||
#define DEFINE_SMP_CALL_CACHE_FUNCTION(func) \
|
||||
static inline void _##func(void *ret) \
|
||||
{ \
|
||||
int cpu = smp_processor_id(); \
|
||||
*(int *)ret = __##func(cpu); \
|
||||
} \
|
||||
\
|
||||
int func(unsigned int cpu) \
|
||||
{ \
|
||||
int ret; \
|
||||
smp_call_function_single(cpu, _##func, &ret, true); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
struct cpu_cacheinfo *get_cpu_cacheinfo(unsigned int cpu);
|
||||
int init_cache_level(unsigned int cpu);
|
||||
int populate_cache_leaves(unsigned int cpu);
|
||||
|
||||
const struct attribute_group *cache_get_priv_group(struct cacheinfo *this_leaf);
|
||||
|
||||
#endif /* _LINUX_CACHEINFO_H */
|
||||
|
|
@ -99,6 +99,12 @@ inval_skb:
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline bool can_is_canfd_skb(const struct sk_buff *skb)
|
||||
{
|
||||
/* the CAN specific type of skb is identified by its data length */
|
||||
return skb->len == CANFD_MTU;
|
||||
}
|
||||
|
||||
/* get data length from can_dlc with sanitized can_dlc */
|
||||
u8 can_dlc2len(u8 can_dlc);
|
||||
|
||||
|
|
@ -121,6 +127,9 @@ void unregister_candev(struct net_device *dev);
|
|||
int can_restart_now(struct net_device *dev);
|
||||
void can_bus_off(struct net_device *dev);
|
||||
|
||||
void can_change_state(struct net_device *dev, struct can_frame *cf,
|
||||
enum can_state tx_state, enum can_state rx_state);
|
||||
|
||||
void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
|
||||
unsigned int idx);
|
||||
unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx);
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
struct ceph_auth_client;
|
||||
struct ceph_authorizer;
|
||||
struct ceph_msg;
|
||||
|
||||
struct ceph_auth_handshake {
|
||||
struct ceph_authorizer *authorizer;
|
||||
|
|
@ -20,6 +21,10 @@ struct ceph_auth_handshake {
|
|||
size_t authorizer_buf_len;
|
||||
void *authorizer_reply_buf;
|
||||
size_t authorizer_reply_buf_len;
|
||||
int (*sign_message)(struct ceph_auth_handshake *auth,
|
||||
struct ceph_msg *msg);
|
||||
int (*check_message_signature)(struct ceph_auth_handshake *auth,
|
||||
struct ceph_msg *msg);
|
||||
};
|
||||
|
||||
struct ceph_auth_client_ops {
|
||||
|
|
@ -66,6 +71,11 @@ struct ceph_auth_client_ops {
|
|||
void (*reset)(struct ceph_auth_client *ac);
|
||||
|
||||
void (*destroy)(struct ceph_auth_client *ac);
|
||||
|
||||
int (*sign_message)(struct ceph_auth_handshake *auth,
|
||||
struct ceph_msg *msg);
|
||||
int (*check_message_signature)(struct ceph_auth_handshake *auth,
|
||||
struct ceph_msg *msg);
|
||||
};
|
||||
|
||||
struct ceph_auth_client {
|
||||
|
|
@ -113,4 +123,20 @@ extern int ceph_auth_verify_authorizer_reply(struct ceph_auth_client *ac,
|
|||
extern void ceph_auth_invalidate_authorizer(struct ceph_auth_client *ac,
|
||||
int peer_type);
|
||||
|
||||
static inline int ceph_auth_sign_message(struct ceph_auth_handshake *auth,
|
||||
struct ceph_msg *msg)
|
||||
{
|
||||
if (auth->sign_message)
|
||||
return auth->sign_message(auth, msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ceph_auth_check_message_signature(struct ceph_auth_handshake *auth,
|
||||
struct ceph_msg *msg)
|
||||
{
|
||||
if (auth->check_message_signature)
|
||||
return auth->check_message_signature(auth, msg);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -10,8 +10,7 @@
|
|||
/*
|
||||
* a simple reference counted buffer.
|
||||
*
|
||||
* use kmalloc for small sizes (<= one page), vmalloc for larger
|
||||
* sizes.
|
||||
* use kmalloc for smaller sizes, vmalloc for larger sizes.
|
||||
*/
|
||||
struct ceph_buffer {
|
||||
struct kref kref;
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@ static inline u64 ceph_sanitize_features(u64 features)
|
|||
CEPH_FEATURE_PGPOOL3 | \
|
||||
CEPH_FEATURE_OSDENC | \
|
||||
CEPH_FEATURE_CRUSH_TUNABLES | \
|
||||
CEPH_FEATURE_MSG_AUTH | \
|
||||
CEPH_FEATURE_CRUSH_TUNABLES2 | \
|
||||
CEPH_FEATURE_REPLY_CREATE_INODE | \
|
||||
CEPH_FEATURE_OSDHASHPSPOOL | \
|
||||
|
|
|
|||
|
|
@ -522,8 +522,11 @@ struct ceph_mds_reply_dirfrag {
|
|||
__le32 dist[];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define CEPH_LOCK_FCNTL 1
|
||||
#define CEPH_LOCK_FLOCK 2
|
||||
#define CEPH_LOCK_FCNTL 1
|
||||
#define CEPH_LOCK_FLOCK 2
|
||||
#define CEPH_LOCK_FCNTL_INTR 3
|
||||
#define CEPH_LOCK_FLOCK_INTR 4
|
||||
|
||||
|
||||
#define CEPH_LOCK_SHARED 1
|
||||
#define CEPH_LOCK_EXCL 2
|
||||
|
|
@ -549,6 +552,7 @@ struct ceph_filelock {
|
|||
|
||||
int ceph_flags_to_mode(int flags);
|
||||
|
||||
#define CEPH_INLINE_NONE ((__u64)-1)
|
||||
|
||||
/* capability bits */
|
||||
#define CEPH_CAP_PIN 1 /* no specific capabilities beyond the pin */
|
||||
|
|
@ -613,6 +617,8 @@ int ceph_flags_to_mode(int flags);
|
|||
CEPH_CAP_LINK_SHARED | \
|
||||
CEPH_CAP_FILE_SHARED | \
|
||||
CEPH_CAP_XATTR_SHARED)
|
||||
#define CEPH_STAT_CAP_INLINE_DATA (CEPH_CAP_FILE_SHARED | \
|
||||
CEPH_CAP_FILE_RD)
|
||||
|
||||
#define CEPH_CAP_ANY_SHARED (CEPH_CAP_AUTH_SHARED | \
|
||||
CEPH_CAP_LINK_SHARED | \
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#define CEPH_OPT_NOSHARE (1<<1) /* don't share client with other sbs */
|
||||
#define CEPH_OPT_MYIP (1<<2) /* specified my ip */
|
||||
#define CEPH_OPT_NOCRC (1<<3) /* no data crc on writes */
|
||||
#define CEPH_OPT_NOMSGAUTH (1<<4) /* not require cephx message signature */
|
||||
|
||||
#define CEPH_OPT_DEFAULT (0)
|
||||
|
||||
|
|
@ -184,7 +185,6 @@ extern bool libceph_compatible(void *data);
|
|||
extern const char *ceph_msg_type_name(int type);
|
||||
extern int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid);
|
||||
extern void *ceph_kvmalloc(size_t size, gfp_t flags);
|
||||
extern void ceph_kvfree(const void *ptr);
|
||||
|
||||
extern struct ceph_options *ceph_parse_options(char *options,
|
||||
const char *dev_name, const char *dev_name_end,
|
||||
|
|
@ -211,7 +211,6 @@ extern struct page **ceph_get_direct_page_vector(const void __user *data,
|
|||
bool write_page);
|
||||
extern void ceph_put_page_vector(struct page **pages, int num_pages,
|
||||
bool dirty);
|
||||
extern void ceph_release_page_vector(struct page **pages, int num_pages);
|
||||
extern struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags);
|
||||
extern int ceph_copy_user_to_page_vector(struct page **pages,
|
||||
const void __user *data,
|
||||
|
|
|
|||
|
|
@ -42,6 +42,10 @@ struct ceph_connection_operations {
|
|||
struct ceph_msg * (*alloc_msg) (struct ceph_connection *con,
|
||||
struct ceph_msg_header *hdr,
|
||||
int *skip);
|
||||
int (*sign_message) (struct ceph_connection *con, struct ceph_msg *msg);
|
||||
|
||||
int (*check_message_signature) (struct ceph_connection *con,
|
||||
struct ceph_msg *msg);
|
||||
};
|
||||
|
||||
/* use format string %s%d */
|
||||
|
|
@ -142,7 +146,10 @@ struct ceph_msg_data_cursor {
|
|||
*/
|
||||
struct ceph_msg {
|
||||
struct ceph_msg_header hdr; /* header */
|
||||
struct ceph_msg_footer footer; /* footer */
|
||||
union {
|
||||
struct ceph_msg_footer footer; /* footer */
|
||||
struct ceph_msg_footer_old old_footer; /* old format footer */
|
||||
};
|
||||
struct kvec front; /* unaligned blobs of message */
|
||||
struct ceph_buffer *middle;
|
||||
|
||||
|
|
|
|||
|
|
@ -152,7 +152,8 @@ struct ceph_msg_header {
|
|||
receiver: mask against ~PAGE_MASK */
|
||||
|
||||
struct ceph_entity_name src;
|
||||
__le32 reserved;
|
||||
__le16 compat_version;
|
||||
__le16 reserved;
|
||||
__le32 crc; /* header crc32c */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
|
@ -164,13 +165,21 @@ struct ceph_msg_header {
|
|||
/*
|
||||
* follows data payload
|
||||
*/
|
||||
struct ceph_msg_footer_old {
|
||||
__le32 front_crc, middle_crc, data_crc;
|
||||
__u8 flags;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct ceph_msg_footer {
|
||||
__le32 front_crc, middle_crc, data_crc;
|
||||
// sig holds the 64 bits of the digital signature for the message PLR
|
||||
__le64 sig;
|
||||
__u8 flags;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define CEPH_MSG_FOOTER_COMPLETE (1<<0) /* msg wasn't aborted */
|
||||
#define CEPH_MSG_FOOTER_NOCRC (1<<1) /* no data crc */
|
||||
#define CEPH_MSG_FOOTER_SIGNED (1<<2) /* msg was signed */
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -86,6 +86,13 @@ struct ceph_osd_req_op {
|
|||
u32 truncate_seq;
|
||||
struct ceph_osd_data osd_data;
|
||||
} extent;
|
||||
struct {
|
||||
u32 name_len;
|
||||
u32 value_len;
|
||||
__u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */
|
||||
__u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */
|
||||
struct ceph_osd_data osd_data;
|
||||
} xattr;
|
||||
struct {
|
||||
const char *class_name;
|
||||
const char *method_name;
|
||||
|
|
@ -295,6 +302,9 @@ extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *,
|
|||
extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req,
|
||||
unsigned int which, u16 opcode,
|
||||
const char *class, const char *method);
|
||||
extern int osd_req_op_xattr_init(struct ceph_osd_request *osd_req, unsigned int which,
|
||||
u16 opcode, const char *name, const void *value,
|
||||
size_t size, u8 cmp_op, u8 cmp_mode);
|
||||
extern void osd_req_op_watch_init(struct ceph_osd_request *osd_req,
|
||||
unsigned int which, u16 opcode,
|
||||
u64 cookie, u64 version, int flag);
|
||||
|
|
@ -318,7 +328,8 @@ extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
|
|||
struct ceph_file_layout *layout,
|
||||
struct ceph_vino vino,
|
||||
u64 offset, u64 *len,
|
||||
int num_ops, int opcode, int flags,
|
||||
unsigned int which, int num_ops,
|
||||
int opcode, int flags,
|
||||
struct ceph_snap_context *snapc,
|
||||
u32 truncate_seq, u64 truncate_size,
|
||||
bool use_mempool);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
#ifndef __FS_CEPH_PAGELIST_H
|
||||
#define __FS_CEPH_PAGELIST_H
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct ceph_pagelist {
|
||||
struct list_head head;
|
||||
|
|
@ -10,6 +13,7 @@ struct ceph_pagelist {
|
|||
size_t room;
|
||||
struct list_head free_list;
|
||||
size_t num_pages_free;
|
||||
atomic_t refcnt;
|
||||
};
|
||||
|
||||
struct ceph_pagelist_cursor {
|
||||
|
|
@ -26,9 +30,10 @@ static inline void ceph_pagelist_init(struct ceph_pagelist *pl)
|
|||
pl->room = 0;
|
||||
INIT_LIST_HEAD(&pl->free_list);
|
||||
pl->num_pages_free = 0;
|
||||
atomic_set(&pl->refcnt, 1);
|
||||
}
|
||||
|
||||
extern int ceph_pagelist_release(struct ceph_pagelist *pl);
|
||||
extern void ceph_pagelist_release(struct ceph_pagelist *pl);
|
||||
|
||||
extern int ceph_pagelist_append(struct ceph_pagelist *pl, const void *d, size_t l);
|
||||
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@ extern const char *ceph_osd_state_name(int s);
|
|||
#define CEPH_OSD_OP_MODE_WR 0x2000
|
||||
#define CEPH_OSD_OP_MODE_RMW 0x3000
|
||||
#define CEPH_OSD_OP_MODE_SUB 0x4000
|
||||
#define CEPH_OSD_OP_MODE_CACHE 0x8000
|
||||
|
||||
#define CEPH_OSD_OP_TYPE 0x0f00
|
||||
#define CEPH_OSD_OP_TYPE_LOCK 0x0100
|
||||
|
|
@ -181,103 +182,135 @@ extern const char *ceph_osd_state_name(int s);
|
|||
#define CEPH_OSD_OP_TYPE_PG 0x0500
|
||||
#define CEPH_OSD_OP_TYPE_MULTI 0x0600 /* multiobject */
|
||||
|
||||
#define __CEPH_OSD_OP1(mode, nr) \
|
||||
(CEPH_OSD_OP_MODE_##mode | (nr))
|
||||
|
||||
#define __CEPH_OSD_OP(mode, type, nr) \
|
||||
(CEPH_OSD_OP_MODE_##mode | CEPH_OSD_OP_TYPE_##type | (nr))
|
||||
|
||||
#define __CEPH_FORALL_OSD_OPS(f) \
|
||||
/** data **/ \
|
||||
/* read */ \
|
||||
f(READ, __CEPH_OSD_OP(RD, DATA, 1), "read") \
|
||||
f(STAT, __CEPH_OSD_OP(RD, DATA, 2), "stat") \
|
||||
f(MAPEXT, __CEPH_OSD_OP(RD, DATA, 3), "mapext") \
|
||||
\
|
||||
/* fancy read */ \
|
||||
f(MASKTRUNC, __CEPH_OSD_OP(RD, DATA, 4), "masktrunc") \
|
||||
f(SPARSE_READ, __CEPH_OSD_OP(RD, DATA, 5), "sparse-read") \
|
||||
\
|
||||
f(NOTIFY, __CEPH_OSD_OP(RD, DATA, 6), "notify") \
|
||||
f(NOTIFY_ACK, __CEPH_OSD_OP(RD, DATA, 7), "notify-ack") \
|
||||
\
|
||||
/* versioning */ \
|
||||
f(ASSERT_VER, __CEPH_OSD_OP(RD, DATA, 8), "assert-version") \
|
||||
\
|
||||
f(LIST_WATCHERS, __CEPH_OSD_OP(RD, DATA, 9), "list-watchers") \
|
||||
\
|
||||
f(LIST_SNAPS, __CEPH_OSD_OP(RD, DATA, 10), "list-snaps") \
|
||||
\
|
||||
/* sync */ \
|
||||
f(SYNC_READ, __CEPH_OSD_OP(RD, DATA, 11), "sync_read") \
|
||||
\
|
||||
/* write */ \
|
||||
f(WRITE, __CEPH_OSD_OP(WR, DATA, 1), "write") \
|
||||
f(WRITEFULL, __CEPH_OSD_OP(WR, DATA, 2), "writefull") \
|
||||
f(TRUNCATE, __CEPH_OSD_OP(WR, DATA, 3), "truncate") \
|
||||
f(ZERO, __CEPH_OSD_OP(WR, DATA, 4), "zero") \
|
||||
f(DELETE, __CEPH_OSD_OP(WR, DATA, 5), "delete") \
|
||||
\
|
||||
/* fancy write */ \
|
||||
f(APPEND, __CEPH_OSD_OP(WR, DATA, 6), "append") \
|
||||
f(STARTSYNC, __CEPH_OSD_OP(WR, DATA, 7), "startsync") \
|
||||
f(SETTRUNC, __CEPH_OSD_OP(WR, DATA, 8), "settrunc") \
|
||||
f(TRIMTRUNC, __CEPH_OSD_OP(WR, DATA, 9), "trimtrunc") \
|
||||
\
|
||||
f(TMAPUP, __CEPH_OSD_OP(RMW, DATA, 10), "tmapup") \
|
||||
f(TMAPPUT, __CEPH_OSD_OP(WR, DATA, 11), "tmapput") \
|
||||
f(TMAPGET, __CEPH_OSD_OP(RD, DATA, 12), "tmapget") \
|
||||
\
|
||||
f(CREATE, __CEPH_OSD_OP(WR, DATA, 13), "create") \
|
||||
f(ROLLBACK, __CEPH_OSD_OP(WR, DATA, 14), "rollback") \
|
||||
\
|
||||
f(WATCH, __CEPH_OSD_OP(WR, DATA, 15), "watch") \
|
||||
\
|
||||
/* omap */ \
|
||||
f(OMAPGETKEYS, __CEPH_OSD_OP(RD, DATA, 17), "omap-get-keys") \
|
||||
f(OMAPGETVALS, __CEPH_OSD_OP(RD, DATA, 18), "omap-get-vals") \
|
||||
f(OMAPGETHEADER, __CEPH_OSD_OP(RD, DATA, 19), "omap-get-header") \
|
||||
f(OMAPGETVALSBYKEYS, __CEPH_OSD_OP(RD, DATA, 20), "omap-get-vals-by-keys") \
|
||||
f(OMAPSETVALS, __CEPH_OSD_OP(WR, DATA, 21), "omap-set-vals") \
|
||||
f(OMAPSETHEADER, __CEPH_OSD_OP(WR, DATA, 22), "omap-set-header") \
|
||||
f(OMAPCLEAR, __CEPH_OSD_OP(WR, DATA, 23), "omap-clear") \
|
||||
f(OMAPRMKEYS, __CEPH_OSD_OP(WR, DATA, 24), "omap-rm-keys") \
|
||||
f(OMAP_CMP, __CEPH_OSD_OP(RD, DATA, 25), "omap-cmp") \
|
||||
\
|
||||
/* tiering */ \
|
||||
f(COPY_FROM, __CEPH_OSD_OP(WR, DATA, 26), "copy-from") \
|
||||
f(COPY_GET_CLASSIC, __CEPH_OSD_OP(RD, DATA, 27), "copy-get-classic") \
|
||||
f(UNDIRTY, __CEPH_OSD_OP(WR, DATA, 28), "undirty") \
|
||||
f(ISDIRTY, __CEPH_OSD_OP(RD, DATA, 29), "isdirty") \
|
||||
f(COPY_GET, __CEPH_OSD_OP(RD, DATA, 30), "copy-get") \
|
||||
f(CACHE_FLUSH, __CEPH_OSD_OP(CACHE, DATA, 31), "cache-flush") \
|
||||
f(CACHE_EVICT, __CEPH_OSD_OP(CACHE, DATA, 32), "cache-evict") \
|
||||
f(CACHE_TRY_FLUSH, __CEPH_OSD_OP(CACHE, DATA, 33), "cache-try-flush") \
|
||||
\
|
||||
/* convert tmap to omap */ \
|
||||
f(TMAP2OMAP, __CEPH_OSD_OP(RMW, DATA, 34), "tmap2omap") \
|
||||
\
|
||||
/* hints */ \
|
||||
f(SETALLOCHINT, __CEPH_OSD_OP(WR, DATA, 35), "set-alloc-hint") \
|
||||
\
|
||||
/** multi **/ \
|
||||
f(CLONERANGE, __CEPH_OSD_OP(WR, MULTI, 1), "clonerange") \
|
||||
f(ASSERT_SRC_VERSION, __CEPH_OSD_OP(RD, MULTI, 2), "assert-src-version") \
|
||||
f(SRC_CMPXATTR, __CEPH_OSD_OP(RD, MULTI, 3), "src-cmpxattr") \
|
||||
\
|
||||
/** attrs **/ \
|
||||
/* read */ \
|
||||
f(GETXATTR, __CEPH_OSD_OP(RD, ATTR, 1), "getxattr") \
|
||||
f(GETXATTRS, __CEPH_OSD_OP(RD, ATTR, 2), "getxattrs") \
|
||||
f(CMPXATTR, __CEPH_OSD_OP(RD, ATTR, 3), "cmpxattr") \
|
||||
\
|
||||
/* write */ \
|
||||
f(SETXATTR, __CEPH_OSD_OP(WR, ATTR, 1), "setxattr") \
|
||||
f(SETXATTRS, __CEPH_OSD_OP(WR, ATTR, 2), "setxattrs") \
|
||||
f(RESETXATTRS, __CEPH_OSD_OP(WR, ATTR, 3), "resetxattrs") \
|
||||
f(RMXATTR, __CEPH_OSD_OP(WR, ATTR, 4), "rmxattr") \
|
||||
\
|
||||
/** subop **/ \
|
||||
f(PULL, __CEPH_OSD_OP1(SUB, 1), "pull") \
|
||||
f(PUSH, __CEPH_OSD_OP1(SUB, 2), "push") \
|
||||
f(BALANCEREADS, __CEPH_OSD_OP1(SUB, 3), "balance-reads") \
|
||||
f(UNBALANCEREADS, __CEPH_OSD_OP1(SUB, 4), "unbalance-reads") \
|
||||
f(SCRUB, __CEPH_OSD_OP1(SUB, 5), "scrub") \
|
||||
f(SCRUB_RESERVE, __CEPH_OSD_OP1(SUB, 6), "scrub-reserve") \
|
||||
f(SCRUB_UNRESERVE, __CEPH_OSD_OP1(SUB, 7), "scrub-unreserve") \
|
||||
f(SCRUB_STOP, __CEPH_OSD_OP1(SUB, 8), "scrub-stop") \
|
||||
f(SCRUB_MAP, __CEPH_OSD_OP1(SUB, 9), "scrub-map") \
|
||||
\
|
||||
/** lock **/ \
|
||||
f(WRLOCK, __CEPH_OSD_OP(WR, LOCK, 1), "wrlock") \
|
||||
f(WRUNLOCK, __CEPH_OSD_OP(WR, LOCK, 2), "wrunlock") \
|
||||
f(RDLOCK, __CEPH_OSD_OP(WR, LOCK, 3), "rdlock") \
|
||||
f(RDUNLOCK, __CEPH_OSD_OP(WR, LOCK, 4), "rdunlock") \
|
||||
f(UPLOCK, __CEPH_OSD_OP(WR, LOCK, 5), "uplock") \
|
||||
f(DNLOCK, __CEPH_OSD_OP(WR, LOCK, 6), "dnlock") \
|
||||
\
|
||||
/** exec **/ \
|
||||
/* note: the RD bit here is wrong; see special-case below in helper */ \
|
||||
f(CALL, __CEPH_OSD_OP(RD, EXEC, 1), "call") \
|
||||
\
|
||||
/** pg **/ \
|
||||
f(PGLS, __CEPH_OSD_OP(RD, PG, 1), "pgls") \
|
||||
f(PGLS_FILTER, __CEPH_OSD_OP(RD, PG, 2), "pgls-filter") \
|
||||
f(PG_HITSET_LS, __CEPH_OSD_OP(RD, PG, 3), "pg-hitset-ls") \
|
||||
f(PG_HITSET_GET, __CEPH_OSD_OP(RD, PG, 4), "pg-hitset-get")
|
||||
|
||||
enum {
|
||||
/** data **/
|
||||
/* read */
|
||||
CEPH_OSD_OP_READ = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 1,
|
||||
CEPH_OSD_OP_STAT = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 2,
|
||||
CEPH_OSD_OP_MAPEXT = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 3,
|
||||
|
||||
/* fancy read */
|
||||
CEPH_OSD_OP_MASKTRUNC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 4,
|
||||
CEPH_OSD_OP_SPARSE_READ = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 5,
|
||||
|
||||
CEPH_OSD_OP_NOTIFY = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 6,
|
||||
CEPH_OSD_OP_NOTIFY_ACK = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 7,
|
||||
|
||||
/* versioning */
|
||||
CEPH_OSD_OP_ASSERT_VER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 8,
|
||||
|
||||
/* write */
|
||||
CEPH_OSD_OP_WRITE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 1,
|
||||
CEPH_OSD_OP_WRITEFULL = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 2,
|
||||
CEPH_OSD_OP_TRUNCATE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 3,
|
||||
CEPH_OSD_OP_ZERO = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 4,
|
||||
CEPH_OSD_OP_DELETE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 5,
|
||||
|
||||
/* fancy write */
|
||||
CEPH_OSD_OP_APPEND = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 6,
|
||||
CEPH_OSD_OP_STARTSYNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 7,
|
||||
CEPH_OSD_OP_SETTRUNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 8,
|
||||
CEPH_OSD_OP_TRIMTRUNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 9,
|
||||
|
||||
CEPH_OSD_OP_TMAPUP = CEPH_OSD_OP_MODE_RMW | CEPH_OSD_OP_TYPE_DATA | 10,
|
||||
CEPH_OSD_OP_TMAPPUT = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 11,
|
||||
CEPH_OSD_OP_TMAPGET = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 12,
|
||||
|
||||
CEPH_OSD_OP_CREATE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 13,
|
||||
CEPH_OSD_OP_ROLLBACK= CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 14,
|
||||
|
||||
CEPH_OSD_OP_WATCH = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 15,
|
||||
|
||||
/* omap */
|
||||
CEPH_OSD_OP_OMAPGETKEYS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 17,
|
||||
CEPH_OSD_OP_OMAPGETVALS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 18,
|
||||
CEPH_OSD_OP_OMAPGETHEADER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 19,
|
||||
CEPH_OSD_OP_OMAPGETVALSBYKEYS =
|
||||
CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 20,
|
||||
CEPH_OSD_OP_OMAPSETVALS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 21,
|
||||
CEPH_OSD_OP_OMAPSETHEADER = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 22,
|
||||
CEPH_OSD_OP_OMAPCLEAR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 23,
|
||||
CEPH_OSD_OP_OMAPRMKEYS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 24,
|
||||
CEPH_OSD_OP_OMAP_CMP = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 25,
|
||||
|
||||
/* hints */
|
||||
CEPH_OSD_OP_SETALLOCHINT = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 35,
|
||||
|
||||
/** multi **/
|
||||
CEPH_OSD_OP_CLONERANGE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_MULTI | 1,
|
||||
CEPH_OSD_OP_ASSERT_SRC_VERSION = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_MULTI | 2,
|
||||
CEPH_OSD_OP_SRC_CMPXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_MULTI | 3,
|
||||
|
||||
/** attrs **/
|
||||
/* read */
|
||||
CEPH_OSD_OP_GETXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 1,
|
||||
CEPH_OSD_OP_GETXATTRS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 2,
|
||||
CEPH_OSD_OP_CMPXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 3,
|
||||
|
||||
/* write */
|
||||
CEPH_OSD_OP_SETXATTR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 1,
|
||||
CEPH_OSD_OP_SETXATTRS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 2,
|
||||
CEPH_OSD_OP_RESETXATTRS = CEPH_OSD_OP_MODE_WR|CEPH_OSD_OP_TYPE_ATTR | 3,
|
||||
CEPH_OSD_OP_RMXATTR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 4,
|
||||
|
||||
/** subop **/
|
||||
CEPH_OSD_OP_PULL = CEPH_OSD_OP_MODE_SUB | 1,
|
||||
CEPH_OSD_OP_PUSH = CEPH_OSD_OP_MODE_SUB | 2,
|
||||
CEPH_OSD_OP_BALANCEREADS = CEPH_OSD_OP_MODE_SUB | 3,
|
||||
CEPH_OSD_OP_UNBALANCEREADS = CEPH_OSD_OP_MODE_SUB | 4,
|
||||
CEPH_OSD_OP_SCRUB = CEPH_OSD_OP_MODE_SUB | 5,
|
||||
CEPH_OSD_OP_SCRUB_RESERVE = CEPH_OSD_OP_MODE_SUB | 6,
|
||||
CEPH_OSD_OP_SCRUB_UNRESERVE = CEPH_OSD_OP_MODE_SUB | 7,
|
||||
CEPH_OSD_OP_SCRUB_STOP = CEPH_OSD_OP_MODE_SUB | 8,
|
||||
CEPH_OSD_OP_SCRUB_MAP = CEPH_OSD_OP_MODE_SUB | 9,
|
||||
|
||||
/** lock **/
|
||||
CEPH_OSD_OP_WRLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 1,
|
||||
CEPH_OSD_OP_WRUNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 2,
|
||||
CEPH_OSD_OP_RDLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 3,
|
||||
CEPH_OSD_OP_RDUNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 4,
|
||||
CEPH_OSD_OP_UPLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 5,
|
||||
CEPH_OSD_OP_DNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 6,
|
||||
|
||||
/** exec **/
|
||||
/* note: the RD bit here is wrong; see special-case below in helper */
|
||||
CEPH_OSD_OP_CALL = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_EXEC | 1,
|
||||
|
||||
/** pg **/
|
||||
CEPH_OSD_OP_PGLS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 1,
|
||||
CEPH_OSD_OP_PGLS_FILTER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 2,
|
||||
#define GENERATE_ENUM_ENTRY(op, opcode, str) CEPH_OSD_OP_##op = (opcode),
|
||||
__CEPH_FORALL_OSD_OPS(GENERATE_ENUM_ENTRY)
|
||||
#undef GENERATE_ENUM_ENTRY
|
||||
};
|
||||
|
||||
static inline int ceph_osd_op_type_lock(int op)
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
struct cgroup_root;
|
||||
struct cgroup_subsys;
|
||||
struct inode;
|
||||
struct cgroup;
|
||||
|
||||
extern int cgroup_init_early(void);
|
||||
|
|
@ -38,7 +37,8 @@ extern void cgroup_exit(struct task_struct *p);
|
|||
extern int cgroupstats_build(struct cgroupstats *stats,
|
||||
struct dentry *dentry);
|
||||
|
||||
extern int proc_cgroup_show(struct seq_file *, void *);
|
||||
extern int proc_cgroup_show(struct seq_file *m, struct pid_namespace *ns,
|
||||
struct pid *pid, struct task_struct *tsk);
|
||||
|
||||
/* define the enumeration of all cgroup subsystems */
|
||||
#define SUBSYS(_x) _x ## _cgrp_id,
|
||||
|
|
@ -112,6 +112,19 @@ static inline void css_get(struct cgroup_subsys_state *css)
|
|||
percpu_ref_get(&css->refcnt);
|
||||
}
|
||||
|
||||
/**
|
||||
* css_get_many - obtain references on the specified css
|
||||
* @css: target css
|
||||
* @n: number of references to get
|
||||
*
|
||||
* The caller must already have a reference.
|
||||
*/
|
||||
static inline void css_get_many(struct cgroup_subsys_state *css, unsigned int n)
|
||||
{
|
||||
if (!(css->flags & CSS_NO_REF))
|
||||
percpu_ref_get_many(&css->refcnt, n);
|
||||
}
|
||||
|
||||
/**
|
||||
* css_tryget - try to obtain a reference on the specified css
|
||||
* @css: target css
|
||||
|
|
@ -159,13 +172,21 @@ static inline void css_put(struct cgroup_subsys_state *css)
|
|||
percpu_ref_put(&css->refcnt);
|
||||
}
|
||||
|
||||
/**
|
||||
* css_put_many - put css references
|
||||
* @css: target css
|
||||
* @n: number of references to put
|
||||
*
|
||||
* Put references obtained via css_get() and css_tryget_online().
|
||||
*/
|
||||
static inline void css_put_many(struct cgroup_subsys_state *css, unsigned int n)
|
||||
{
|
||||
if (!(css->flags & CSS_NO_REF))
|
||||
percpu_ref_put_many(&css->refcnt, n);
|
||||
}
|
||||
|
||||
/* bits in struct cgroup flags field */
|
||||
enum {
|
||||
/*
|
||||
* Control Group has previously had a child cgroup or a task,
|
||||
* but no longer (only if CGRP_NOTIFY_ON_RELEASE is set)
|
||||
*/
|
||||
CGRP_RELEASABLE,
|
||||
/* Control Group requires release notifications to userspace */
|
||||
CGRP_NOTIFY_ON_RELEASE,
|
||||
/*
|
||||
|
|
@ -234,13 +255,6 @@ struct cgroup {
|
|||
*/
|
||||
struct list_head e_csets[CGROUP_SUBSYS_COUNT];
|
||||
|
||||
/*
|
||||
* Linked list running through all cgroups that can
|
||||
* potentially be reaped by the release agent. Protected by
|
||||
* release_list_lock
|
||||
*/
|
||||
struct list_head release_list;
|
||||
|
||||
/*
|
||||
* list of pidlists, up to two for each namespace (one for procs, one
|
||||
* for tasks); created on demand.
|
||||
|
|
@ -250,6 +264,9 @@ struct cgroup {
|
|||
|
||||
/* used to wait for offlining of csses */
|
||||
wait_queue_head_t offline_waitq;
|
||||
|
||||
/* used to schedule release agent */
|
||||
struct work_struct release_agent_work;
|
||||
};
|
||||
|
||||
#define MAX_CGROUP_ROOT_NAMELEN 64
|
||||
|
|
@ -376,8 +393,8 @@ struct css_set {
|
|||
* struct cftype: handler definitions for cgroup control files
|
||||
*
|
||||
* When reading/writing to a file:
|
||||
* - the cgroup to use is file->f_dentry->d_parent->d_fsdata
|
||||
* - the 'cftype' of the file is file->f_dentry->d_fsdata
|
||||
* - the cgroup to use is file->f_path.dentry->d_parent->d_fsdata
|
||||
* - the 'cftype' of the file is file->f_path.dentry->d_fsdata
|
||||
*/
|
||||
|
||||
/* cftype->flags */
|
||||
|
|
@ -536,13 +553,10 @@ static inline bool cgroup_has_tasks(struct cgroup *cgrp)
|
|||
return !list_empty(&cgrp->cset_links);
|
||||
}
|
||||
|
||||
/* returns ino associated with a cgroup, 0 indicates unmounted root */
|
||||
/* returns ino associated with a cgroup */
|
||||
static inline ino_t cgroup_ino(struct cgroup *cgrp)
|
||||
{
|
||||
if (cgrp->kn)
|
||||
return cgrp->kn->ino;
|
||||
else
|
||||
return 0;
|
||||
return cgrp->kn->ino;
|
||||
}
|
||||
|
||||
/* cft/css accessors for cftype->write() operation */
|
||||
|
|
@ -624,8 +638,10 @@ struct cgroup_subsys {
|
|||
struct cgroup_subsys_state *(*css_alloc)(struct cgroup_subsys_state *parent_css);
|
||||
int (*css_online)(struct cgroup_subsys_state *css);
|
||||
void (*css_offline)(struct cgroup_subsys_state *css);
|
||||
void (*css_released)(struct cgroup_subsys_state *css);
|
||||
void (*css_free)(struct cgroup_subsys_state *css);
|
||||
void (*css_reset)(struct cgroup_subsys_state *css);
|
||||
void (*css_e_css_changed)(struct cgroup_subsys_state *css);
|
||||
|
||||
int (*can_attach)(struct cgroup_subsys_state *css,
|
||||
struct cgroup_taskset *tset);
|
||||
|
|
@ -920,6 +936,8 @@ void css_task_iter_end(struct css_task_iter *it);
|
|||
int cgroup_attach_task_all(struct task_struct *from, struct task_struct *);
|
||||
int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from);
|
||||
|
||||
struct cgroup_subsys_state *cgroup_get_e_css(struct cgroup *cgroup,
|
||||
struct cgroup_subsys *ss);
|
||||
struct cgroup_subsys_state *css_tryget_online_from_dir(struct dentry *dentry,
|
||||
struct cgroup_subsys *ss);
|
||||
|
||||
|
|
|
|||
|
|
@ -46,8 +46,10 @@ struct clk {
|
|||
unsigned int enable_count;
|
||||
unsigned int prepare_count;
|
||||
unsigned long accuracy;
|
||||
int phase;
|
||||
struct hlist_head children;
|
||||
struct hlist_node child_node;
|
||||
struct hlist_node debug_node;
|
||||
unsigned int notifier_count;
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *dentry;
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#ifdef CONFIG_COMMON_CLK
|
||||
|
||||
|
|
@ -129,6 +130,14 @@ struct dentry;
|
|||
* set then clock accuracy will be initialized to parent accuracy
|
||||
* or 0 (perfect clock) if clock has no parent.
|
||||
*
|
||||
* @get_phase: Queries the hardware to get the current phase of a clock.
|
||||
* Returned values are 0-359 degrees on success, negative
|
||||
* error codes on failure.
|
||||
*
|
||||
* @set_phase: Shift the phase this clock signal in degrees specified
|
||||
* by the second argument. Valid values for degrees are
|
||||
* 0-359. Return 0 on success, otherwise -EERROR.
|
||||
*
|
||||
* @init: Perform platform-specific initialization magic.
|
||||
* This is not not used by any of the basic clock types.
|
||||
* Please consider other ways of solving initialization problems
|
||||
|
|
@ -167,7 +176,7 @@ struct clk_ops {
|
|||
unsigned long *parent_rate);
|
||||
long (*determine_rate)(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *best_parent_rate,
|
||||
struct clk **best_parent_clk);
|
||||
struct clk_hw **best_parent_hw);
|
||||
int (*set_parent)(struct clk_hw *hw, u8 index);
|
||||
u8 (*get_parent)(struct clk_hw *hw);
|
||||
int (*set_rate)(struct clk_hw *hw, unsigned long rate,
|
||||
|
|
@ -177,6 +186,8 @@ struct clk_ops {
|
|||
unsigned long parent_rate, u8 index);
|
||||
unsigned long (*recalc_accuracy)(struct clk_hw *hw,
|
||||
unsigned long parent_accuracy);
|
||||
int (*get_phase)(struct clk_hw *hw);
|
||||
int (*set_phase)(struct clk_hw *hw, int degrees);
|
||||
void (*init)(struct clk_hw *hw);
|
||||
int (*debug_init)(struct clk_hw *hw, struct dentry *dentry);
|
||||
};
|
||||
|
|
@ -341,7 +352,6 @@ struct clk_divider {
|
|||
#define CLK_DIVIDER_READ_ONLY BIT(5)
|
||||
|
||||
extern const struct clk_ops clk_divider_ops;
|
||||
extern const struct clk_ops clk_divider_ro_ops;
|
||||
struct clk *clk_register_divider(struct device *dev, const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
void __iomem *reg, u8 shift, u8 width,
|
||||
|
|
@ -488,6 +498,28 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
|
|||
struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
|
||||
unsigned long flags);
|
||||
|
||||
/***
|
||||
* struct clk_gpio_gate - gpio gated clock
|
||||
*
|
||||
* @hw: handle between common and hardware-specific interfaces
|
||||
* @gpiod: gpio descriptor
|
||||
*
|
||||
* Clock with a gpio control for enabling and disabling the parent clock.
|
||||
* Implements .enable, .disable and .is_enabled
|
||||
*/
|
||||
|
||||
struct clk_gpio {
|
||||
struct clk_hw hw;
|
||||
struct gpio_desc *gpiod;
|
||||
};
|
||||
|
||||
extern const struct clk_ops clk_gpio_gate_ops;
|
||||
struct clk *clk_register_gpio_gate(struct device *dev, const char *name,
|
||||
const char *parent_name, struct gpio_desc *gpio,
|
||||
unsigned long flags);
|
||||
|
||||
void of_gpio_clk_gate_setup(struct device_node *node);
|
||||
|
||||
/**
|
||||
* clk_register - allocate a new clock, register it and return an opaque cookie
|
||||
* @dev: device that is registering this clock
|
||||
|
|
@ -512,16 +544,14 @@ u8 __clk_get_num_parents(struct clk *clk);
|
|||
struct clk *__clk_get_parent(struct clk *clk);
|
||||
struct clk *clk_get_parent_by_index(struct clk *clk, u8 index);
|
||||
unsigned int __clk_get_enable_count(struct clk *clk);
|
||||
unsigned int __clk_get_prepare_count(struct clk *clk);
|
||||
unsigned long __clk_get_rate(struct clk *clk);
|
||||
unsigned long __clk_get_accuracy(struct clk *clk);
|
||||
unsigned long __clk_get_flags(struct clk *clk);
|
||||
bool __clk_is_prepared(struct clk *clk);
|
||||
bool __clk_is_enabled(struct clk *clk);
|
||||
struct clk *__clk_lookup(const char *name);
|
||||
long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *best_parent_rate,
|
||||
struct clk **best_parent_p);
|
||||
struct clk_hw **best_parent_p);
|
||||
|
||||
/*
|
||||
* FIXME clock api without lock protection
|
||||
|
|
@ -620,7 +650,7 @@ static inline void clk_writel(u32 val, u32 __iomem *reg)
|
|||
#endif /* platform dependent I/O accessors */
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *clk_debugfs_add_file(struct clk *clk, char *name, umode_t mode,
|
||||
struct dentry *clk_debugfs_add_file(struct clk_hw *hw, char *name, umode_t mode,
|
||||
void *data, const struct file_operations *fops);
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -106,6 +106,25 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);
|
|||
*/
|
||||
long clk_get_accuracy(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_set_phase - adjust the phase shift of a clock signal
|
||||
* @clk: clock signal source
|
||||
* @degrees: number of degrees the signal is shifted
|
||||
*
|
||||
* Shifts the phase of a clock signal by the specified degrees. Returns 0 on
|
||||
* success, -EERROR otherwise.
|
||||
*/
|
||||
int clk_set_phase(struct clk *clk, int degrees);
|
||||
|
||||
/**
|
||||
* clk_get_phase - return the phase shift of a clock signal
|
||||
* @clk: clock signal source
|
||||
*
|
||||
* Returns the phase shift of a clock node in degrees, otherwise returns
|
||||
* -EERROR.
|
||||
*/
|
||||
int clk_get_phase(struct clk *clk);
|
||||
|
||||
#else
|
||||
|
||||
static inline long clk_get_accuracy(struct clk *clk)
|
||||
|
|
@ -113,6 +132,16 @@ static inline long clk_get_accuracy(struct clk *clk)
|
|||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline long clk_set_phase(struct clk *clk, int phase)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline long clk_get_phase(struct clk *clk)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
@ -238,7 +267,7 @@ void clk_put(struct clk *clk);
|
|||
|
||||
/**
|
||||
* devm_clk_put - "free" a managed clock source
|
||||
* @dev: device used to acuqire the clock
|
||||
* @dev: device used to acquire the clock
|
||||
* @clk: clock source acquired with devm_clk_get()
|
||||
*
|
||||
* Note: drivers must ensure that all clk_enable calls made on this
|
||||
|
|
|
|||
|
|
@ -125,6 +125,7 @@ extern void __iomem *at91_pmc_base;
|
|||
#define AT91_PMC_PLLADIV2 (1 << 12) /* PLLA divisor by 2 [some SAM9 only] */
|
||||
#define AT91_PMC_PLLADIV2_OFF (0 << 12)
|
||||
#define AT91_PMC_PLLADIV2_ON (1 << 12)
|
||||
#define AT91_PMC_H32MXDIV BIT(24)
|
||||
|
||||
#define AT91_PMC_USB 0x38 /* USB Clock Register [some SAM9 only] */
|
||||
#define AT91_PMC_USBS (0x1 << 0) /* USB OHCI Input clock selection */
|
||||
|
|
|
|||
|
|
@ -254,13 +254,26 @@ extern const struct clk_ops ti_clk_mux_ops;
|
|||
void omap2_init_clk_hw_omap_clocks(struct clk *clk);
|
||||
int omap3_noncore_dpll_enable(struct clk_hw *hw);
|
||||
void omap3_noncore_dpll_disable(struct clk_hw *hw);
|
||||
int omap3_noncore_dpll_set_parent(struct clk_hw *hw, u8 index);
|
||||
int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate);
|
||||
int omap3_noncore_dpll_set_rate_and_parent(struct clk_hw *hw,
|
||||
unsigned long rate,
|
||||
unsigned long parent_rate,
|
||||
u8 index);
|
||||
long omap3_noncore_dpll_determine_rate(struct clk_hw *hw,
|
||||
unsigned long rate,
|
||||
unsigned long *best_parent_rate,
|
||||
struct clk_hw **best_parent_clk);
|
||||
unsigned long omap4_dpll_regm4xen_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate);
|
||||
long omap4_dpll_regm4xen_round_rate(struct clk_hw *hw,
|
||||
unsigned long target_rate,
|
||||
unsigned long *parent_rate);
|
||||
long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw,
|
||||
unsigned long rate,
|
||||
unsigned long *best_parent_rate,
|
||||
struct clk_hw **best_parent_clk);
|
||||
u8 omap2_init_dpll_parent(struct clk_hw *hw);
|
||||
unsigned long omap3_dpll_recalc(struct clk_hw *hw, unsigned long parent_rate);
|
||||
long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate,
|
||||
|
|
@ -278,6 +291,8 @@ int omap2_clk_disable_autoidle_all(void);
|
|||
void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks);
|
||||
int omap3_dpll4_set_rate(struct clk_hw *clk, unsigned long rate,
|
||||
unsigned long parent_rate);
|
||||
int omap3_dpll4_set_rate_and_parent(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate, u8 index);
|
||||
int omap2_dflt_clk_enable(struct clk_hw *hw);
|
||||
void omap2_dflt_clk_disable(struct clk_hw *hw);
|
||||
int omap2_dflt_clk_is_enabled(struct clk_hw *hw);
|
||||
|
|
@ -292,6 +307,7 @@ void omap2xxx_clkt_vps_init(void);
|
|||
void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index);
|
||||
void ti_dt_clocks_register(struct ti_dt_clk *oclks);
|
||||
void ti_dt_clk_init_provider(struct device_node *np, int index);
|
||||
void ti_dt_clk_init_retry_clks(void);
|
||||
void ti_dt_clockdomains_setup(void);
|
||||
int ti_clk_retry_init(struct device_node *node, struct clk_hw *hw,
|
||||
ti_of_clk_init_cb_t func);
|
||||
|
|
|
|||
65
include/linux/clock_cooling.h
Normal file
65
include/linux/clock_cooling.h
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* linux/include/linux/clock_cooling.h
|
||||
*
|
||||
* Copyright (C) 2014 Eduardo Valentin <edubezval@gmail.com>
|
||||
*
|
||||
* Copyright (C) 2013 Texas Instruments Inc.
|
||||
* Contact: Eduardo Valentin <eduardo.valentin@ti.com>
|
||||
*
|
||||
* Highly based on cpu_cooling.c.
|
||||
* Copyright (C) 2012 Samsung Electronics Co., Ltd(http://www.samsung.com)
|
||||
* Copyright (C) 2012 Amit Daniel <amit.kachhap@linaro.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __CPU_COOLING_H__
|
||||
#define __CPU_COOLING_H__
|
||||
|
||||
#include <linux/of.h>
|
||||
#include <linux/thermal.h>
|
||||
#include <linux/cpumask.h>
|
||||
|
||||
#ifdef CONFIG_CLOCK_THERMAL
|
||||
/**
|
||||
* clock_cooling_register - function to create clock cooling device.
|
||||
* @dev: struct device pointer to the device used as clock cooling device.
|
||||
* @clock_name: string containing the clock used as cooling mechanism.
|
||||
*/
|
||||
struct thermal_cooling_device *
|
||||
clock_cooling_register(struct device *dev, const char *clock_name);
|
||||
|
||||
/**
|
||||
* clock_cooling_unregister - function to remove clock cooling device.
|
||||
* @cdev: thermal cooling device pointer.
|
||||
*/
|
||||
void clock_cooling_unregister(struct thermal_cooling_device *cdev);
|
||||
|
||||
unsigned long clock_cooling_get_level(struct thermal_cooling_device *cdev,
|
||||
unsigned long freq);
|
||||
#else /* !CONFIG_CLOCK_THERMAL */
|
||||
static inline struct thermal_cooling_device *
|
||||
clock_cooling_register(struct device *dev, const char *clock_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline
|
||||
void clock_cooling_unregister(struct thermal_cooling_device *cdev)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
unsigned long clock_cooling_get_level(struct thermal_cooling_device *cdev,
|
||||
unsigned long freq)
|
||||
{
|
||||
return THERMAL_CSTATE_INVALID;
|
||||
}
|
||||
#endif /* CONFIG_CLOCK_THERMAL */
|
||||
|
||||
#endif /* __CPU_COOLING_H__ */
|
||||
|
|
@ -287,7 +287,7 @@ extern struct clocksource* clocksource_get_next(void);
|
|||
extern void clocksource_change_rating(struct clocksource *cs, int rating);
|
||||
extern void clocksource_suspend(void);
|
||||
extern void clocksource_resume(void);
|
||||
extern struct clocksource * __init __weak clocksource_default_clock(void);
|
||||
extern struct clocksource * __init clocksource_default_clock(void);
|
||||
extern void clocksource_mark_unstable(struct clocksource *cs);
|
||||
|
||||
extern u64
|
||||
|
|
|
|||
|
|
@ -15,13 +15,17 @@
|
|||
|
||||
struct cma;
|
||||
|
||||
extern unsigned long totalcma_pages;
|
||||
extern phys_addr_t cma_get_base(struct cma *cma);
|
||||
extern unsigned long cma_get_size(struct cma *cma);
|
||||
|
||||
extern int __init cma_declare_contiguous(phys_addr_t size,
|
||||
phys_addr_t base, phys_addr_t limit,
|
||||
extern int __init cma_declare_contiguous(phys_addr_t base,
|
||||
phys_addr_t size, phys_addr_t limit,
|
||||
phys_addr_t alignment, unsigned int order_per_bit,
|
||||
bool fixed, struct cma **res_cma);
|
||||
extern int cma_init_reserved_mem(phys_addr_t base,
|
||||
phys_addr_t size, int order_per_bit,
|
||||
struct cma **res_cma);
|
||||
extern struct page *cma_alloc(struct cma *cma, int count, unsigned int align);
|
||||
extern bool cma_release(struct cma *cma, struct page *pages, int count);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -41,6 +41,35 @@ extern const struct net_device_ops com20020_netdev_ops;
|
|||
#define BUS_ALIGN 1
|
||||
#endif
|
||||
|
||||
#define PLX_PCI_MAX_CARDS 2
|
||||
|
||||
struct com20020_pci_channel_map {
|
||||
u32 bar;
|
||||
u32 offset;
|
||||
u32 size; /* 0x00 - auto, e.g. length of entire bar */
|
||||
};
|
||||
|
||||
struct com20020_pci_card_info {
|
||||
const char *name;
|
||||
int devcount;
|
||||
|
||||
struct com20020_pci_channel_map chan_map_tbl[PLX_PCI_MAX_CARDS];
|
||||
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
struct com20020_priv {
|
||||
struct com20020_pci_card_info *ci;
|
||||
struct list_head list_dev;
|
||||
};
|
||||
|
||||
struct com20020_dev {
|
||||
struct list_head list;
|
||||
struct net_device *dev;
|
||||
|
||||
struct com20020_priv *pci_priv;
|
||||
int index;
|
||||
};
|
||||
|
||||
#define _INTMASK (ioaddr+BUS_ALIGN*0) /* writable */
|
||||
#define _STATUS (ioaddr+BUS_ALIGN*0) /* readable */
|
||||
|
|
|
|||
|
|
@ -2,14 +2,24 @@
|
|||
#define _LINUX_COMPACTION_H
|
||||
|
||||
/* Return values for compact_zone() and try_to_compact_pages() */
|
||||
/* compaction didn't start as it was deferred due to past failures */
|
||||
#define COMPACT_DEFERRED 0
|
||||
/* compaction didn't start as it was not possible or direct reclaim was more suitable */
|
||||
#define COMPACT_SKIPPED 0
|
||||
#define COMPACT_SKIPPED 1
|
||||
/* compaction should continue to another pageblock */
|
||||
#define COMPACT_CONTINUE 1
|
||||
#define COMPACT_CONTINUE 2
|
||||
/* direct compaction partially compacted a zone and there are suitable pages */
|
||||
#define COMPACT_PARTIAL 2
|
||||
#define COMPACT_PARTIAL 3
|
||||
/* The full zone was compacted */
|
||||
#define COMPACT_COMPLETE 3
|
||||
#define COMPACT_COMPLETE 4
|
||||
|
||||
/* Used to signal whether compaction detected need_sched() or lock contention */
|
||||
/* No contention detected */
|
||||
#define COMPACT_CONTENDED_NONE 0
|
||||
/* Either need_sched() was true or fatal signal pending */
|
||||
#define COMPACT_CONTENDED_SCHED 1
|
||||
/* Zone lock or lru_lock was contended in async compaction */
|
||||
#define COMPACT_CONTENDED_LOCK 2
|
||||
|
||||
#ifdef CONFIG_COMPACTION
|
||||
extern int sysctl_compact_memory;
|
||||
|
|
@ -22,10 +32,12 @@ extern int sysctl_extfrag_handler(struct ctl_table *table, int write,
|
|||
extern int fragmentation_index(struct zone *zone, unsigned int order);
|
||||
extern unsigned long try_to_compact_pages(struct zonelist *zonelist,
|
||||
int order, gfp_t gfp_mask, nodemask_t *mask,
|
||||
enum migrate_mode mode, bool *contended);
|
||||
enum migrate_mode mode, int *contended,
|
||||
int alloc_flags, int classzone_idx);
|
||||
extern void compact_pgdat(pg_data_t *pgdat, int order);
|
||||
extern void reset_isolation_suitable(pg_data_t *pgdat);
|
||||
extern unsigned long compaction_suitable(struct zone *zone, int order);
|
||||
extern unsigned long compaction_suitable(struct zone *zone, int order,
|
||||
int alloc_flags, int classzone_idx);
|
||||
|
||||
/* Do not skip compaction more than 64 times */
|
||||
#define COMPACT_MAX_DEFER_SHIFT 6
|
||||
|
|
@ -91,7 +103,8 @@ static inline bool compaction_restarting(struct zone *zone, int order)
|
|||
#else
|
||||
static inline unsigned long try_to_compact_pages(struct zonelist *zonelist,
|
||||
int order, gfp_t gfp_mask, nodemask_t *nodemask,
|
||||
enum migrate_mode mode, bool *contended)
|
||||
enum migrate_mode mode, int *contended,
|
||||
int alloc_flags, int classzone_idx)
|
||||
{
|
||||
return COMPACT_CONTINUE;
|
||||
}
|
||||
|
|
@ -104,7 +117,8 @@ static inline void reset_isolation_suitable(pg_data_t *pgdat)
|
|||
{
|
||||
}
|
||||
|
||||
static inline unsigned long compaction_suitable(struct zone *zone, int order)
|
||||
static inline unsigned long compaction_suitable(struct zone *zone, int order,
|
||||
int alloc_flags, int classzone_idx)
|
||||
{
|
||||
return COMPACT_SKIPPED;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -357,6 +357,9 @@ asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int);
|
|||
|
||||
asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
|
||||
const compat_uptr_t __user *envp);
|
||||
asmlinkage long compat_sys_execveat(int dfd, const char __user *filename,
|
||||
const compat_uptr_t __user *argv,
|
||||
const compat_uptr_t __user *envp, int flags);
|
||||
|
||||
asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
|
||||
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
||||
|
|
|
|||
|
|
@ -71,7 +71,6 @@
|
|||
* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||
*
|
||||
* Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||
* Fixed in GCC 4.8.2 and later versions.
|
||||
*
|
||||
* (asm goto is automatically volatile - the naming reflects this.)
|
||||
*/
|
||||
|
|
|
|||
65
include/linux/compiler-gcc5.h
Normal file
65
include/linux/compiler-gcc5.h
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
#ifndef __LINUX_COMPILER_H
|
||||
#error "Please don't include <linux/compiler-gcc5.h> directly, include <linux/compiler.h> instead."
|
||||
#endif
|
||||
|
||||
#define __used __attribute__((__used__))
|
||||
#define __must_check __attribute__((warn_unused_result))
|
||||
#define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
|
||||
|
||||
/* Mark functions as cold. gcc will assume any path leading to a call
|
||||
to them will be unlikely. This means a lot of manual unlikely()s
|
||||
are unnecessary now for any paths leading to the usual suspects
|
||||
like BUG(), printk(), panic() etc. [but let's keep them for now for
|
||||
older compilers]
|
||||
|
||||
Early snapshots of gcc 4.3 don't support this and we can't detect this
|
||||
in the preprocessor, but we can live with this because they're unreleased.
|
||||
Maketime probing would be overkill here.
|
||||
|
||||
gcc also has a __attribute__((__hot__)) to move hot functions into
|
||||
a special section, but I don't see any sense in this right now in
|
||||
the kernel context */
|
||||
#define __cold __attribute__((__cold__))
|
||||
|
||||
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||
|
||||
#ifndef __CHECKER__
|
||||
# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||
# define __compiletime_error(message) __attribute__((error(message)))
|
||||
#endif /* __CHECKER__ */
|
||||
|
||||
/*
|
||||
* Mark a position in code as unreachable. This can be used to
|
||||
* suppress control flow warnings after asm blocks that transfer
|
||||
* control elsewhere.
|
||||
*
|
||||
* Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||
* this in the preprocessor, but we can live with this because they're
|
||||
* unreleased. Really, we need to have autoconf for the kernel.
|
||||
*/
|
||||
#define unreachable() __builtin_unreachable()
|
||||
|
||||
/* Mark a function definition as prohibited from being cloned. */
|
||||
#define __noclone __attribute__((__noclone__))
|
||||
|
||||
/*
|
||||
* Tell the optimizer that something else uses this function or variable.
|
||||
*/
|
||||
#define __visible __attribute__((externally_visible))
|
||||
|
||||
/*
|
||||
* GCC 'asm goto' miscompiles certain code sequences:
|
||||
*
|
||||
* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||
*
|
||||
* Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||
*
|
||||
* (asm goto is automatically volatile - the naming reflects this.)
|
||||
*/
|
||||
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||
|
||||
#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||
#define __HAVE_BUILTIN_BSWAP32__
|
||||
#define __HAVE_BUILTIN_BSWAP64__
|
||||
#define __HAVE_BUILTIN_BSWAP16__
|
||||
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||
|
|
@ -186,6 +186,80 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
|||
# define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__)
|
||||
#endif
|
||||
|
||||
#include <uapi/linux/types.h>
|
||||
|
||||
static __always_inline void data_access_exceeds_word_size(void)
|
||||
#ifdef __compiletime_warning
|
||||
__compiletime_warning("data access exceeds word size and won't be atomic")
|
||||
#endif
|
||||
;
|
||||
|
||||
static __always_inline void data_access_exceeds_word_size(void)
|
||||
{
|
||||
}
|
||||
|
||||
static __always_inline void __read_once_size(volatile void *p, void *res, int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1: *(__u8 *)res = *(volatile __u8 *)p; break;
|
||||
case 2: *(__u16 *)res = *(volatile __u16 *)p; break;
|
||||
case 4: *(__u32 *)res = *(volatile __u32 *)p; break;
|
||||
#ifdef CONFIG_64BIT
|
||||
case 8: *(__u64 *)res = *(volatile __u64 *)p; break;
|
||||
#endif
|
||||
default:
|
||||
barrier();
|
||||
__builtin_memcpy((void *)res, (const void *)p, size);
|
||||
data_access_exceeds_word_size();
|
||||
barrier();
|
||||
}
|
||||
}
|
||||
|
||||
static __always_inline void __assign_once_size(volatile void *p, void *res, int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
|
||||
case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
|
||||
case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
|
||||
#ifdef CONFIG_64BIT
|
||||
case 8: *(volatile __u64 *)p = *(__u64 *)res; break;
|
||||
#endif
|
||||
default:
|
||||
barrier();
|
||||
__builtin_memcpy((void *)p, (const void *)res, size);
|
||||
data_access_exceeds_word_size();
|
||||
barrier();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Prevent the compiler from merging or refetching reads or writes. The
|
||||
* compiler is also forbidden from reordering successive instances of
|
||||
* READ_ONCE, ASSIGN_ONCE and ACCESS_ONCE (see below), but only when the
|
||||
* compiler is aware of some particular ordering. One way to make the
|
||||
* compiler aware of ordering is to put the two invocations of READ_ONCE,
|
||||
* ASSIGN_ONCE or ACCESS_ONCE() in different C statements.
|
||||
*
|
||||
* In contrast to ACCESS_ONCE these two macros will also work on aggregate
|
||||
* data types like structs or unions. If the size of the accessed data
|
||||
* type exceeds the word size of the machine (e.g., 32 bits or 64 bits)
|
||||
* READ_ONCE() and ASSIGN_ONCE() will fall back to memcpy and print a
|
||||
* compile-time warning.
|
||||
*
|
||||
* Their two major use cases are: (1) Mediating communication between
|
||||
* process-level code and irq/NMI handlers, all running on the same CPU,
|
||||
* and (2) Ensuring that the compiler does not fold, spindle, or otherwise
|
||||
* mutilate accesses that either do not require ordering or that interact
|
||||
* with an explicit memory barrier or atomic instruction that provides the
|
||||
* required ordering.
|
||||
*/
|
||||
|
||||
#define READ_ONCE(x) \
|
||||
({ typeof(x) __val; __read_once_size(&x, &__val, sizeof(__val)); __val; })
|
||||
|
||||
#define ASSIGN_ONCE(val, x) \
|
||||
({ typeof(x) __val; __val = val; __assign_once_size(&x, &__val, sizeof(__val)); __val; })
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
|
|
|||
263
include/linux/coresight.h
Normal file
263
include/linux/coresight.h
Normal file
|
|
@ -0,0 +1,263 @@
|
|||
/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
* only version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_CORESIGHT_H
|
||||
#define _LINUX_CORESIGHT_H
|
||||
|
||||
#include <linux/device.h>
|
||||
|
||||
/* Peripheral id registers (0xFD0-0xFEC) */
|
||||
#define CORESIGHT_PERIPHIDR4 0xfd0
|
||||
#define CORESIGHT_PERIPHIDR5 0xfd4
|
||||
#define CORESIGHT_PERIPHIDR6 0xfd8
|
||||
#define CORESIGHT_PERIPHIDR7 0xfdC
|
||||
#define CORESIGHT_PERIPHIDR0 0xfe0
|
||||
#define CORESIGHT_PERIPHIDR1 0xfe4
|
||||
#define CORESIGHT_PERIPHIDR2 0xfe8
|
||||
#define CORESIGHT_PERIPHIDR3 0xfeC
|
||||
/* Component id registers (0xFF0-0xFFC) */
|
||||
#define CORESIGHT_COMPIDR0 0xff0
|
||||
#define CORESIGHT_COMPIDR1 0xff4
|
||||
#define CORESIGHT_COMPIDR2 0xff8
|
||||
#define CORESIGHT_COMPIDR3 0xffC
|
||||
|
||||
#define ETM_ARCH_V3_3 0x23
|
||||
#define ETM_ARCH_V3_5 0x25
|
||||
#define PFT_ARCH_V1_0 0x30
|
||||
#define PFT_ARCH_V1_1 0x31
|
||||
|
||||
#define CORESIGHT_UNLOCK 0xc5acce55
|
||||
|
||||
extern struct bus_type coresight_bustype;
|
||||
|
||||
enum coresight_dev_type {
|
||||
CORESIGHT_DEV_TYPE_NONE,
|
||||
CORESIGHT_DEV_TYPE_SINK,
|
||||
CORESIGHT_DEV_TYPE_LINK,
|
||||
CORESIGHT_DEV_TYPE_LINKSINK,
|
||||
CORESIGHT_DEV_TYPE_SOURCE,
|
||||
};
|
||||
|
||||
enum coresight_dev_subtype_sink {
|
||||
CORESIGHT_DEV_SUBTYPE_SINK_NONE,
|
||||
CORESIGHT_DEV_SUBTYPE_SINK_PORT,
|
||||
CORESIGHT_DEV_SUBTYPE_SINK_BUFFER,
|
||||
};
|
||||
|
||||
enum coresight_dev_subtype_link {
|
||||
CORESIGHT_DEV_SUBTYPE_LINK_NONE,
|
||||
CORESIGHT_DEV_SUBTYPE_LINK_MERG,
|
||||
CORESIGHT_DEV_SUBTYPE_LINK_SPLIT,
|
||||
CORESIGHT_DEV_SUBTYPE_LINK_FIFO,
|
||||
};
|
||||
|
||||
enum coresight_dev_subtype_source {
|
||||
CORESIGHT_DEV_SUBTYPE_SOURCE_NONE,
|
||||
CORESIGHT_DEV_SUBTYPE_SOURCE_PROC,
|
||||
CORESIGHT_DEV_SUBTYPE_SOURCE_BUS,
|
||||
CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_dev_subtype - further characterisation of a type
|
||||
* @sink_subtype: type of sink this component is, as defined
|
||||
by @coresight_dev_subtype_sink.
|
||||
* @link_subtype: type of link this component is, as defined
|
||||
by @coresight_dev_subtype_link.
|
||||
* @source_subtype: type of source this component is, as defined
|
||||
by @coresight_dev_subtype_source.
|
||||
*/
|
||||
struct coresight_dev_subtype {
|
||||
enum coresight_dev_subtype_sink sink_subtype;
|
||||
enum coresight_dev_subtype_link link_subtype;
|
||||
enum coresight_dev_subtype_source source_subtype;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_platform_data - data harvested from the DT specification
|
||||
* @cpu: the CPU a source belongs to. Only applicable for ETM/PTMs.
|
||||
* @name: name of the component as shown under sysfs.
|
||||
* @nr_inport: number of input ports for this component.
|
||||
* @outports: list of remote endpoint port number.
|
||||
* @child_names:name of all child components connected to this device.
|
||||
* @child_ports:child component port number the current component is
|
||||
connected to.
|
||||
* @nr_outport: number of output ports for this component.
|
||||
* @clk: The clock this component is associated to.
|
||||
*/
|
||||
struct coresight_platform_data {
|
||||
int cpu;
|
||||
const char *name;
|
||||
int nr_inport;
|
||||
int *outports;
|
||||
const char **child_names;
|
||||
int *child_ports;
|
||||
int nr_outport;
|
||||
struct clk *clk;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_desc - description of a component required from drivers
|
||||
* @type: as defined by @coresight_dev_type.
|
||||
* @subtype: as defined by @coresight_dev_subtype.
|
||||
* @ops: generic operations for this component, as defined
|
||||
by @coresight_ops.
|
||||
* @pdata: platform data collected from DT.
|
||||
* @dev: The device entity associated to this component.
|
||||
* @groups: operations specific to this component. These will end up
|
||||
in the component's sysfs sub-directory.
|
||||
*/
|
||||
struct coresight_desc {
|
||||
enum coresight_dev_type type;
|
||||
struct coresight_dev_subtype subtype;
|
||||
const struct coresight_ops *ops;
|
||||
struct coresight_platform_data *pdata;
|
||||
struct device *dev;
|
||||
const struct attribute_group **groups;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_connection - representation of a single connection
|
||||
* @outport: a connection's output port number.
|
||||
* @chid_name: remote component's name.
|
||||
* @child_port: remote component's port number @output is connected to.
|
||||
* @child_dev: a @coresight_device representation of the component
|
||||
connected to @outport.
|
||||
*/
|
||||
struct coresight_connection {
|
||||
int outport;
|
||||
const char *child_name;
|
||||
int child_port;
|
||||
struct coresight_device *child_dev;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_device - representation of a device as used by the framework
|
||||
* @conns: array of coresight_connections associated to this component.
|
||||
* @nr_inport: number of input port associated to this component.
|
||||
* @nr_outport: number of output port associated to this component.
|
||||
* @type: as defined by @coresight_dev_type.
|
||||
* @subtype: as defined by @coresight_dev_subtype.
|
||||
* @ops: generic operations for this component, as defined
|
||||
by @coresight_ops.
|
||||
* @dev: The device entity associated to this component.
|
||||
* @refcnt: keep track of what is in use.
|
||||
* @path_link: link of current component into the path being enabled.
|
||||
* @orphan: true if the component has connections that haven't been linked.
|
||||
* @enable: 'true' if component is currently part of an active path.
|
||||
* @activated: 'true' only if a _sink_ has been activated. A sink can be
|
||||
activated but not yet enabled. Enabling for a _sink_
|
||||
happens when a source has been selected for that it.
|
||||
*/
|
||||
struct coresight_device {
|
||||
struct coresight_connection *conns;
|
||||
int nr_inport;
|
||||
int nr_outport;
|
||||
enum coresight_dev_type type;
|
||||
struct coresight_dev_subtype subtype;
|
||||
const struct coresight_ops *ops;
|
||||
struct device dev;
|
||||
atomic_t *refcnt;
|
||||
struct list_head path_link;
|
||||
bool orphan;
|
||||
bool enable; /* true only if configured as part of a path */
|
||||
bool activated; /* true only if a sink is part of a path */
|
||||
};
|
||||
|
||||
#define to_coresight_device(d) container_of(d, struct coresight_device, dev)
|
||||
|
||||
#define source_ops(csdev) csdev->ops->source_ops
|
||||
#define sink_ops(csdev) csdev->ops->sink_ops
|
||||
#define link_ops(csdev) csdev->ops->link_ops
|
||||
|
||||
#define CORESIGHT_DEBUGFS_ENTRY(__name, __entry_name, \
|
||||
__mode, __get, __set, __fmt) \
|
||||
DEFINE_SIMPLE_ATTRIBUTE(__name ## _ops, __get, __set, __fmt); \
|
||||
static const struct coresight_ops_entry __name ## _entry = { \
|
||||
.name = __entry_name, \
|
||||
.mode = __mode, \
|
||||
.ops = &__name ## _ops \
|
||||
}
|
||||
|
||||
/**
|
||||
* struct coresight_ops_sink - basic operations for a sink
|
||||
* Operations available for sinks
|
||||
* @enable: enables the sink.
|
||||
* @disable: disables the sink.
|
||||
*/
|
||||
struct coresight_ops_sink {
|
||||
int (*enable)(struct coresight_device *csdev);
|
||||
void (*disable)(struct coresight_device *csdev);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_ops_link - basic operations for a link
|
||||
* Operations available for links.
|
||||
* @enable: enables flow between iport and oport.
|
||||
* @disable: disables flow between iport and oport.
|
||||
*/
|
||||
struct coresight_ops_link {
|
||||
int (*enable)(struct coresight_device *csdev, int iport, int oport);
|
||||
void (*disable)(struct coresight_device *csdev, int iport, int oport);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_ops_source - basic operations for a source
|
||||
* Operations available for sources.
|
||||
* @trace_id: returns the value of the component's trace ID as known
|
||||
to the HW.
|
||||
* @enable: enables tracing from a source.
|
||||
* @disable: disables tracing for a source.
|
||||
*/
|
||||
struct coresight_ops_source {
|
||||
int (*trace_id)(struct coresight_device *csdev);
|
||||
int (*enable)(struct coresight_device *csdev);
|
||||
void (*disable)(struct coresight_device *csdev);
|
||||
};
|
||||
|
||||
struct coresight_ops {
|
||||
const struct coresight_ops_sink *sink_ops;
|
||||
const struct coresight_ops_link *link_ops;
|
||||
const struct coresight_ops_source *source_ops;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CORESIGHT
|
||||
extern struct coresight_device *
|
||||
coresight_register(struct coresight_desc *desc);
|
||||
extern void coresight_unregister(struct coresight_device *csdev);
|
||||
extern int coresight_enable(struct coresight_device *csdev);
|
||||
extern void coresight_disable(struct coresight_device *csdev);
|
||||
extern int coresight_is_bit_set(u32 val, int position, int value);
|
||||
extern int coresight_timeout(void __iomem *addr, u32 offset,
|
||||
int position, int value);
|
||||
#ifdef CONFIG_OF
|
||||
extern struct coresight_platform_data *of_get_coresight_platform_data(
|
||||
struct device *dev, struct device_node *node);
|
||||
#endif
|
||||
#else
|
||||
static inline struct coresight_device *
|
||||
coresight_register(struct coresight_desc *desc) { return NULL; }
|
||||
static inline void coresight_unregister(struct coresight_device *csdev) {}
|
||||
static inline int
|
||||
coresight_enable(struct coresight_device *csdev) { return -ENOSYS; }
|
||||
static inline void coresight_disable(struct coresight_device *csdev) {}
|
||||
static inline int coresight_is_bit_set(u32 val, int position, int value)
|
||||
{ return 0; }
|
||||
static inline int coresight_timeout(void __iomem *addr, u32 offset,
|
||||
int position, int value) { return 1; }
|
||||
#ifdef CONFIG_OF
|
||||
static inline struct coresight_platform_data *of_get_coresight_platform_data(
|
||||
struct device *dev, struct device_node *node) { return NULL; }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
struct device;
|
||||
struct device_node;
|
||||
struct attribute_group;
|
||||
|
||||
struct cpu {
|
||||
int node_id; /* The node which contains the CPU */
|
||||
|
|
@ -39,6 +40,9 @@ extern void cpu_remove_dev_attr(struct device_attribute *attr);
|
|||
extern int cpu_add_dev_attr_group(struct attribute_group *attrs);
|
||||
extern void cpu_remove_dev_attr_group(struct attribute_group *attrs);
|
||||
|
||||
extern struct device *cpu_device_create(struct device *parent, void *drvdata,
|
||||
const struct attribute_group **groups,
|
||||
const char *fmt, ...);
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
extern void unregister_cpu(struct cpu *cpu);
|
||||
extern ssize_t arch_cpu_probe(const char *, size_t);
|
||||
|
|
@ -213,6 +217,7 @@ extern struct bus_type cpu_subsys;
|
|||
extern void cpu_hotplug_begin(void);
|
||||
extern void cpu_hotplug_done(void);
|
||||
extern void get_online_cpus(void);
|
||||
extern bool try_get_online_cpus(void);
|
||||
extern void put_online_cpus(void);
|
||||
extern void cpu_hotplug_disable(void);
|
||||
extern void cpu_hotplug_enable(void);
|
||||
|
|
@ -230,6 +235,7 @@ int cpu_down(unsigned int cpu);
|
|||
static inline void cpu_hotplug_begin(void) {}
|
||||
static inline void cpu_hotplug_done(void) {}
|
||||
#define get_online_cpus() do { } while (0)
|
||||
#define try_get_online_cpus() true
|
||||
#define put_online_cpus() do { } while (0)
|
||||
#define cpu_hotplug_disable() do { } while (0)
|
||||
#define cpu_hotplug_enable() do { } while (0)
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ static inline struct thermal_cooling_device *
|
|||
of_cpufreq_cooling_register(struct device_node *np,
|
||||
const struct cpumask *clip_cpus)
|
||||
{
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -65,13 +65,13 @@ unsigned long cpufreq_cooling_get_level(unsigned int cpu, unsigned int freq);
|
|||
static inline struct thermal_cooling_device *
|
||||
cpufreq_cooling_register(const struct cpumask *clip_cpus)
|
||||
{
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
static inline struct thermal_cooling_device *
|
||||
of_cpufreq_cooling_register(struct device_node *np,
|
||||
const struct cpumask *clip_cpus)
|
||||
{
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
static inline
|
||||
void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev)
|
||||
|
|
|
|||
22
include/linux/cpufreq-dt.h
Normal file
22
include/linux/cpufreq-dt.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Marvell
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __CPUFREQ_DT_H__
|
||||
#define __CPUFREQ_DT_H__
|
||||
|
||||
struct cpufreq_dt_platform_data {
|
||||
/*
|
||||
* True when each CPU has its own clock to control its
|
||||
* frequency, false when all CPUs are controlled by a single
|
||||
* clock.
|
||||
*/
|
||||
bool independent_clocks;
|
||||
};
|
||||
|
||||
#endif /* __CPUFREQ_DT_H__ */
|
||||
|
|
@ -112,6 +112,9 @@ struct cpufreq_policy {
|
|||
spinlock_t transition_lock;
|
||||
wait_queue_head_t transition_wait;
|
||||
struct task_struct *transition_task; /* Task which is doing the transition */
|
||||
|
||||
/* For cpufreq driver's internal use */
|
||||
void *driver_data;
|
||||
};
|
||||
|
||||
/* Only for ACPI */
|
||||
|
|
@ -214,25 +217,26 @@ __ATTR(_name, 0644, show_##_name, store_##_name)
|
|||
|
||||
|
||||
struct cpufreq_driver {
|
||||
char name[CPUFREQ_NAME_LEN];
|
||||
u8 flags;
|
||||
char name[CPUFREQ_NAME_LEN];
|
||||
u8 flags;
|
||||
void *driver_data;
|
||||
|
||||
/* needed by all drivers */
|
||||
int (*init) (struct cpufreq_policy *policy);
|
||||
int (*verify) (struct cpufreq_policy *policy);
|
||||
int (*init)(struct cpufreq_policy *policy);
|
||||
int (*verify)(struct cpufreq_policy *policy);
|
||||
|
||||
/* define one out of two */
|
||||
int (*setpolicy) (struct cpufreq_policy *policy);
|
||||
int (*setpolicy)(struct cpufreq_policy *policy);
|
||||
|
||||
/*
|
||||
* On failure, should always restore frequency to policy->restore_freq
|
||||
* (i.e. old freq).
|
||||
*/
|
||||
int (*target) (struct cpufreq_policy *policy, /* Deprecated */
|
||||
unsigned int target_freq,
|
||||
unsigned int relation);
|
||||
int (*target_index) (struct cpufreq_policy *policy,
|
||||
unsigned int index);
|
||||
int (*target)(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq,
|
||||
unsigned int relation); /* Deprecated */
|
||||
int (*target_index)(struct cpufreq_policy *policy,
|
||||
unsigned int index);
|
||||
/*
|
||||
* Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION
|
||||
* unset.
|
||||
|
|
@ -248,27 +252,31 @@ struct cpufreq_driver {
|
|||
* wish to switch to intermediate frequency for some target frequency.
|
||||
* In that case core will directly call ->target_index().
|
||||
*/
|
||||
unsigned int (*get_intermediate)(struct cpufreq_policy *policy,
|
||||
unsigned int index);
|
||||
int (*target_intermediate)(struct cpufreq_policy *policy,
|
||||
unsigned int index);
|
||||
unsigned int (*get_intermediate)(struct cpufreq_policy *policy,
|
||||
unsigned int index);
|
||||
int (*target_intermediate)(struct cpufreq_policy *policy,
|
||||
unsigned int index);
|
||||
|
||||
/* should be defined, if possible */
|
||||
unsigned int (*get) (unsigned int cpu);
|
||||
unsigned int (*get)(unsigned int cpu);
|
||||
|
||||
/* optional */
|
||||
int (*bios_limit) (int cpu, unsigned int *limit);
|
||||
int (*bios_limit)(int cpu, unsigned int *limit);
|
||||
|
||||
int (*exit) (struct cpufreq_policy *policy);
|
||||
void (*stop_cpu) (struct cpufreq_policy *policy);
|
||||
int (*suspend) (struct cpufreq_policy *policy);
|
||||
int (*resume) (struct cpufreq_policy *policy);
|
||||
struct freq_attr **attr;
|
||||
int (*exit)(struct cpufreq_policy *policy);
|
||||
void (*stop_cpu)(struct cpufreq_policy *policy);
|
||||
int (*suspend)(struct cpufreq_policy *policy);
|
||||
int (*resume)(struct cpufreq_policy *policy);
|
||||
|
||||
/* Will be called after the driver is fully initialized */
|
||||
void (*ready)(struct cpufreq_policy *policy);
|
||||
|
||||
struct freq_attr **attr;
|
||||
|
||||
/* platform specific boost support code */
|
||||
bool boost_supported;
|
||||
bool boost_enabled;
|
||||
int (*set_boost) (int state);
|
||||
bool boost_supported;
|
||||
bool boost_enabled;
|
||||
int (*set_boost)(int state);
|
||||
};
|
||||
|
||||
/* flags */
|
||||
|
|
@ -309,6 +317,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data);
|
|||
int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
|
||||
|
||||
const char *cpufreq_get_current_driver(void);
|
||||
void *cpufreq_get_driver_data(void);
|
||||
|
||||
static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy,
|
||||
unsigned int min, unsigned int max)
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ struct cpuidle_state {
|
|||
};
|
||||
|
||||
/* Idle State Flags */
|
||||
#define CPUIDLE_FLAG_TIME_VALID (0x01) /* is residency time measurable? */
|
||||
#define CPUIDLE_FLAG_COUPLED (0x02) /* state applies to multiple cpus */
|
||||
#define CPUIDLE_FLAG_TIMER_STOP (0x04) /* timer is stopped on this state */
|
||||
|
||||
|
|
@ -89,8 +88,6 @@ DECLARE_PER_CPU(struct cpuidle_device, cpuidle_dev);
|
|||
/**
|
||||
* cpuidle_get_last_residency - retrieves the last state's residency time
|
||||
* @dev: the target CPU
|
||||
*
|
||||
* NOTE: this value is invalid if CPUIDLE_FLAG_TIME_VALID isn't set
|
||||
*/
|
||||
static inline int cpuidle_get_last_residency(struct cpuidle_device *dev)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -666,10 +666,19 @@ static inline size_t cpumask_size(void)
|
|||
*
|
||||
* This code makes NR_CPUS length memcopy and brings to a memory corruption.
|
||||
* cpumask_copy() provide safe copy functionality.
|
||||
*
|
||||
* Note that there is another evil here: If you define a cpumask_var_t
|
||||
* as a percpu variable then the way to obtain the address of the cpumask
|
||||
* structure differently influences what this_cpu_* operation needs to be
|
||||
* used. Please use this_cpu_cpumask_var_t in those cases. The direct use
|
||||
* of this_cpu_ptr() or this_cpu_read() will lead to failures when the
|
||||
* other type of cpumask_var_t implementation is configured.
|
||||
*/
|
||||
#ifdef CONFIG_CPUMASK_OFFSTACK
|
||||
typedef struct cpumask *cpumask_var_t;
|
||||
|
||||
#define this_cpu_cpumask_var_ptr(x) this_cpu_read(x)
|
||||
|
||||
bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node);
|
||||
bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags);
|
||||
bool zalloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node);
|
||||
|
|
@ -681,6 +690,8 @@ void free_bootmem_cpumask_var(cpumask_var_t mask);
|
|||
#else
|
||||
typedef struct cpumask cpumask_var_t[1];
|
||||
|
||||
#define this_cpu_cpumask_var_ptr(x) this_cpu_ptr(x)
|
||||
|
||||
static inline bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags)
|
||||
{
|
||||
return true;
|
||||
|
|
@ -792,6 +803,23 @@ static inline const struct cpumask *get_cpu_mask(unsigned int cpu)
|
|||
}
|
||||
#endif /* NR_CPUS > BITS_PER_LONG */
|
||||
|
||||
/**
|
||||
* cpumap_print_to_pagebuf - copies the cpumask into the buffer either
|
||||
* as comma-separated list of cpus or hex values of cpumask
|
||||
* @list: indicates whether the cpumap must be list
|
||||
* @mask: the cpumask to copy
|
||||
* @buf: the buffer to copy into
|
||||
*
|
||||
* Returns the length of the (null-terminated) @buf string, zero if
|
||||
* nothing is copied.
|
||||
*/
|
||||
static inline ssize_t
|
||||
cpumap_print_to_pagebuf(bool list, char *buf, const struct cpumask *mask)
|
||||
{
|
||||
return bitmap_print_to_pagebuf(list, buf, cpumask_bits(mask),
|
||||
nr_cpumask_bits);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* From here down, all obsolete. Use cpumask_ variants!
|
||||
|
|
|
|||
|
|
@ -48,29 +48,16 @@ extern nodemask_t cpuset_mems_allowed(struct task_struct *p);
|
|||
void cpuset_init_current_mems_allowed(void);
|
||||
int cpuset_nodemask_valid_mems_allowed(nodemask_t *nodemask);
|
||||
|
||||
extern int __cpuset_node_allowed_softwall(int node, gfp_t gfp_mask);
|
||||
extern int __cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask);
|
||||
extern int __cpuset_node_allowed(int node, gfp_t gfp_mask);
|
||||
|
||||
static inline int cpuset_node_allowed_softwall(int node, gfp_t gfp_mask)
|
||||
static inline int cpuset_node_allowed(int node, gfp_t gfp_mask)
|
||||
{
|
||||
return nr_cpusets() <= 1 ||
|
||||
__cpuset_node_allowed_softwall(node, gfp_mask);
|
||||
return nr_cpusets() <= 1 || __cpuset_node_allowed(node, gfp_mask);
|
||||
}
|
||||
|
||||
static inline int cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask)
|
||||
static inline int cpuset_zone_allowed(struct zone *z, gfp_t gfp_mask)
|
||||
{
|
||||
return nr_cpusets() <= 1 ||
|
||||
__cpuset_node_allowed_hardwall(node, gfp_mask);
|
||||
}
|
||||
|
||||
static inline int cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask)
|
||||
{
|
||||
return cpuset_node_allowed_softwall(zone_to_nid(z), gfp_mask);
|
||||
}
|
||||
|
||||
static inline int cpuset_zone_allowed_hardwall(struct zone *z, gfp_t gfp_mask)
|
||||
{
|
||||
return cpuset_node_allowed_hardwall(zone_to_nid(z), gfp_mask);
|
||||
return cpuset_node_allowed(zone_to_nid(z), gfp_mask);
|
||||
}
|
||||
|
||||
extern int cpuset_mems_allowed_intersects(const struct task_struct *tsk1,
|
||||
|
|
@ -86,7 +73,8 @@ extern void __cpuset_memory_pressure_bump(void);
|
|||
|
||||
extern void cpuset_task_status_allowed(struct seq_file *m,
|
||||
struct task_struct *task);
|
||||
extern int proc_cpuset_show(struct seq_file *, void *);
|
||||
extern int proc_cpuset_show(struct seq_file *m, struct pid_namespace *ns,
|
||||
struct pid *pid, struct task_struct *tsk);
|
||||
|
||||
extern int cpuset_mem_spread_node(void);
|
||||
extern int cpuset_slab_spread_node(void);
|
||||
|
|
@ -178,22 +166,12 @@ static inline int cpuset_nodemask_valid_mems_allowed(nodemask_t *nodemask)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline int cpuset_node_allowed_softwall(int node, gfp_t gfp_mask)
|
||||
static inline int cpuset_node_allowed(int node, gfp_t gfp_mask)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cpuset_zone_allowed_hardwall(struct zone *z, gfp_t gfp_mask)
|
||||
static inline int cpuset_zone_allowed(struct zone *z, gfp_t gfp_mask)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,14 +14,13 @@
|
|||
extern unsigned long long elfcorehdr_addr;
|
||||
extern unsigned long long elfcorehdr_size;
|
||||
|
||||
extern int __weak elfcorehdr_alloc(unsigned long long *addr,
|
||||
unsigned long long *size);
|
||||
extern void __weak elfcorehdr_free(unsigned long long addr);
|
||||
extern ssize_t __weak elfcorehdr_read(char *buf, size_t count, u64 *ppos);
|
||||
extern ssize_t __weak elfcorehdr_read_notes(char *buf, size_t count, u64 *ppos);
|
||||
extern int __weak remap_oldmem_pfn_range(struct vm_area_struct *vma,
|
||||
unsigned long from, unsigned long pfn,
|
||||
unsigned long size, pgprot_t prot);
|
||||
extern int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *size);
|
||||
extern void elfcorehdr_free(unsigned long long addr);
|
||||
extern ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos);
|
||||
extern ssize_t elfcorehdr_read_notes(char *buf, size_t count, u64 *ppos);
|
||||
extern int remap_oldmem_pfn_range(struct vm_area_struct *vma,
|
||||
unsigned long from, unsigned long pfn,
|
||||
unsigned long size, pgprot_t prot);
|
||||
|
||||
extern ssize_t copy_oldmem_page(unsigned long, char *, size_t,
|
||||
unsigned long, int);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@
|
|||
#define CRC_T10DIF_DIGEST_SIZE 2
|
||||
#define CRC_T10DIF_BLOCK_SIZE 1
|
||||
|
||||
__u16 crc_t10dif_generic(__u16 crc, const unsigned char *buffer, size_t len);
|
||||
__u16 crc_t10dif(unsigned char const *, size_t);
|
||||
extern __u16 crc_t10dif_generic(__u16 crc, const unsigned char *buffer,
|
||||
size_t len);
|
||||
extern __u16 crc_t10dif(unsigned char const *, size_t);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ extern void groups_free(struct group_info *);
|
|||
extern int set_current_groups(struct group_info *);
|
||||
extern void set_groups(struct cred *, struct group_info *);
|
||||
extern int groups_search(const struct group_info *, kgid_t);
|
||||
extern bool may_setgroups(void);
|
||||
|
||||
/* access the groups "array" with this macro */
|
||||
#define GROUP_AT(gi, i) \
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,125 +0,0 @@
|
|||
#ifndef _CYCX_X25_H
|
||||
#define _CYCX_X25_H
|
||||
/*
|
||||
* cycx_x25.h Cyclom X.25 firmware API definitions.
|
||||
*
|
||||
* Author: Arnaldo Carvalho de Melo <acme@conectiva.com.br>
|
||||
*
|
||||
* Copyright: (c) 1998-2003 Arnaldo Carvalho de Melo
|
||||
*
|
||||
* Based on sdla_x25.h by Gene Kozin <74604.152@compuserve.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
* ============================================================================
|
||||
* 2000/04/02 acme dprintk and cycx_debug
|
||||
* 1999/01/03 acme judicious use of data types
|
||||
* 1999/01/02 acme #define X25_ACK_N3 0x4411
|
||||
* 1998/12/28 acme cleanup: lot'o'things removed
|
||||
* commands listed,
|
||||
* TX25Cmd & TX25Config structs
|
||||
* typedef'ed
|
||||
*/
|
||||
#ifndef PACKED
|
||||
#define PACKED __attribute__((packed))
|
||||
#endif
|
||||
|
||||
/* X.25 shared memory layout. */
|
||||
#define X25_MBOX_OFFS 0x300 /* general mailbox block */
|
||||
#define X25_RXMBOX_OFFS 0x340 /* receive mailbox */
|
||||
|
||||
/* Debug */
|
||||
#define dprintk(level, format, a...) if (cycx_debug >= level) printk(format, ##a)
|
||||
|
||||
extern unsigned int cycx_debug;
|
||||
|
||||
/* Data Structures */
|
||||
/* X.25 Command Block. */
|
||||
struct cycx_x25_cmd {
|
||||
u16 command;
|
||||
u16 link; /* values: 0 or 1 */
|
||||
u16 len; /* values: 0 thru 0x205 (517) */
|
||||
u32 buf;
|
||||
} PACKED;
|
||||
|
||||
/* Defines for the 'command' field. */
|
||||
#define X25_CONNECT_REQUEST 0x4401
|
||||
#define X25_CONNECT_RESPONSE 0x4402
|
||||
#define X25_DISCONNECT_REQUEST 0x4403
|
||||
#define X25_DISCONNECT_RESPONSE 0x4404
|
||||
#define X25_DATA_REQUEST 0x4405
|
||||
#define X25_ACK_TO_VC 0x4406
|
||||
#define X25_INTERRUPT_RESPONSE 0x4407
|
||||
#define X25_CONFIG 0x4408
|
||||
#define X25_CONNECT_INDICATION 0x4409
|
||||
#define X25_CONNECT_CONFIRM 0x440A
|
||||
#define X25_DISCONNECT_INDICATION 0x440B
|
||||
#define X25_DISCONNECT_CONFIRM 0x440C
|
||||
#define X25_DATA_INDICATION 0x440E
|
||||
#define X25_INTERRUPT_INDICATION 0x440F
|
||||
#define X25_ACK_FROM_VC 0x4410
|
||||
#define X25_ACK_N3 0x4411
|
||||
#define X25_CONNECT_COLLISION 0x4413
|
||||
#define X25_N3WIN 0x4414
|
||||
#define X25_LINE_ON 0x4415
|
||||
#define X25_LINE_OFF 0x4416
|
||||
#define X25_RESET_REQUEST 0x4417
|
||||
#define X25_LOG 0x4500
|
||||
#define X25_STATISTIC 0x4600
|
||||
#define X25_TRACE 0x4700
|
||||
#define X25_N2TRACEXC 0x4702
|
||||
#define X25_N3TRACEXC 0x4703
|
||||
|
||||
/**
|
||||
* struct cycx_x25_config - cyclom2x x25 firmware configuration
|
||||
* @link - link number
|
||||
* @speed - line speed
|
||||
* @clock - internal/external
|
||||
* @n2 - # of level 2 retransm.(values: 1 thru FF)
|
||||
* @n2win - level 2 window (values: 1 thru 7)
|
||||
* @n3win - level 3 window (values: 1 thru 7)
|
||||
* @nvc - # of logical channels (values: 1 thru 64)
|
||||
* @pktlen - level 3 packet length - log base 2 of size
|
||||
* @locaddr - my address
|
||||
* @remaddr - remote address
|
||||
* @t1 - time, in seconds
|
||||
* @t2 - time, in seconds
|
||||
* @t21 - time, in seconds
|
||||
* @npvc - # of permanent virt. circuits (1 thru nvc)
|
||||
* @t23 - time, in seconds
|
||||
* @flags - see dosx25.doc, in portuguese, for details
|
||||
*/
|
||||
struct cycx_x25_config {
|
||||
u8 link;
|
||||
u8 speed;
|
||||
u8 clock;
|
||||
u8 n2;
|
||||
u8 n2win;
|
||||
u8 n3win;
|
||||
u8 nvc;
|
||||
u8 pktlen;
|
||||
u8 locaddr;
|
||||
u8 remaddr;
|
||||
u16 t1;
|
||||
u16 t2;
|
||||
u8 t21;
|
||||
u8 npvc;
|
||||
u8 t23;
|
||||
u8 flags;
|
||||
} PACKED;
|
||||
|
||||
struct cycx_x25_stats {
|
||||
u16 rx_crc_errors;
|
||||
u16 rx_over_errors;
|
||||
u16 n2_tx_frames;
|
||||
u16 n2_rx_frames;
|
||||
u16 tx_timeouts;
|
||||
u16 rx_timeouts;
|
||||
u16 n3_tx_packets;
|
||||
u16 n3_rx_packets;
|
||||
u16 tx_aborts;
|
||||
u16 rx_aborts;
|
||||
} PACKED;
|
||||
#endif /* _CYCX_X25_H */
|
||||
|
|
@ -11,7 +11,6 @@
|
|||
#include <linux/rcupdate.h>
|
||||
#include <linux/lockref.h>
|
||||
|
||||
struct nameidata;
|
||||
struct path;
|
||||
struct vfsmount;
|
||||
|
||||
|
|
@ -125,15 +124,15 @@ struct dentry {
|
|||
void *d_fsdata; /* fs-specific data */
|
||||
|
||||
struct list_head d_lru; /* LRU list */
|
||||
struct list_head d_child; /* child of parent list */
|
||||
struct list_head d_subdirs; /* our children */
|
||||
/*
|
||||
* d_child and d_rcu can share memory
|
||||
* d_alias and d_rcu can share memory
|
||||
*/
|
||||
union {
|
||||
struct list_head d_child; /* child of parent list */
|
||||
struct hlist_node d_alias; /* inode alias list */
|
||||
struct rcu_head d_rcu;
|
||||
} d_u;
|
||||
struct list_head d_subdirs; /* our children */
|
||||
struct hlist_node d_alias; /* inode alias list */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -226,17 +225,11 @@ struct dentry_operations {
|
|||
|
||||
extern seqlock_t rename_lock;
|
||||
|
||||
static inline int dname_external(const struct dentry *dentry)
|
||||
{
|
||||
return dentry->d_name.name != dentry->d_iname;
|
||||
}
|
||||
|
||||
/*
|
||||
* These are the low-level FS interfaces to the dcache..
|
||||
*/
|
||||
extern void d_instantiate(struct dentry *, struct inode *);
|
||||
extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *);
|
||||
extern struct dentry * d_materialise_unique(struct dentry *, struct inode *);
|
||||
extern int d_instantiate_no_diralias(struct dentry *, struct inode *);
|
||||
extern void __d_drop(struct dentry *dentry);
|
||||
extern void d_drop(struct dentry *dentry);
|
||||
|
|
@ -254,7 +247,7 @@ extern struct dentry * d_obtain_root(struct inode *);
|
|||
extern void shrink_dcache_sb(struct super_block *);
|
||||
extern void shrink_dcache_parent(struct dentry *);
|
||||
extern void shrink_dcache_for_umount(struct super_block *);
|
||||
extern int d_invalidate(struct dentry *);
|
||||
extern void d_invalidate(struct dentry *);
|
||||
|
||||
/* only used at mount-time */
|
||||
extern struct dentry * d_make_root(struct inode *);
|
||||
|
|
@ -269,7 +262,6 @@ extern void d_prune_aliases(struct inode *);
|
|||
|
||||
/* test whether we have any submounts in a subdir tree */
|
||||
extern int have_submounts(struct dentry *);
|
||||
extern int check_submounts_and_drop(struct dentry *);
|
||||
|
||||
/*
|
||||
* This adds the entry to the hash queues.
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
struct file_operations;
|
||||
|
||||
struct debugfs_blob_wrapper {
|
||||
|
|
@ -92,20 +93,25 @@ struct dentry *debugfs_create_regset32(const char *name, umode_t mode,
|
|||
struct dentry *parent,
|
||||
struct debugfs_regset32 *regset);
|
||||
|
||||
int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
|
||||
int nregs, void __iomem *base, char *prefix);
|
||||
void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
|
||||
int nregs, void __iomem *base, char *prefix);
|
||||
|
||||
struct dentry *debugfs_create_u32_array(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
u32 *array, u32 elements);
|
||||
|
||||
struct dentry *debugfs_create_devm_seqfile(struct device *dev, const char *name,
|
||||
struct dentry *parent,
|
||||
int (*read_fn)(struct seq_file *s,
|
||||
void *data));
|
||||
|
||||
bool debugfs_initialized(void);
|
||||
|
||||
#else
|
||||
|
||||
#include <linux/err.h>
|
||||
|
||||
/*
|
||||
/*
|
||||
* We do not return NULL from these functions if CONFIG_DEBUG_FS is not enabled
|
||||
* so users have a chance to detect if there was a real error or not. We don't
|
||||
* want to duplicate the design decision mistakes of procfs and devfs again.
|
||||
|
|
@ -233,10 +239,9 @@ static inline struct dentry *debugfs_create_regset32(const char *name,
|
|||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
|
||||
static inline void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
|
||||
int nregs, void __iomem *base, char *prefix)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool debugfs_initialized(void)
|
||||
|
|
@ -251,6 +256,15 @@ static inline struct dentry *debugfs_create_u32_array(const char *name, umode_t
|
|||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline struct dentry *debugfs_create_devm_seqfile(struct device *dev,
|
||||
const char *name,
|
||||
struct dentry *parent,
|
||||
int (*read_fn)(struct seq_file *s,
|
||||
void *data))
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
35
include/linux/devcoredump.h
Normal file
35
include/linux/devcoredump.h
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
#ifndef __DEVCOREDUMP_H
|
||||
#define __DEVCOREDUMP_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#ifdef CONFIG_DEV_COREDUMP
|
||||
void dev_coredumpv(struct device *dev, const void *data, size_t datalen,
|
||||
gfp_t gfp);
|
||||
|
||||
void dev_coredumpm(struct device *dev, struct module *owner,
|
||||
const void *data, size_t datalen, gfp_t gfp,
|
||||
ssize_t (*read)(char *buffer, loff_t offset, size_t count,
|
||||
const void *data, size_t datalen),
|
||||
void (*free)(const void *data));
|
||||
#else
|
||||
static inline void dev_coredumpv(struct device *dev, const void *data,
|
||||
size_t datalen, gfp_t gfp)
|
||||
{
|
||||
vfree(data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dev_coredumpm(struct device *dev, struct module *owner,
|
||||
const void *data, size_t datalen, gfp_t gfp,
|
||||
ssize_t (*read)(char *buffer, loff_t offset, size_t count,
|
||||
const void *data, size_t datalen),
|
||||
void (*free)(const void *data))
|
||||
{
|
||||
free(data);
|
||||
}
|
||||
#endif /* CONFIG_DEV_COREDUMP */
|
||||
|
||||
#endif /* __DEVCOREDUMP_H */
|
||||
|
|
@ -188,7 +188,7 @@ extern struct devfreq *devm_devfreq_add_device(struct device *dev,
|
|||
extern void devm_devfreq_remove_device(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
|
||||
/* Supposed to be called by PM_SLEEP/PM_RUNTIME callbacks */
|
||||
/* Supposed to be called by PM callbacks */
|
||||
extern int devfreq_suspend_device(struct devfreq *devfreq);
|
||||
extern int devfreq_resume_device(struct devfreq *devfreq);
|
||||
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ typedef int (*dm_request_endio_fn) (struct dm_target *ti,
|
|||
union map_info *map_context);
|
||||
|
||||
typedef void (*dm_presuspend_fn) (struct dm_target *ti);
|
||||
typedef void (*dm_presuspend_undo_fn) (struct dm_target *ti);
|
||||
typedef void (*dm_postsuspend_fn) (struct dm_target *ti);
|
||||
typedef int (*dm_preresume_fn) (struct dm_target *ti);
|
||||
typedef void (*dm_resume_fn) (struct dm_target *ti);
|
||||
|
|
@ -145,6 +146,7 @@ struct target_type {
|
|||
dm_endio_fn end_io;
|
||||
dm_request_endio_fn rq_end_io;
|
||||
dm_presuspend_fn presuspend;
|
||||
dm_presuspend_undo_fn presuspend_undo;
|
||||
dm_postsuspend_fn postsuspend;
|
||||
dm_preresume_fn preresume;
|
||||
dm_resume_fn resume;
|
||||
|
|
|
|||
|
|
@ -181,13 +181,14 @@ extern int bus_unregister_notifier(struct bus_type *bus,
|
|||
* with the device lock held in the core, so be careful.
|
||||
*/
|
||||
#define BUS_NOTIFY_ADD_DEVICE 0x00000001 /* device added */
|
||||
#define BUS_NOTIFY_DEL_DEVICE 0x00000002 /* device removed */
|
||||
#define BUS_NOTIFY_BIND_DRIVER 0x00000003 /* driver about to be
|
||||
#define BUS_NOTIFY_DEL_DEVICE 0x00000002 /* device to be removed */
|
||||
#define BUS_NOTIFY_REMOVED_DEVICE 0x00000003 /* device removed */
|
||||
#define BUS_NOTIFY_BIND_DRIVER 0x00000004 /* driver about to be
|
||||
bound */
|
||||
#define BUS_NOTIFY_BOUND_DRIVER 0x00000004 /* driver bound to device */
|
||||
#define BUS_NOTIFY_UNBIND_DRIVER 0x00000005 /* driver about to be
|
||||
#define BUS_NOTIFY_BOUND_DRIVER 0x00000005 /* driver bound to device */
|
||||
#define BUS_NOTIFY_UNBIND_DRIVER 0x00000006 /* driver about to be
|
||||
unbound */
|
||||
#define BUS_NOTIFY_UNBOUND_DRIVER 0x00000006 /* driver is unbound
|
||||
#define BUS_NOTIFY_UNBOUND_DRIVER 0x00000007 /* driver is unbound
|
||||
from the device */
|
||||
|
||||
extern struct kset *bus_get_kset(struct bus_type *bus);
|
||||
|
|
@ -607,8 +608,8 @@ extern int devres_release_group(struct device *dev, void *id);
|
|||
extern void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp);
|
||||
extern char *devm_kvasprintf(struct device *dev, gfp_t gfp, const char *fmt,
|
||||
va_list ap);
|
||||
extern char *devm_kasprintf(struct device *dev, gfp_t gfp,
|
||||
const char *fmt, ...);
|
||||
extern __printf(3, 4)
|
||||
char *devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...);
|
||||
static inline void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp)
|
||||
{
|
||||
return devm_kmalloc(dev, size, gfp | __GFP_ZERO);
|
||||
|
|
@ -910,6 +911,11 @@ static inline void device_unlock(struct device *dev)
|
|||
mutex_unlock(&dev->mutex);
|
||||
}
|
||||
|
||||
static inline void device_lock_assert(struct device *dev)
|
||||
{
|
||||
lockdep_assert_held(&dev->mutex);
|
||||
}
|
||||
|
||||
void driver_init(void);
|
||||
|
||||
/*
|
||||
|
|
@ -1117,6 +1123,41 @@ do { \
|
|||
})
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
#define dev_level_once(dev_level, dev, fmt, ...) \
|
||||
do { \
|
||||
static bool __print_once __read_mostly; \
|
||||
\
|
||||
if (!__print_once) { \
|
||||
__print_once = true; \
|
||||
dev_level(dev, fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
#define dev_level_once(dev_level, dev, fmt, ...) \
|
||||
do { \
|
||||
if (0) \
|
||||
dev_level(dev, fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define dev_emerg_once(dev, fmt, ...) \
|
||||
dev_level_once(dev_emerg, dev, fmt, ##__VA_ARGS__)
|
||||
#define dev_alert_once(dev, fmt, ...) \
|
||||
dev_level_once(dev_alert, dev, fmt, ##__VA_ARGS__)
|
||||
#define dev_crit_once(dev, fmt, ...) \
|
||||
dev_level_once(dev_crit, dev, fmt, ##__VA_ARGS__)
|
||||
#define dev_err_once(dev, fmt, ...) \
|
||||
dev_level_once(dev_err, dev, fmt, ##__VA_ARGS__)
|
||||
#define dev_warn_once(dev, fmt, ...) \
|
||||
dev_level_once(dev_warn, dev, fmt, ##__VA_ARGS__)
|
||||
#define dev_notice_once(dev, fmt, ...) \
|
||||
dev_level_once(dev_notice, dev, fmt, ##__VA_ARGS__)
|
||||
#define dev_info_once(dev, fmt, ...) \
|
||||
dev_level_once(dev_info, dev, fmt, ##__VA_ARGS__)
|
||||
#define dev_dbg_once(dev, fmt, ...) \
|
||||
dev_level_once(dev_info, dev, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define dev_level_ratelimited(dev_level, dev, fmt, ...) \
|
||||
do { \
|
||||
static DEFINE_RATELIMIT_STATE(_rs, \
|
||||
|
|
|
|||
|
|
@ -129,11 +129,14 @@ static inline int dma_coerce_mask_and_coherent(struct device *dev, u64 mask)
|
|||
|
||||
extern u64 dma_get_required_mask(struct device *dev);
|
||||
|
||||
#ifndef set_arch_dma_coherent_ops
|
||||
static inline int set_arch_dma_coherent_ops(struct device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#ifndef arch_setup_dma_ops
|
||||
static inline void arch_setup_dma_ops(struct device *dev, u64 dma_base,
|
||||
u64 size, struct iommu_ops *iommu,
|
||||
bool coherent) { }
|
||||
#endif
|
||||
|
||||
#ifndef arch_teardown_dma_ops
|
||||
static inline void arch_teardown_dma_ops(struct device *dev) { }
|
||||
#endif
|
||||
|
||||
static inline unsigned int dma_get_max_seg_size(struct device *dev)
|
||||
|
|
@ -263,6 +266,32 @@ struct dma_attrs;
|
|||
#define dma_unmap_sg_attrs(dev, sgl, nents, dir, attrs) \
|
||||
dma_unmap_sg(dev, sgl, nents, dir)
|
||||
|
||||
#else
|
||||
static inline void *dma_alloc_writecombine(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_addr, gfp_t gfp)
|
||||
{
|
||||
DEFINE_DMA_ATTRS(attrs);
|
||||
dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
|
||||
return dma_alloc_attrs(dev, size, dma_addr, gfp, &attrs);
|
||||
}
|
||||
|
||||
static inline void dma_free_writecombine(struct device *dev, size_t size,
|
||||
void *cpu_addr, dma_addr_t dma_addr)
|
||||
{
|
||||
DEFINE_DMA_ATTRS(attrs);
|
||||
dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
|
||||
return dma_free_attrs(dev, size, cpu_addr, dma_addr, &attrs);
|
||||
}
|
||||
|
||||
static inline int dma_mmap_writecombine(struct device *dev,
|
||||
struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
DEFINE_DMA_ATTRS(attrs);
|
||||
dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
|
||||
return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, &attrs);
|
||||
}
|
||||
#endif /* CONFIG_HAVE_DMA_ATTRS */
|
||||
|
||||
#ifdef CONFIG_NEED_DMA_MAP_STATE
|
||||
|
|
|
|||
64
include/linux/dma/dw.h
Normal file
64
include/linux/dma/dw.h
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* Driver for the Synopsys DesignWare DMA Controller
|
||||
*
|
||||
* Copyright (C) 2007 Atmel Corporation
|
||||
* Copyright (C) 2010-2011 ST Microelectronics
|
||||
* Copyright (C) 2014 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _DMA_DW_H
|
||||
#define _DMA_DW_H
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dmaengine.h>
|
||||
|
||||
#include <linux/platform_data/dma-dw.h>
|
||||
|
||||
struct dw_dma;
|
||||
|
||||
/**
|
||||
* struct dw_dma_chip - representation of DesignWare DMA controller hardware
|
||||
* @dev: struct device of the DMA controller
|
||||
* @irq: irq line
|
||||
* @regs: memory mapped I/O space
|
||||
* @clk: hclk clock
|
||||
* @dw: struct dw_dma that is filed by dw_dma_probe()
|
||||
*/
|
||||
struct dw_dma_chip {
|
||||
struct device *dev;
|
||||
int irq;
|
||||
void __iomem *regs;
|
||||
struct clk *clk;
|
||||
struct dw_dma *dw;
|
||||
};
|
||||
|
||||
/* Export to the platform drivers */
|
||||
int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata);
|
||||
int dw_dma_remove(struct dw_dma_chip *chip);
|
||||
|
||||
/* DMA API extensions */
|
||||
struct dw_desc;
|
||||
|
||||
struct dw_cyclic_desc {
|
||||
struct dw_desc **desc;
|
||||
unsigned long periods;
|
||||
void (*period_callback)(void *param);
|
||||
void *period_callback_param;
|
||||
};
|
||||
|
||||
struct dw_cyclic_desc *dw_dma_cyclic_prep(struct dma_chan *chan,
|
||||
dma_addr_t buf_addr, size_t buf_len, size_t period_len,
|
||||
enum dma_transfer_direction direction);
|
||||
void dw_dma_cyclic_free(struct dma_chan *chan);
|
||||
int dw_dma_cyclic_start(struct dma_chan *chan);
|
||||
void dw_dma_cyclic_stop(struct dma_chan *chan);
|
||||
|
||||
dma_addr_t dw_dma_get_src_addr(struct dma_chan *chan);
|
||||
|
||||
dma_addr_t dw_dma_get_dst_addr(struct dma_chan *chan);
|
||||
|
||||
#endif /* _DMA_DW_H */
|
||||
|
|
@ -199,15 +199,12 @@ enum dma_ctrl_flags {
|
|||
* configuration data in statically from the platform). An additional
|
||||
* argument of struct dma_slave_config must be passed in with this
|
||||
* command.
|
||||
* @FSLDMA_EXTERNAL_START: this command will put the Freescale DMA controller
|
||||
* into external start mode.
|
||||
*/
|
||||
enum dma_ctrl_cmd {
|
||||
DMA_TERMINATE_ALL,
|
||||
DMA_PAUSE,
|
||||
DMA_RESUME,
|
||||
DMA_SLAVE_CONFIG,
|
||||
FSLDMA_EXTERNAL_START,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -307,7 +304,9 @@ enum dma_slave_buswidth {
|
|||
* struct dma_slave_config - dma slave channel runtime config
|
||||
* @direction: whether the data shall go in or out on this slave
|
||||
* channel, right now. DMA_MEM_TO_DEV and DMA_DEV_TO_MEM are
|
||||
* legal values.
|
||||
* legal values. DEPRECATED, drivers should use the direction argument
|
||||
* to the device_prep_slave_sg and device_prep_dma_cyclic functions or
|
||||
* the dir field in the dma_interleaved_template structure.
|
||||
* @src_addr: this is the physical address where DMA slave data
|
||||
* should be read (RX), if the source is memory this argument is
|
||||
* ignored.
|
||||
|
|
@ -448,7 +447,8 @@ struct dmaengine_unmap_data {
|
|||
* communicate status
|
||||
* @phys: physical address of the descriptor
|
||||
* @chan: target channel for this operation
|
||||
* @tx_submit: set the prepared descriptor(s) to be executed by the engine
|
||||
* @tx_submit: accept the descriptor, assign ordered cookie and mark the
|
||||
* descriptor pending. To be pushed on .issue_pending() call
|
||||
* @callback: routine to call after this operation is complete
|
||||
* @callback_param: general parameter to pass to the callback routine
|
||||
* ---async_tx api specific fields---
|
||||
|
|
@ -755,6 +755,16 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_interleaved_dma(
|
|||
return chan->device->device_prep_interleaved_dma(chan, xt, flags);
|
||||
}
|
||||
|
||||
static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_sg(
|
||||
struct dma_chan *chan,
|
||||
struct scatterlist *dst_sg, unsigned int dst_nents,
|
||||
struct scatterlist *src_sg, unsigned int src_nents,
|
||||
unsigned long flags)
|
||||
{
|
||||
return chan->device->device_prep_dma_sg(chan, dst_sg, dst_nents,
|
||||
src_sg, src_nents, flags);
|
||||
}
|
||||
|
||||
static inline int dma_get_slave_caps(struct dma_chan *chan, struct dma_slave_caps *caps)
|
||||
{
|
||||
if (!chan || !caps)
|
||||
|
|
@ -900,18 +910,6 @@ static inline void dmaengine_put(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_DMA
|
||||
#define net_dmaengine_get() dmaengine_get()
|
||||
#define net_dmaengine_put() dmaengine_put()
|
||||
#else
|
||||
static inline void net_dmaengine_get(void)
|
||||
{
|
||||
}
|
||||
static inline void net_dmaengine_put(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ASYNC_TX_DMA
|
||||
#define async_dmaengine_get() dmaengine_get()
|
||||
#define async_dmaengine_put() dmaengine_put()
|
||||
|
|
@ -933,16 +931,8 @@ async_dma_find_channel(enum dma_transaction_type type)
|
|||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_ASYNC_TX_DMA */
|
||||
|
||||
dma_cookie_t dma_async_memcpy_buf_to_buf(struct dma_chan *chan,
|
||||
void *dest, void *src, size_t len);
|
||||
dma_cookie_t dma_async_memcpy_buf_to_pg(struct dma_chan *chan,
|
||||
struct page *page, unsigned int offset, void *kdata, size_t len);
|
||||
dma_cookie_t dma_async_memcpy_pg_to_pg(struct dma_chan *chan,
|
||||
struct page *dest_pg, unsigned int dest_off, struct page *src_pg,
|
||||
unsigned int src_off, size_t len);
|
||||
void dma_async_tx_descriptor_init(struct dma_async_tx_descriptor *tx,
|
||||
struct dma_chan *chan);
|
||||
struct dma_chan *chan);
|
||||
|
||||
static inline void async_tx_ack(struct dma_async_tx_descriptor *tx)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -30,6 +30,12 @@
|
|||
|
||||
struct acpi_dmar_header;
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
# define DMAR_UNITS_SUPPORTED MAX_IO_APICS
|
||||
#else
|
||||
# define DMAR_UNITS_SUPPORTED 64
|
||||
#endif
|
||||
|
||||
/* DMAR Flags */
|
||||
#define DMAR_INTR_REMAP 0x1
|
||||
#define DMAR_X2APIC_OPT_OUT 0x2
|
||||
|
|
@ -56,13 +62,19 @@ struct dmar_drhd_unit {
|
|||
struct intel_iommu *iommu;
|
||||
};
|
||||
|
||||
struct dmar_pci_path {
|
||||
u8 bus;
|
||||
u8 device;
|
||||
u8 function;
|
||||
};
|
||||
|
||||
struct dmar_pci_notify_info {
|
||||
struct pci_dev *dev;
|
||||
unsigned long event;
|
||||
int bus;
|
||||
u16 seg;
|
||||
u16 level;
|
||||
struct acpi_dmar_pci_path path[];
|
||||
struct dmar_pci_path path[];
|
||||
} __attribute__((packed));
|
||||
|
||||
extern struct rw_semaphore dmar_global_lock;
|
||||
|
|
@ -114,29 +126,61 @@ extern int dmar_remove_dev_scope(struct dmar_pci_notify_info *info,
|
|||
/* Intel IOMMU detection */
|
||||
extern int detect_intel_iommu(void);
|
||||
extern int enable_drhd_fault_handling(void);
|
||||
extern int dmar_device_add(acpi_handle handle);
|
||||
extern int dmar_device_remove(acpi_handle handle);
|
||||
|
||||
static inline int dmar_res_noop(struct acpi_dmar_header *hdr, void *arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_INTEL_IOMMU
|
||||
extern int iommu_detected, no_iommu;
|
||||
extern int intel_iommu_init(void);
|
||||
extern int dmar_parse_one_rmrr(struct acpi_dmar_header *header);
|
||||
extern int dmar_parse_one_atsr(struct acpi_dmar_header *header);
|
||||
extern int dmar_parse_one_rmrr(struct acpi_dmar_header *header, void *arg);
|
||||
extern int dmar_parse_one_atsr(struct acpi_dmar_header *header, void *arg);
|
||||
extern int dmar_check_one_atsr(struct acpi_dmar_header *hdr, void *arg);
|
||||
extern int dmar_release_one_atsr(struct acpi_dmar_header *hdr, void *arg);
|
||||
extern int dmar_iommu_hotplug(struct dmar_drhd_unit *dmaru, bool insert);
|
||||
extern int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info);
|
||||
#else /* !CONFIG_INTEL_IOMMU: */
|
||||
static inline int intel_iommu_init(void) { return -ENODEV; }
|
||||
static inline int dmar_parse_one_rmrr(struct acpi_dmar_header *header)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int dmar_parse_one_atsr(struct acpi_dmar_header *header)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define dmar_parse_one_rmrr dmar_res_noop
|
||||
#define dmar_parse_one_atsr dmar_res_noop
|
||||
#define dmar_check_one_atsr dmar_res_noop
|
||||
#define dmar_release_one_atsr dmar_res_noop
|
||||
|
||||
static inline int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int dmar_iommu_hotplug(struct dmar_drhd_unit *dmaru, bool insert)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_INTEL_IOMMU */
|
||||
|
||||
#ifdef CONFIG_IRQ_REMAP
|
||||
extern int dmar_ir_hotplug(struct dmar_drhd_unit *dmaru, bool insert);
|
||||
#else /* CONFIG_IRQ_REMAP */
|
||||
static inline int dmar_ir_hotplug(struct dmar_drhd_unit *dmaru, bool insert)
|
||||
{ return 0; }
|
||||
#endif /* CONFIG_IRQ_REMAP */
|
||||
|
||||
#else /* CONFIG_DMAR_TABLE */
|
||||
|
||||
static inline int dmar_device_add(void *handle)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int dmar_device_remove(void *handle)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DMAR_TABLE */
|
||||
|
||||
struct irte {
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@ enum drbd_ret_code {
|
|||
ERR_RES_NOT_KNOWN = 158,
|
||||
ERR_RES_IN_USE = 159,
|
||||
ERR_MINOR_CONFIGURED = 160,
|
||||
ERR_MINOR_EXISTS = 161,
|
||||
ERR_MINOR_OR_VOLUME_EXISTS = 161,
|
||||
ERR_INVALID_REQUEST = 162,
|
||||
ERR_NEED_APV_100 = 163,
|
||||
ERR_NEED_ALLOW_TWO_PRI = 164,
|
||||
|
|
|
|||
|
|
@ -1,111 +0,0 @@
|
|||
/*
|
||||
* Driver for the Synopsys DesignWare DMA Controller
|
||||
*
|
||||
* Copyright (C) 2007 Atmel Corporation
|
||||
* Copyright (C) 2010-2011 ST Microelectronics
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef DW_DMAC_H
|
||||
#define DW_DMAC_H
|
||||
|
||||
#include <linux/dmaengine.h>
|
||||
|
||||
/**
|
||||
* struct dw_dma_slave - Controller-specific information about a slave
|
||||
*
|
||||
* @dma_dev: required DMA master device. Depricated.
|
||||
* @bus_id: name of this device channel, not just a device name since
|
||||
* devices may have more than one channel e.g. "foo_tx"
|
||||
* @cfg_hi: Platform-specific initializer for the CFG_HI register
|
||||
* @cfg_lo: Platform-specific initializer for the CFG_LO register
|
||||
* @src_master: src master for transfers on allocated channel.
|
||||
* @dst_master: dest master for transfers on allocated channel.
|
||||
*/
|
||||
struct dw_dma_slave {
|
||||
struct device *dma_dev;
|
||||
u32 cfg_hi;
|
||||
u32 cfg_lo;
|
||||
u8 src_master;
|
||||
u8 dst_master;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dw_dma_platform_data - Controller configuration parameters
|
||||
* @nr_channels: Number of channels supported by hardware (max 8)
|
||||
* @is_private: The device channels should be marked as private and not for
|
||||
* by the general purpose DMA channel allocator.
|
||||
* @chan_allocation_order: Allocate channels starting from 0 or 7
|
||||
* @chan_priority: Set channel priority increasing from 0 to 7 or 7 to 0.
|
||||
* @block_size: Maximum block size supported by the controller
|
||||
* @nr_masters: Number of AHB masters supported by the controller
|
||||
* @data_width: Maximum data width supported by hardware per AHB master
|
||||
* (0 - 8bits, 1 - 16bits, ..., 5 - 256bits)
|
||||
*/
|
||||
struct dw_dma_platform_data {
|
||||
unsigned int nr_channels;
|
||||
bool is_private;
|
||||
#define CHAN_ALLOCATION_ASCENDING 0 /* zero to seven */
|
||||
#define CHAN_ALLOCATION_DESCENDING 1 /* seven to zero */
|
||||
unsigned char chan_allocation_order;
|
||||
#define CHAN_PRIORITY_ASCENDING 0 /* chan0 highest */
|
||||
#define CHAN_PRIORITY_DESCENDING 1 /* chan7 highest */
|
||||
unsigned char chan_priority;
|
||||
unsigned short block_size;
|
||||
unsigned char nr_masters;
|
||||
unsigned char data_width[4];
|
||||
};
|
||||
|
||||
/* bursts size */
|
||||
enum dw_dma_msize {
|
||||
DW_DMA_MSIZE_1,
|
||||
DW_DMA_MSIZE_4,
|
||||
DW_DMA_MSIZE_8,
|
||||
DW_DMA_MSIZE_16,
|
||||
DW_DMA_MSIZE_32,
|
||||
DW_DMA_MSIZE_64,
|
||||
DW_DMA_MSIZE_128,
|
||||
DW_DMA_MSIZE_256,
|
||||
};
|
||||
|
||||
/* Platform-configurable bits in CFG_HI */
|
||||
#define DWC_CFGH_FCMODE (1 << 0)
|
||||
#define DWC_CFGH_FIFO_MODE (1 << 1)
|
||||
#define DWC_CFGH_PROTCTL(x) ((x) << 2)
|
||||
#define DWC_CFGH_SRC_PER(x) ((x) << 7)
|
||||
#define DWC_CFGH_DST_PER(x) ((x) << 11)
|
||||
|
||||
/* Platform-configurable bits in CFG_LO */
|
||||
#define DWC_CFGL_LOCK_CH_XFER (0 << 12) /* scope of LOCK_CH */
|
||||
#define DWC_CFGL_LOCK_CH_BLOCK (1 << 12)
|
||||
#define DWC_CFGL_LOCK_CH_XACT (2 << 12)
|
||||
#define DWC_CFGL_LOCK_BUS_XFER (0 << 14) /* scope of LOCK_BUS */
|
||||
#define DWC_CFGL_LOCK_BUS_BLOCK (1 << 14)
|
||||
#define DWC_CFGL_LOCK_BUS_XACT (2 << 14)
|
||||
#define DWC_CFGL_LOCK_CH (1 << 15) /* channel lockout */
|
||||
#define DWC_CFGL_LOCK_BUS (1 << 16) /* busmaster lockout */
|
||||
#define DWC_CFGL_HS_DST_POL (1 << 18) /* dst handshake active low */
|
||||
#define DWC_CFGL_HS_SRC_POL (1 << 19) /* src handshake active low */
|
||||
|
||||
/* DMA API extensions */
|
||||
struct dw_cyclic_desc {
|
||||
struct dw_desc **desc;
|
||||
unsigned long periods;
|
||||
void (*period_callback)(void *param);
|
||||
void *period_callback_param;
|
||||
};
|
||||
|
||||
struct dw_cyclic_desc *dw_dma_cyclic_prep(struct dma_chan *chan,
|
||||
dma_addr_t buf_addr, size_t buf_len, size_t period_len,
|
||||
enum dma_transfer_direction direction);
|
||||
void dw_dma_cyclic_free(struct dma_chan *chan);
|
||||
int dw_dma_cyclic_start(struct dma_chan *chan);
|
||||
void dw_dma_cyclic_stop(struct dma_chan *chan);
|
||||
|
||||
dma_addr_t dw_dma_get_src_addr(struct dma_chan *chan);
|
||||
|
||||
dma_addr_t dw_dma_get_dst_addr(struct dma_chan *chan);
|
||||
|
||||
#endif /* DW_DMAC_H */
|
||||
|
|
@ -42,7 +42,7 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n,
|
|||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
extern int ddebug_remove_module(const char *mod_name);
|
||||
extern __printf(2, 3)
|
||||
int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
|
||||
void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
|
||||
|
||||
extern int ddebug_dyndbg_module_param_cb(char *param, char *val,
|
||||
const char *modname);
|
||||
|
|
@ -50,15 +50,15 @@ extern int ddebug_dyndbg_module_param_cb(char *param, char *val,
|
|||
struct device;
|
||||
|
||||
extern __printf(3, 4)
|
||||
int __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev,
|
||||
const char *fmt, ...);
|
||||
void __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev,
|
||||
const char *fmt, ...);
|
||||
|
||||
struct net_device;
|
||||
|
||||
extern __printf(3, 4)
|
||||
int __dynamic_netdev_dbg(struct _ddebug *descriptor,
|
||||
const struct net_device *dev,
|
||||
const char *fmt, ...);
|
||||
void __dynamic_netdev_dbg(struct _ddebug *descriptor,
|
||||
const struct net_device *dev,
|
||||
const char *fmt, ...);
|
||||
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
|
||||
static struct _ddebug __aligned(8) \
|
||||
|
|
|
|||
|
|
@ -73,14 +73,22 @@ static inline void dql_queued(struct dql *dql, unsigned int count)
|
|||
{
|
||||
BUG_ON(count > DQL_MAX_OBJECT);
|
||||
|
||||
dql->num_queued += count;
|
||||
dql->last_obj_cnt = count;
|
||||
|
||||
/* We want to force a write first, so that cpu do not attempt
|
||||
* to get cache line containing last_obj_cnt, num_queued, adj_limit
|
||||
* in Shared state, but directly does a Request For Ownership
|
||||
* It is only a hint, we use barrier() only.
|
||||
*/
|
||||
barrier();
|
||||
|
||||
dql->num_queued += count;
|
||||
}
|
||||
|
||||
/* Returns how many objects can be queued, < 0 indicates over limit. */
|
||||
static inline int dql_avail(const struct dql *dql)
|
||||
{
|
||||
return dql->adj_limit - dql->num_queued;
|
||||
return ACCESS_ONCE(dql->adj_limit) - ACCESS_ONCE(dql->num_queued);
|
||||
}
|
||||
|
||||
/* Record number of completed objects and recalculate the limit. */
|
||||
|
|
|
|||
|
|
@ -194,7 +194,8 @@ static inline char *mc_event_error_type(const unsigned int err_type)
|
|||
* @MEM_DDR3: DDR3 RAM
|
||||
* @MEM_RDDR3: Registered DDR3 RAM
|
||||
* This is a variant of the DDR3 memories.
|
||||
* @MEM_DDR4: DDR4 RAM
|
||||
* @MEM_LRDDR3 Load-Reduced DDR3 memory.
|
||||
* @MEM_DDR4: Unbuffered DDR4 RAM
|
||||
* @MEM_RDDR4: Registered DDR4 RAM
|
||||
* This is a variant of the DDR4 memories.
|
||||
*/
|
||||
|
|
@ -216,6 +217,7 @@ enum mem_type {
|
|||
MEM_XDR,
|
||||
MEM_DDR3,
|
||||
MEM_RDDR3,
|
||||
MEM_LRDDR3,
|
||||
MEM_DDR4,
|
||||
MEM_RDDR4,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -75,6 +75,10 @@ extern void eeprom_93cx6_read(struct eeprom_93cx6 *eeprom,
|
|||
const u8 word, u16 *data);
|
||||
extern void eeprom_93cx6_multiread(struct eeprom_93cx6 *eeprom,
|
||||
const u8 word, __le16 *data, const u16 words);
|
||||
extern void eeprom_93cx6_readb(struct eeprom_93cx6 *eeprom,
|
||||
const u8 byte, u8 *data);
|
||||
extern void eeprom_93cx6_multireadb(struct eeprom_93cx6 *eeprom,
|
||||
const u8 byte, u8 *data, const u16 bytes);
|
||||
|
||||
extern void eeprom_93cx6_wren(struct eeprom_93cx6 *eeprom, bool enable);
|
||||
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ typedef struct {
|
|||
#define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */
|
||||
#define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */
|
||||
#define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */
|
||||
#define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL) /* uncached, exported */
|
||||
#define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */
|
||||
#define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */
|
||||
#define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */
|
||||
|
|
@ -502,6 +503,10 @@ typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char
|
|||
typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 attr, unsigned long data_size,
|
||||
void *data);
|
||||
typedef efi_status_t
|
||||
efi_set_variable_nonblocking_t(efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 attr, unsigned long data_size, void *data);
|
||||
|
||||
typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
|
||||
typedef void efi_reset_system_t (int reset_type, efi_status_t status,
|
||||
unsigned long data_size, efi_char16_t *data);
|
||||
|
|
@ -542,6 +547,9 @@ void efi_native_runtime_setup(void);
|
|||
#define SMBIOS_TABLE_GUID \
|
||||
EFI_GUID( 0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
|
||||
|
||||
#define SMBIOS3_TABLE_GUID \
|
||||
EFI_GUID( 0xf2fd1544, 0x9794, 0x4a2c, 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94 )
|
||||
|
||||
#define SAL_SYSTEM_TABLE_GUID \
|
||||
EFI_GUID( 0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
|
||||
|
||||
|
|
@ -805,7 +813,8 @@ extern struct efi {
|
|||
unsigned long mps; /* MPS table */
|
||||
unsigned long acpi; /* ACPI table (IA64 ext 0.71) */
|
||||
unsigned long acpi20; /* ACPI table (ACPI 2.0) */
|
||||
unsigned long smbios; /* SM BIOS table */
|
||||
unsigned long smbios; /* SMBIOS table (32 bit entry point) */
|
||||
unsigned long smbios3; /* SMBIOS table (64 bit entry point) */
|
||||
unsigned long sal_systab; /* SAL system table */
|
||||
unsigned long boot_info; /* boot info table */
|
||||
unsigned long hcdp; /* HCDP table */
|
||||
|
|
@ -821,6 +830,7 @@ extern struct efi {
|
|||
efi_get_variable_t *get_variable;
|
||||
efi_get_next_variable_t *get_next_variable;
|
||||
efi_set_variable_t *set_variable;
|
||||
efi_set_variable_nonblocking_t *set_variable_nonblocking;
|
||||
efi_query_variable_info_t *query_variable_info;
|
||||
efi_update_capsule_t *update_capsule;
|
||||
efi_query_capsule_caps_t *query_capsule_caps;
|
||||
|
|
@ -886,6 +896,13 @@ extern bool efi_poweroff_required(void);
|
|||
(md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \
|
||||
(md) = (void *)(md) + (m)->desc_size)
|
||||
|
||||
/*
|
||||
* Format an EFI memory descriptor's type and attributes to a user-provided
|
||||
* character buffer, as per snprintf(), and return the buffer.
|
||||
*/
|
||||
char * __init efi_md_typeattr_format(char *buf, size_t size,
|
||||
const efi_memory_desc_t *md);
|
||||
|
||||
/**
|
||||
* efi_range_is_wc - check the WC bit on an address range
|
||||
* @start: starting kvirt address
|
||||
|
|
@ -1034,6 +1051,7 @@ struct efivar_operations {
|
|||
efi_get_variable_t *get_variable;
|
||||
efi_get_next_variable_t *get_next_variable;
|
||||
efi_set_variable_t *set_variable;
|
||||
efi_set_variable_nonblocking_t *set_variable_nonblocking;
|
||||
efi_query_variable_store_t *query_variable_store;
|
||||
};
|
||||
|
||||
|
|
@ -1227,4 +1245,7 @@ efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
|
|||
unsigned long *load_addr,
|
||||
unsigned long *load_size);
|
||||
|
||||
efi_status_t efi_parse_options(char *cmdline);
|
||||
|
||||
bool efi_runtime_disabled(void);
|
||||
#endif /* _LINUX_EFI_H */
|
||||
|
|
|
|||
|
|
@ -15,6 +15,11 @@
|
|||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
#endif
|
||||
|
||||
#ifndef SET_PERSONALITY2
|
||||
#define SET_PERSONALITY2(ex, state) \
|
||||
SET_PERSONALITY(ex)
|
||||
#endif
|
||||
|
||||
#if ELF_CLASS == ELFCLASS32
|
||||
|
||||
extern Elf32_Dyn _DYNAMIC [];
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include <asm/bitsperlong.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
u32 eth_get_headlen(void *data, unsigned int max_len);
|
||||
__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev);
|
||||
extern const struct header_ops eth_header_ops;
|
||||
|
||||
|
|
@ -391,4 +392,16 @@ static inline unsigned long compare_ether_header(const void *a, const void *b)
|
|||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* eth_skb_pad - Pad buffer to mininum number of octets for Ethernet frame
|
||||
* @skb: Buffer to pad
|
||||
*
|
||||
* An Ethernet frame should have a minimum size of 60 bytes. This function
|
||||
* takes short frames and pads them with zeros up to the 60 byte limit.
|
||||
*/
|
||||
static inline int eth_skb_pad(struct sk_buff *skb)
|
||||
{
|
||||
return skb_put_padto(skb, ETH_ZLEN);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_ETHERDEVICE_H */
|
||||
|
|
|
|||
|
|
@ -59,6 +59,26 @@ enum ethtool_phys_id_state {
|
|||
ETHTOOL_ID_OFF
|
||||
};
|
||||
|
||||
enum {
|
||||
ETH_RSS_HASH_TOP_BIT, /* Configurable RSS hash function - Toeplitz */
|
||||
ETH_RSS_HASH_XOR_BIT, /* Configurable RSS hash function - Xor */
|
||||
|
||||
/*
|
||||
* Add your fresh new hash function bits above and remember to update
|
||||
* rss_hash_func_strings[] in ethtool.c
|
||||
*/
|
||||
ETH_RSS_HASH_FUNCS_COUNT
|
||||
};
|
||||
|
||||
#define __ETH_RSS_HASH_BIT(bit) ((u32)1 << (bit))
|
||||
#define __ETH_RSS_HASH(name) __ETH_RSS_HASH_BIT(ETH_RSS_HASH_##name##_BIT)
|
||||
|
||||
#define ETH_RSS_HASH_TOP __ETH_RSS_HASH(TOP)
|
||||
#define ETH_RSS_HASH_XOR __ETH_RSS_HASH(XOR)
|
||||
|
||||
#define ETH_RSS_HASH_UNKNOWN 0
|
||||
#define ETH_RSS_HASH_NO_CHANGE 0
|
||||
|
||||
struct net_device;
|
||||
|
||||
/* Some generic methods drivers may use in their ethtool_ops */
|
||||
|
|
@ -158,17 +178,14 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings)
|
|||
* Returns zero if not supported for this specific device.
|
||||
* @get_rxfh_indir_size: Get the size of the RX flow hash indirection table.
|
||||
* Returns zero if not supported for this specific device.
|
||||
* @get_rxfh: Get the contents of the RX flow hash indirection table and hash
|
||||
* key.
|
||||
* Will only be called if one or both of @get_rxfh_indir_size and
|
||||
* @get_rxfh_key_size are implemented and return non-zero.
|
||||
* Returns a negative error code or zero.
|
||||
* @set_rxfh: Set the contents of the RX flow hash indirection table and/or
|
||||
* hash key. In case only the indirection table or hash key is to be
|
||||
* changed, the other argument will be %NULL.
|
||||
* Will only be called if one or both of @get_rxfh_indir_size and
|
||||
* @get_rxfh_key_size are implemented and return non-zero.
|
||||
* @get_rxfh: Get the contents of the RX flow hash indirection table, hash key
|
||||
* and/or hash function.
|
||||
* Returns a negative error code or zero.
|
||||
* @set_rxfh: Set the contents of the RX flow hash indirection table, hash
|
||||
* key, and/or hash function. Arguments which are set to %NULL or zero
|
||||
* will remain unchanged.
|
||||
* Returns a negative error code or zero. An error code must be returned
|
||||
* if at least one unsupported change was requested.
|
||||
* @get_channels: Get number of channels.
|
||||
* @set_channels: Set number of channels. Returns a negative error code or
|
||||
* zero.
|
||||
|
|
@ -241,9 +258,10 @@ struct ethtool_ops {
|
|||
int (*reset)(struct net_device *, u32 *);
|
||||
u32 (*get_rxfh_key_size)(struct net_device *);
|
||||
u32 (*get_rxfh_indir_size)(struct net_device *);
|
||||
int (*get_rxfh)(struct net_device *, u32 *indir, u8 *key);
|
||||
int (*get_rxfh)(struct net_device *, u32 *indir, u8 *key,
|
||||
u8 *hfunc);
|
||||
int (*set_rxfh)(struct net_device *, const u32 *indir,
|
||||
const u8 *key);
|
||||
const u8 *key, const u8 hfunc);
|
||||
void (*get_channels)(struct net_device *, struct ethtool_channels *);
|
||||
int (*set_channels)(struct net_device *, struct ethtool_channels *);
|
||||
int (*get_dump_flag)(struct net_device *, struct ethtool_dump *);
|
||||
|
|
@ -257,6 +275,10 @@ struct ethtool_ops {
|
|||
struct ethtool_eeprom *, u8 *);
|
||||
int (*get_eee)(struct net_device *, struct ethtool_eee *);
|
||||
int (*set_eee)(struct net_device *, struct ethtool_eee *);
|
||||
int (*get_tunable)(struct net_device *,
|
||||
const struct ethtool_tunable *, void *);
|
||||
int (*set_tunable)(struct net_device *,
|
||||
const struct ethtool_tunable *, const void *);
|
||||
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -34,8 +34,10 @@
|
|||
* @irq_flags: IRQ Flags (e.g., IRQF_TRIGGER_LOW).
|
||||
* @state_on: print_state is overriden with state_on if attached.
|
||||
* If NULL, default method of extcon class is used.
|
||||
* @state_off: print_state is overriden with state_on if detached.
|
||||
* @state_off: print_state is overriden with state_off if detached.
|
||||
* If NUll, default method of extcon class is used.
|
||||
* @check_on_resume: Boolean describing whether to check the state of gpio
|
||||
* while resuming from sleep.
|
||||
*
|
||||
* Note that in order for state_on or state_off to be valid, both state_on
|
||||
* and state_off should be not NULL. If at least one of them is NULL,
|
||||
|
|
|
|||
|
|
@ -1,287 +0,0 @@
|
|||
/*
|
||||
* sm5502.h
|
||||
*
|
||||
* Copyright (c) 2014 Samsung Electronics Co., Ltd
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_EXTCON_SM5502_H
|
||||
#define __LINUX_EXTCON_SM5502_H
|
||||
|
||||
enum sm5502_types {
|
||||
TYPE_SM5502,
|
||||
};
|
||||
|
||||
/* SM5502 registers */
|
||||
enum sm5502_reg {
|
||||
SM5502_REG_DEVICE_ID = 0x01,
|
||||
SM5502_REG_CONTROL,
|
||||
SM5502_REG_INT1,
|
||||
SM5502_REG_INT2,
|
||||
SM5502_REG_INTMASK1,
|
||||
SM5502_REG_INTMASK2,
|
||||
SM5502_REG_ADC,
|
||||
SM5502_REG_TIMING_SET1,
|
||||
SM5502_REG_TIMING_SET2,
|
||||
SM5502_REG_DEV_TYPE1,
|
||||
SM5502_REG_DEV_TYPE2,
|
||||
SM5502_REG_BUTTON1,
|
||||
SM5502_REG_BUTTON2,
|
||||
SM5502_REG_CAR_KIT_STATUS,
|
||||
SM5502_REG_RSVD1,
|
||||
SM5502_REG_RSVD2,
|
||||
SM5502_REG_RSVD3,
|
||||
SM5502_REG_RSVD4,
|
||||
SM5502_REG_MANUAL_SW1,
|
||||
SM5502_REG_MANUAL_SW2,
|
||||
SM5502_REG_DEV_TYPE3,
|
||||
SM5502_REG_RSVD5,
|
||||
SM5502_REG_RSVD6,
|
||||
SM5502_REG_RSVD7,
|
||||
SM5502_REG_RSVD8,
|
||||
SM5502_REG_RSVD9,
|
||||
SM5502_REG_RESET,
|
||||
SM5502_REG_RSVD10,
|
||||
SM5502_REG_RESERVED_ID1,
|
||||
SM5502_REG_RSVD11,
|
||||
SM5502_REG_RSVD12,
|
||||
SM5502_REG_RESERVED_ID2,
|
||||
SM5502_REG_RSVD13,
|
||||
SM5502_REG_OCP,
|
||||
SM5502_REG_RSVD14,
|
||||
SM5502_REG_RSVD15,
|
||||
SM5502_REG_RSVD16,
|
||||
SM5502_REG_RSVD17,
|
||||
SM5502_REG_RSVD18,
|
||||
SM5502_REG_RSVD19,
|
||||
SM5502_REG_RSVD20,
|
||||
SM5502_REG_RSVD21,
|
||||
SM5502_REG_RSVD22,
|
||||
SM5502_REG_RSVD23,
|
||||
SM5502_REG_RSVD24,
|
||||
SM5502_REG_RSVD25,
|
||||
SM5502_REG_RSVD26,
|
||||
SM5502_REG_RSVD27,
|
||||
SM5502_REG_RSVD28,
|
||||
SM5502_REG_RSVD29,
|
||||
SM5502_REG_RSVD30,
|
||||
SM5502_REG_RSVD31,
|
||||
SM5502_REG_RSVD32,
|
||||
SM5502_REG_RSVD33,
|
||||
SM5502_REG_RSVD34,
|
||||
SM5502_REG_RSVD35,
|
||||
SM5502_REG_RSVD36,
|
||||
SM5502_REG_RESERVED_ID3,
|
||||
|
||||
SM5502_REG_END,
|
||||
};
|
||||
|
||||
/* Define SM5502 MASK/SHIFT constant */
|
||||
#define SM5502_REG_DEVICE_ID_VENDOR_SHIFT 0
|
||||
#define SM5502_REG_DEVICE_ID_VERSION_SHIFT 3
|
||||
#define SM5502_REG_DEVICE_ID_VENDOR_MASK (0x3 << SM5502_REG_DEVICE_ID_VENDOR_SHIFT)
|
||||
#define SM5502_REG_DEVICE_ID_VERSION_MASK (0x1f << SM5502_REG_DEVICE_ID_VERSION_SHIFT)
|
||||
|
||||
#define SM5502_REG_CONTROL_MASK_INT_SHIFT 0
|
||||
#define SM5502_REG_CONTROL_WAIT_SHIFT 1
|
||||
#define SM5502_REG_CONTROL_MANUAL_SW_SHIFT 2
|
||||
#define SM5502_REG_CONTROL_RAW_DATA_SHIFT 3
|
||||
#define SM5502_REG_CONTROL_SW_OPEN_SHIFT 4
|
||||
#define SM5502_REG_CONTROL_MASK_INT_MASK (0x1 << SM5502_REG_CONTROL_MASK_INT_SHIFT)
|
||||
#define SM5502_REG_CONTROL_WAIT_MASK (0x1 << SM5502_REG_CONTROL_WAIT_SHIFT)
|
||||
#define SM5502_REG_CONTROL_MANUAL_SW_MASK (0x1 << SM5502_REG_CONTROL_MANUAL_SW_SHIFT)
|
||||
#define SM5502_REG_CONTROL_RAW_DATA_MASK (0x1 << SM5502_REG_CONTROL_RAW_DATA_SHIFT)
|
||||
#define SM5502_REG_CONTROL_SW_OPEN_MASK (0x1 << SM5502_REG_CONTROL_SW_OPEN_SHIFT)
|
||||
|
||||
#define SM5502_REG_INTM1_ATTACH_SHIFT 0
|
||||
#define SM5502_REG_INTM1_DETACH_SHIFT 1
|
||||
#define SM5502_REG_INTM1_KP_SHIFT 2
|
||||
#define SM5502_REG_INTM1_LKP_SHIFT 3
|
||||
#define SM5502_REG_INTM1_LKR_SHIFT 4
|
||||
#define SM5502_REG_INTM1_OVP_EVENT_SHIFT 5
|
||||
#define SM5502_REG_INTM1_OCP_EVENT_SHIFT 6
|
||||
#define SM5502_REG_INTM1_OVP_OCP_DIS_SHIFT 7
|
||||
#define SM5502_REG_INTM1_ATTACH_MASK (0x1 << SM5502_REG_INTM1_ATTACH_SHIFT)
|
||||
#define SM5502_REG_INTM1_DETACH_MASK (0x1 << SM5502_REG_INTM1_DETACH_SHIFT)
|
||||
#define SM5502_REG_INTM1_KP_MASK (0x1 << SM5502_REG_INTM1_KP_SHIFT)
|
||||
#define SM5502_REG_INTM1_LKP_MASK (0x1 << SM5502_REG_INTM1_LKP_SHIFT)
|
||||
#define SM5502_REG_INTM1_LKR_MASK (0x1 << SM5502_REG_INTM1_LKR_SHIFT)
|
||||
#define SM5502_REG_INTM1_OVP_EVENT_MASK (0x1 << SM5502_REG_INTM1_OVP_EVENT_SHIFT)
|
||||
#define SM5502_REG_INTM1_OCP_EVENT_MASK (0x1 << SM5502_REG_INTM1_OCP_EVENT_SHIFT)
|
||||
#define SM5502_REG_INTM1_OVP_OCP_DIS_MASK (0x1 << SM5502_REG_INTM1_OVP_OCP_DIS_SHIFT)
|
||||
|
||||
#define SM5502_REG_INTM2_VBUS_DET_SHIFT 0
|
||||
#define SM5502_REG_INTM2_REV_ACCE_SHIFT 1
|
||||
#define SM5502_REG_INTM2_ADC_CHG_SHIFT 2
|
||||
#define SM5502_REG_INTM2_STUCK_KEY_SHIFT 3
|
||||
#define SM5502_REG_INTM2_STUCK_KEY_RCV_SHIFT 4
|
||||
#define SM5502_REG_INTM2_MHL_SHIFT 5
|
||||
#define SM5502_REG_INTM2_VBUS_DET_MASK (0x1 << SM5502_REG_INTM2_VBUS_DET_SHIFT)
|
||||
#define SM5502_REG_INTM2_REV_ACCE_MASK (0x1 << SM5502_REG_INTM2_REV_ACCE_SHIFT)
|
||||
#define SM5502_REG_INTM2_ADC_CHG_MASK (0x1 << SM5502_REG_INTM2_ADC_CHG_SHIFT)
|
||||
#define SM5502_REG_INTM2_STUCK_KEY_MASK (0x1 << SM5502_REG_INTM2_STUCK_KEY_SHIFT)
|
||||
#define SM5502_REG_INTM2_STUCK_KEY_RCV_MASK (0x1 << SM5502_REG_INTM2_STUCK_KEY_RCV_SHIFT)
|
||||
#define SM5502_REG_INTM2_MHL_MASK (0x1 << SM5502_REG_INTM2_MHL_SHIFT)
|
||||
|
||||
#define SM5502_REG_ADC_SHIFT 0
|
||||
#define SM5502_REG_ADC_MASK (0x1f << SM5502_REG_ADC_SHIFT)
|
||||
|
||||
#define SM5502_REG_TIMING_SET1_KEY_PRESS_SHIFT 4
|
||||
#define SM5502_REG_TIMING_SET1_KEY_PRESS_MASK (0xf << SM5502_REG_TIMING_SET1_KEY_PRESS_SHIFT)
|
||||
#define TIMING_KEY_PRESS_100MS 0x0
|
||||
#define TIMING_KEY_PRESS_200MS 0x1
|
||||
#define TIMING_KEY_PRESS_300MS 0x2
|
||||
#define TIMING_KEY_PRESS_400MS 0x3
|
||||
#define TIMING_KEY_PRESS_500MS 0x4
|
||||
#define TIMING_KEY_PRESS_600MS 0x5
|
||||
#define TIMING_KEY_PRESS_700MS 0x6
|
||||
#define TIMING_KEY_PRESS_800MS 0x7
|
||||
#define TIMING_KEY_PRESS_900MS 0x8
|
||||
#define TIMING_KEY_PRESS_1000MS 0x9
|
||||
#define SM5502_REG_TIMING_SET1_ADC_DET_SHIFT 0
|
||||
#define SM5502_REG_TIMING_SET1_ADC_DET_MASK (0xf << SM5502_REG_TIMING_SET1_ADC_DET_SHIFT)
|
||||
#define TIMING_ADC_DET_50MS 0x0
|
||||
#define TIMING_ADC_DET_100MS 0x1
|
||||
#define TIMING_ADC_DET_150MS 0x2
|
||||
#define TIMING_ADC_DET_200MS 0x3
|
||||
#define TIMING_ADC_DET_300MS 0x4
|
||||
#define TIMING_ADC_DET_400MS 0x5
|
||||
#define TIMING_ADC_DET_500MS 0x6
|
||||
#define TIMING_ADC_DET_600MS 0x7
|
||||
#define TIMING_ADC_DET_700MS 0x8
|
||||
#define TIMING_ADC_DET_800MS 0x9
|
||||
#define TIMING_ADC_DET_900MS 0xA
|
||||
#define TIMING_ADC_DET_1000MS 0xB
|
||||
|
||||
#define SM5502_REG_TIMING_SET2_SW_WAIT_SHIFT 4
|
||||
#define SM5502_REG_TIMING_SET2_SW_WAIT_MASK (0xf << SM5502_REG_TIMING_SET2_SW_WAIT_SHIFT)
|
||||
#define TIMING_SW_WAIT_10MS 0x0
|
||||
#define TIMING_SW_WAIT_30MS 0x1
|
||||
#define TIMING_SW_WAIT_50MS 0x2
|
||||
#define TIMING_SW_WAIT_70MS 0x3
|
||||
#define TIMING_SW_WAIT_90MS 0x4
|
||||
#define TIMING_SW_WAIT_110MS 0x5
|
||||
#define TIMING_SW_WAIT_130MS 0x6
|
||||
#define TIMING_SW_WAIT_150MS 0x7
|
||||
#define TIMING_SW_WAIT_170MS 0x8
|
||||
#define TIMING_SW_WAIT_190MS 0x9
|
||||
#define TIMING_SW_WAIT_210MS 0xA
|
||||
#define SM5502_REG_TIMING_SET2_LONG_KEY_SHIFT 0
|
||||
#define SM5502_REG_TIMING_SET2_LONG_KEY_MASK (0xf << SM5502_REG_TIMING_SET2_LONG_KEY_SHIFT)
|
||||
#define TIMING_LONG_KEY_300MS 0x0
|
||||
#define TIMING_LONG_KEY_400MS 0x1
|
||||
#define TIMING_LONG_KEY_500MS 0x2
|
||||
#define TIMING_LONG_KEY_600MS 0x3
|
||||
#define TIMING_LONG_KEY_700MS 0x4
|
||||
#define TIMING_LONG_KEY_800MS 0x5
|
||||
#define TIMING_LONG_KEY_900MS 0x6
|
||||
#define TIMING_LONG_KEY_1000MS 0x7
|
||||
#define TIMING_LONG_KEY_1100MS 0x8
|
||||
#define TIMING_LONG_KEY_1200MS 0x9
|
||||
#define TIMING_LONG_KEY_1300MS 0xA
|
||||
#define TIMING_LONG_KEY_1400MS 0xB
|
||||
#define TIMING_LONG_KEY_1500MS 0xC
|
||||
|
||||
#define SM5502_REG_DEV_TYPE1_AUDIO_TYPE1_SHIFT 0
|
||||
#define SM5502_REG_DEV_TYPE1_AUDIO_TYPE2_SHIFT 1
|
||||
#define SM5502_REG_DEV_TYPE1_USB_SDP_SHIFT 2
|
||||
#define SM5502_REG_DEV_TYPE1_UART_SHIFT 3
|
||||
#define SM5502_REG_DEV_TYPE1_CAR_KIT_CHARGER_SHIFT 4
|
||||
#define SM5502_REG_DEV_TYPE1_USB_CHG_SHIFT 5
|
||||
#define SM5502_REG_DEV_TYPE1_DEDICATED_CHG_SHIFT 6
|
||||
#define SM5502_REG_DEV_TYPE1_USB_OTG_SHIFT 7
|
||||
#define SM5502_REG_DEV_TYPE1_AUDIO_TYPE1_MASK (0x1 << SM5502_REG_DEV_TYPE1_AUDIO_TYPE1_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE1_AUDIO_TYPE1__MASK (0x1 << SM5502_REG_DEV_TYPE1_AUDIO_TYPE2_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE1_USB_SDP_MASK (0x1 << SM5502_REG_DEV_TYPE1_USB_SDP_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE1_UART_MASK (0x1 << SM5502_REG_DEV_TYPE1_UART_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE1_CAR_KIT_CHARGER_MASK (0x1 << SM5502_REG_DEV_TYPE1_CAR_KIT_CHARGER_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE1_USB_CHG_MASK (0x1 << SM5502_REG_DEV_TYPE1_USB_CHG_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE1_DEDICATED_CHG_MASK (0x1 << SM5502_REG_DEV_TYPE1_DEDICATED_CHG_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE1_USB_OTG_MASK (0x1 << SM5502_REG_DEV_TYPE1_USB_OTG_SHIFT)
|
||||
|
||||
#define SM5502_REG_DEV_TYPE2_JIG_USB_ON_SHIFT 0
|
||||
#define SM5502_REG_DEV_TYPE2_JIG_USB_OFF_SHIFT 1
|
||||
#define SM5502_REG_DEV_TYPE2_JIG_UART_ON_SHIFT 2
|
||||
#define SM5502_REG_DEV_TYPE2_JIG_UART_OFF_SHIFT 3
|
||||
#define SM5502_REG_DEV_TYPE2_PPD_SHIFT 4
|
||||
#define SM5502_REG_DEV_TYPE2_TTY_SHIFT 5
|
||||
#define SM5502_REG_DEV_TYPE2_AV_CABLE_SHIFT 6
|
||||
#define SM5502_REG_DEV_TYPE2_JIG_USB_ON_MASK (0x1 << SM5502_REG_DEV_TYPE2_JIG_USB_ON_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE2_JIG_USB_OFF_MASK (0x1 << SM5502_REG_DEV_TYPE2_JIG_USB_OFF_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE2_JIG_UART_ON_MASK (0x1 << SM5502_REG_DEV_TYPE2_JIG_UART_ON_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE2_JIG_UART_OFF_MASK (0x1 << SM5502_REG_DEV_TYPE2_JIG_UART_OFF_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE2_PPD_MASK (0x1 << SM5502_REG_DEV_TYPE2_PPD_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE2_TTY_MASK (0x1 << SM5502_REG_DEV_TYPE2_TTY_SHIFT)
|
||||
#define SM5502_REG_DEV_TYPE2_AV_CABLE_MASK (0x1 << SM5502_REG_DEV_TYPE2_AV_CABLE_SHIFT)
|
||||
|
||||
#define SM5502_REG_MANUAL_SW1_VBUSIN_SHIFT 0
|
||||
#define SM5502_REG_MANUAL_SW1_DP_SHIFT 2
|
||||
#define SM5502_REG_MANUAL_SW1_DM_SHIFT 5
|
||||
#define SM5502_REG_MANUAL_SW1_VBUSIN_MASK (0x3 << SM5502_REG_MANUAL_SW1_VBUSIN_SHIFT)
|
||||
#define SM5502_REG_MANUAL_SW1_DP_MASK (0x7 << SM5502_REG_MANUAL_SW1_DP_SHIFT)
|
||||
#define SM5502_REG_MANUAL_SW1_DM_MASK (0x7 << SM5502_REG_MANUAL_SW1_DM_SHIFT)
|
||||
#define VBUSIN_SWITCH_OPEN 0x0
|
||||
#define VBUSIN_SWITCH_VBUSOUT 0x1
|
||||
#define VBUSIN_SWITCH_MIC 0x2
|
||||
#define VBUSIN_SWITCH_VBUSOUT_WITH_USB 0x3
|
||||
#define DM_DP_CON_SWITCH_OPEN 0x0
|
||||
#define DM_DP_CON_SWITCH_USB 0x1
|
||||
#define DM_DP_CON_SWITCH_AUDIO 0x2
|
||||
#define DM_DP_CON_SWITCH_UART 0x3
|
||||
#define DM_DP_SWITCH_OPEN ((DM_DP_CON_SWITCH_OPEN <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \
|
||||
| (DM_DP_CON_SWITCH_OPEN <<SM5502_REG_MANUAL_SW1_DM_SHIFT))
|
||||
#define DM_DP_SWITCH_USB ((DM_DP_CON_SWITCH_USB <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \
|
||||
| (DM_DP_CON_SWITCH_USB <<SM5502_REG_MANUAL_SW1_DM_SHIFT))
|
||||
#define DM_DP_SWITCH_AUDIO ((DM_DP_CON_SWITCH_AUDIO <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \
|
||||
| (DM_DP_CON_SWITCH_AUDIO <<SM5502_REG_MANUAL_SW1_DM_SHIFT))
|
||||
#define DM_DP_SWITCH_UART ((DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \
|
||||
| (DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DM_SHIFT))
|
||||
|
||||
/* SM5502 Interrupts */
|
||||
enum sm5502_irq {
|
||||
/* INT1 */
|
||||
SM5502_IRQ_INT1_ATTACH,
|
||||
SM5502_IRQ_INT1_DETACH,
|
||||
SM5502_IRQ_INT1_KP,
|
||||
SM5502_IRQ_INT1_LKP,
|
||||
SM5502_IRQ_INT1_LKR,
|
||||
SM5502_IRQ_INT1_OVP_EVENT,
|
||||
SM5502_IRQ_INT1_OCP_EVENT,
|
||||
SM5502_IRQ_INT1_OVP_OCP_DIS,
|
||||
|
||||
/* INT2 */
|
||||
SM5502_IRQ_INT2_VBUS_DET,
|
||||
SM5502_IRQ_INT2_REV_ACCE,
|
||||
SM5502_IRQ_INT2_ADC_CHG,
|
||||
SM5502_IRQ_INT2_STUCK_KEY,
|
||||
SM5502_IRQ_INT2_STUCK_KEY_RCV,
|
||||
SM5502_IRQ_INT2_MHL,
|
||||
|
||||
SM5502_IRQ_NUM,
|
||||
};
|
||||
|
||||
#define SM5502_IRQ_INT1_ATTACH_MASK BIT(0)
|
||||
#define SM5502_IRQ_INT1_DETACH_MASK BIT(1)
|
||||
#define SM5502_IRQ_INT1_KP_MASK BIT(2)
|
||||
#define SM5502_IRQ_INT1_LKP_MASK BIT(3)
|
||||
#define SM5502_IRQ_INT1_LKR_MASK BIT(4)
|
||||
#define SM5502_IRQ_INT1_OVP_EVENT_MASK BIT(5)
|
||||
#define SM5502_IRQ_INT1_OCP_EVENT_MASK BIT(6)
|
||||
#define SM5502_IRQ_INT1_OVP_OCP_DIS_MASK BIT(7)
|
||||
#define SM5502_IRQ_INT2_VBUS_DET_MASK BIT(0)
|
||||
#define SM5502_IRQ_INT2_REV_ACCE_MASK BIT(1)
|
||||
#define SM5502_IRQ_INT2_ADC_CHG_MASK BIT(2)
|
||||
#define SM5502_IRQ_INT2_STUCK_KEY_MASK BIT(3)
|
||||
#define SM5502_IRQ_INT2_STUCK_KEY_RCV_MASK BIT(4)
|
||||
#define SM5502_IRQ_INT2_MHL_MASK BIT(5)
|
||||
|
||||
#endif /* __LINUX_EXTCON_SM5502_H */
|
||||
|
|
@ -15,8 +15,9 @@
|
|||
#include <linux/types.h>
|
||||
|
||||
#define F2FS_SUPER_OFFSET 1024 /* byte-size offset */
|
||||
#define F2FS_LOG_SECTOR_SIZE 9 /* 9 bits for 512 byte */
|
||||
#define F2FS_LOG_SECTORS_PER_BLOCK 3 /* 4KB: F2FS_BLKSIZE */
|
||||
#define F2FS_MIN_LOG_SECTOR_SIZE 9 /* 9 bits for 512 bytes */
|
||||
#define F2FS_MAX_LOG_SECTOR_SIZE 12 /* 12 bits for 4096 bytes */
|
||||
#define F2FS_LOG_SECTORS_PER_BLOCK 3 /* log number for sector/blk */
|
||||
#define F2FS_BLKSIZE 4096 /* support only 4KB block */
|
||||
#define F2FS_MAX_EXTENSION 64 /* # of extension entries */
|
||||
#define F2FS_BLK_ALIGN(x) (((x) + F2FS_BLKSIZE - 1) / F2FS_BLKSIZE)
|
||||
|
|
@ -32,7 +33,8 @@
|
|||
#define F2FS_META_INO(sbi) (sbi->meta_ino_num)
|
||||
|
||||
/* This flag is used by node and meta inodes, and by recovery */
|
||||
#define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO)
|
||||
#define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO)
|
||||
#define GFP_F2FS_HIGH_ZERO (GFP_NOFS | __GFP_ZERO | __GFP_HIGHMEM)
|
||||
|
||||
/*
|
||||
* For further optimization on multi-head logs, on-disk layout supports maximum
|
||||
|
|
@ -85,6 +87,7 @@ struct f2fs_super_block {
|
|||
/*
|
||||
* For checkpoint
|
||||
*/
|
||||
#define CP_FSCK_FLAG 0x00000010
|
||||
#define CP_ERROR_FLAG 0x00000008
|
||||
#define CP_COMPACT_SUM_FLAG 0x00000004
|
||||
#define CP_ORPHAN_PRESENT_FLAG 0x00000002
|
||||
|
|
@ -168,14 +171,12 @@ struct f2fs_extent {
|
|||
|
||||
#define F2FS_INLINE_XATTR 0x01 /* file inline xattr flag */
|
||||
#define F2FS_INLINE_DATA 0x02 /* file inline data flag */
|
||||
#define F2FS_INLINE_DENTRY 0x04 /* file inline dentry flag */
|
||||
#define F2FS_DATA_EXIST 0x08 /* file inline data exist flag */
|
||||
|
||||
#define MAX_INLINE_DATA (sizeof(__le32) * (DEF_ADDRS_PER_INODE - \
|
||||
F2FS_INLINE_XATTR_ADDRS - 1))
|
||||
|
||||
#define INLINE_DATA_OFFSET (PAGE_CACHE_SIZE - sizeof(struct node_footer) -\
|
||||
sizeof(__le32) * (DEF_ADDRS_PER_INODE + \
|
||||
DEF_NIDS_PER_INODE - 1))
|
||||
|
||||
struct f2fs_inode {
|
||||
__le16 i_mode; /* file mode */
|
||||
__u8 i_advise; /* file hints */
|
||||
|
|
@ -433,6 +434,24 @@ struct f2fs_dentry_block {
|
|||
__u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN];
|
||||
} __packed;
|
||||
|
||||
/* for inline dir */
|
||||
#define NR_INLINE_DENTRY (MAX_INLINE_DATA * BITS_PER_BYTE / \
|
||||
((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
|
||||
BITS_PER_BYTE + 1))
|
||||
#define INLINE_DENTRY_BITMAP_SIZE ((NR_INLINE_DENTRY + \
|
||||
BITS_PER_BYTE - 1) / BITS_PER_BYTE)
|
||||
#define INLINE_RESERVED_SIZE (MAX_INLINE_DATA - \
|
||||
((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
|
||||
NR_INLINE_DENTRY + INLINE_DENTRY_BITMAP_SIZE))
|
||||
|
||||
/* inline directory entry structure */
|
||||
struct f2fs_inline_dentry {
|
||||
__u8 dentry_bitmap[INLINE_DENTRY_BITMAP_SIZE];
|
||||
__u8 reserved[INLINE_RESERVED_SIZE];
|
||||
struct f2fs_dir_entry dentry[NR_INLINE_DENTRY];
|
||||
__u8 filename[NR_INLINE_DENTRY][F2FS_SLOT_LEN];
|
||||
} __packed;
|
||||
|
||||
/* file types used in inode_info->flags */
|
||||
enum {
|
||||
F2FS_FT_UNKNOWN,
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/atomic.h>
|
||||
|
||||
/*
|
||||
|
|
@ -25,14 +26,18 @@ struct fault_attr {
|
|||
unsigned long reject_end;
|
||||
|
||||
unsigned long count;
|
||||
struct ratelimit_state ratelimit_state;
|
||||
struct dentry *dname;
|
||||
};
|
||||
|
||||
#define FAULT_ATTR_INITIALIZER { \
|
||||
.interval = 1, \
|
||||
.times = ATOMIC_INIT(1), \
|
||||
.require_end = ULONG_MAX, \
|
||||
.stacktrace_depth = 32, \
|
||||
.verbose = 2, \
|
||||
#define FAULT_ATTR_INITIALIZER { \
|
||||
.interval = 1, \
|
||||
.times = ATOMIC_INIT(1), \
|
||||
.require_end = ULONG_MAX, \
|
||||
.stacktrace_depth = 32, \
|
||||
.ratelimit_state = RATELIMIT_STATE_INIT_DISABLED, \
|
||||
.verbose = 2, \
|
||||
.dname = NULL, \
|
||||
}
|
||||
|
||||
#define DECLARE_FAULT_ATTR(name) struct fault_attr name = FAULT_ATTR_INITIALIZER
|
||||
|
|
|
|||
|
|
@ -128,8 +128,8 @@ struct fence_cb {
|
|||
* from irq context, so normal spinlocks can be used.
|
||||
*
|
||||
* A return value of false indicates the fence already passed,
|
||||
* or some failure occured that made it impossible to enable
|
||||
* signaling. True indicates succesful enabling.
|
||||
* or some failure occurred that made it impossible to enable
|
||||
* signaling. True indicates successful enabling.
|
||||
*
|
||||
* fence->status may be set in enable_signaling, but only when false is
|
||||
* returned.
|
||||
|
|
|
|||
|
|
@ -66,7 +66,6 @@ extern void set_close_on_exec(unsigned int fd, int flag);
|
|||
extern bool get_close_on_exec(unsigned int fd);
|
||||
extern void put_filp(struct file *);
|
||||
extern int get_unused_fd_flags(unsigned flags);
|
||||
#define get_unused_fd() get_unused_fd_flags(0)
|
||||
extern void put_unused_fd(unsigned int fd);
|
||||
|
||||
extern void fd_install(unsigned int fd, struct file *file);
|
||||
|
|
|
|||
|
|
@ -4,58 +4,24 @@
|
|||
#ifndef __LINUX_FILTER_H__
|
||||
#define __LINUX_FILTER_H__
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#include <uapi/linux/filter.h>
|
||||
#include <uapi/linux/bpf.h>
|
||||
|
||||
/* Internally used and optimized filter representation with extended
|
||||
* instruction set based on top of classic BPF.
|
||||
*/
|
||||
|
||||
/* instruction classes */
|
||||
#define BPF_ALU64 0x07 /* alu mode in double word width */
|
||||
|
||||
/* ld/ldx fields */
|
||||
#define BPF_DW 0x18 /* double word */
|
||||
#define BPF_XADD 0xc0 /* exclusive add */
|
||||
|
||||
/* alu/jmp fields */
|
||||
#define BPF_MOV 0xb0 /* mov reg to reg */
|
||||
#define BPF_ARSH 0xc0 /* sign extending arithmetic shift right */
|
||||
|
||||
/* change endianness of a register */
|
||||
#define BPF_END 0xd0 /* flags for endianness conversion: */
|
||||
#define BPF_TO_LE 0x00 /* convert to little-endian */
|
||||
#define BPF_TO_BE 0x08 /* convert to big-endian */
|
||||
#define BPF_FROM_LE BPF_TO_LE
|
||||
#define BPF_FROM_BE BPF_TO_BE
|
||||
|
||||
#define BPF_JNE 0x50 /* jump != */
|
||||
#define BPF_JSGT 0x60 /* SGT is signed '>', GT in x86 */
|
||||
#define BPF_JSGE 0x70 /* SGE is signed '>=', GE in x86 */
|
||||
#define BPF_CALL 0x80 /* function call */
|
||||
#define BPF_EXIT 0x90 /* function return */
|
||||
|
||||
/* Register numbers */
|
||||
enum {
|
||||
BPF_REG_0 = 0,
|
||||
BPF_REG_1,
|
||||
BPF_REG_2,
|
||||
BPF_REG_3,
|
||||
BPF_REG_4,
|
||||
BPF_REG_5,
|
||||
BPF_REG_6,
|
||||
BPF_REG_7,
|
||||
BPF_REG_8,
|
||||
BPF_REG_9,
|
||||
BPF_REG_10,
|
||||
__MAX_BPF_REG,
|
||||
};
|
||||
|
||||
/* BPF has 10 general purpose 64-bit registers and stack frame. */
|
||||
#define MAX_BPF_REG __MAX_BPF_REG
|
||||
struct sk_buff;
|
||||
struct sock;
|
||||
struct seccomp_data;
|
||||
struct bpf_prog_aux;
|
||||
|
||||
/* ArgX, context and stack frame pointer register positions. Note,
|
||||
* Arg1, Arg2, Arg3, etc are used as argument mappings of function
|
||||
|
|
@ -161,6 +127,30 @@ enum {
|
|||
.off = 0, \
|
||||
.imm = IMM })
|
||||
|
||||
/* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */
|
||||
#define BPF_LD_IMM64(DST, IMM) \
|
||||
BPF_LD_IMM64_RAW(DST, 0, IMM)
|
||||
|
||||
#define BPF_LD_IMM64_RAW(DST, SRC, IMM) \
|
||||
((struct bpf_insn) { \
|
||||
.code = BPF_LD | BPF_DW | BPF_IMM, \
|
||||
.dst_reg = DST, \
|
||||
.src_reg = SRC, \
|
||||
.off = 0, \
|
||||
.imm = (__u32) (IMM) }), \
|
||||
((struct bpf_insn) { \
|
||||
.code = 0, /* zero is reserved opcode */ \
|
||||
.dst_reg = 0, \
|
||||
.src_reg = 0, \
|
||||
.off = 0, \
|
||||
.imm = ((__u64) (IMM)) >> 32 })
|
||||
|
||||
#define BPF_PSEUDO_MAP_FD 1
|
||||
|
||||
/* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */
|
||||
#define BPF_LD_MAP_FD(DST, MAP_FD) \
|
||||
BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD)
|
||||
|
||||
/* Short form of mov based on type, BPF_X: dst_reg = src_reg, BPF_K: dst_reg = imm32 */
|
||||
|
||||
#define BPF_MOV64_RAW(TYPE, DST, SRC, IMM) \
|
||||
|
|
@ -299,14 +289,6 @@ enum {
|
|||
#define SK_RUN_FILTER(filter, ctx) \
|
||||
(*filter->prog->bpf_func)(ctx, filter->prog->insnsi)
|
||||
|
||||
struct bpf_insn {
|
||||
__u8 code; /* opcode */
|
||||
__u8 dst_reg:4; /* dest register */
|
||||
__u8 src_reg:4; /* source register */
|
||||
__s16 off; /* signed offset */
|
||||
__s32 imm; /* signed immediate constant */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
/* A struct sock_filter is architecture independent. */
|
||||
struct compat_sock_fprog {
|
||||
|
|
@ -320,20 +302,23 @@ struct sock_fprog_kern {
|
|||
struct sock_filter *filter;
|
||||
};
|
||||
|
||||
struct sk_buff;
|
||||
struct sock;
|
||||
struct seccomp_data;
|
||||
struct bpf_binary_header {
|
||||
unsigned int pages;
|
||||
u8 image[];
|
||||
};
|
||||
|
||||
struct bpf_prog {
|
||||
u32 jited:1, /* Is our filter JIT'ed? */
|
||||
len:31; /* Number of filter blocks */
|
||||
u16 pages; /* Number of allocated pages */
|
||||
bool jited; /* Is our filter JIT'ed? */
|
||||
u32 len; /* Number of filter blocks */
|
||||
struct sock_fprog_kern *orig_prog; /* Original BPF program */
|
||||
struct bpf_prog_aux *aux; /* Auxiliary fields */
|
||||
unsigned int (*bpf_func)(const struct sk_buff *skb,
|
||||
const struct bpf_insn *filter);
|
||||
/* Instructions for interpreter */
|
||||
union {
|
||||
struct sock_filter insns[0];
|
||||
struct bpf_insn insnsi[0];
|
||||
struct work_struct work;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -353,6 +338,26 @@ static inline unsigned int bpf_prog_size(unsigned int proglen)
|
|||
|
||||
#define bpf_classic_proglen(fprog) (fprog->len * sizeof(fprog->filter[0]))
|
||||
|
||||
#ifdef CONFIG_DEBUG_SET_MODULE_RONX
|
||||
static inline void bpf_prog_lock_ro(struct bpf_prog *fp)
|
||||
{
|
||||
set_memory_ro((unsigned long)fp, fp->pages);
|
||||
}
|
||||
|
||||
static inline void bpf_prog_unlock_ro(struct bpf_prog *fp)
|
||||
{
|
||||
set_memory_rw((unsigned long)fp, fp->pages);
|
||||
}
|
||||
#else
|
||||
static inline void bpf_prog_lock_ro(struct bpf_prog *fp)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void bpf_prog_unlock_ro(struct bpf_prog *fp)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_DEBUG_SET_MODULE_RONX */
|
||||
|
||||
int sk_filter(struct sock *sk, struct sk_buff *skb);
|
||||
|
||||
void bpf_prog_select_runtime(struct bpf_prog *fp);
|
||||
|
|
@ -361,10 +366,22 @@ void bpf_prog_free(struct bpf_prog *fp);
|
|||
int bpf_convert_filter(struct sock_filter *prog, int len,
|
||||
struct bpf_insn *new_prog, int *new_len);
|
||||
|
||||
struct bpf_prog *bpf_prog_alloc(unsigned int size, gfp_t gfp_extra_flags);
|
||||
struct bpf_prog *bpf_prog_realloc(struct bpf_prog *fp_old, unsigned int size,
|
||||
gfp_t gfp_extra_flags);
|
||||
void __bpf_prog_free(struct bpf_prog *fp);
|
||||
|
||||
static inline void bpf_prog_unlock_free(struct bpf_prog *fp)
|
||||
{
|
||||
bpf_prog_unlock_ro(fp);
|
||||
__bpf_prog_free(fp);
|
||||
}
|
||||
|
||||
int bpf_prog_create(struct bpf_prog **pfp, struct sock_fprog_kern *fprog);
|
||||
void bpf_prog_destroy(struct bpf_prog *fp);
|
||||
|
||||
int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);
|
||||
int sk_attach_bpf(u32 ufd, struct sock *sk);
|
||||
int sk_detach_filter(struct sock *sk);
|
||||
|
||||
int bpf_check_classic(const struct sock_filter *filter, unsigned int flen);
|
||||
|
|
@ -377,6 +394,38 @@ void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp);
|
|||
u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
|
||||
void bpf_int_jit_compile(struct bpf_prog *fp);
|
||||
|
||||
#ifdef CONFIG_BPF_JIT
|
||||
typedef void (*bpf_jit_fill_hole_t)(void *area, unsigned int size);
|
||||
|
||||
struct bpf_binary_header *
|
||||
bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr,
|
||||
unsigned int alignment,
|
||||
bpf_jit_fill_hole_t bpf_fill_ill_insns);
|
||||
void bpf_jit_binary_free(struct bpf_binary_header *hdr);
|
||||
|
||||
void bpf_jit_compile(struct bpf_prog *fp);
|
||||
void bpf_jit_free(struct bpf_prog *fp);
|
||||
|
||||
static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen,
|
||||
u32 pass, void *image)
|
||||
{
|
||||
pr_err("flen=%u proglen=%u pass=%u image=%pK\n",
|
||||
flen, proglen, pass, image);
|
||||
if (image)
|
||||
print_hex_dump(KERN_ERR, "JIT code: ", DUMP_PREFIX_OFFSET,
|
||||
16, 1, image, proglen, false);
|
||||
}
|
||||
#else
|
||||
static inline void bpf_jit_compile(struct bpf_prog *fp)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void bpf_jit_free(struct bpf_prog *fp)
|
||||
{
|
||||
bpf_prog_unlock_free(fp);
|
||||
}
|
||||
#endif /* CONFIG_BPF_JIT */
|
||||
|
||||
#define BPF_ANC BIT(15)
|
||||
|
||||
static inline u16 bpf_anc_helper(const struct sock_filter *ftest)
|
||||
|
|
@ -424,36 +473,6 @@ static inline void *bpf_load_pointer(const struct sk_buff *skb, int k,
|
|||
return bpf_internal_load_pointer_neg_helper(skb, k, size);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BPF_JIT
|
||||
#include <stdarg.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/printk.h>
|
||||
|
||||
void bpf_jit_compile(struct bpf_prog *fp);
|
||||
void bpf_jit_free(struct bpf_prog *fp);
|
||||
|
||||
static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen,
|
||||
u32 pass, void *image)
|
||||
{
|
||||
pr_err("flen=%u proglen=%u pass=%u image=%pK\n",
|
||||
flen, proglen, pass, image);
|
||||
if (image)
|
||||
print_hex_dump(KERN_ERR, "JIT code: ", DUMP_PREFIX_OFFSET,
|
||||
16, 1, image, proglen, false);
|
||||
}
|
||||
#else
|
||||
#include <linux/slab.h>
|
||||
|
||||
static inline void bpf_jit_compile(struct bpf_prog *fp)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void bpf_jit_free(struct bpf_prog *fp)
|
||||
{
|
||||
kfree(fp);
|
||||
}
|
||||
#endif /* CONFIG_BPF_JIT */
|
||||
|
||||
static inline int bpf_tell_extensions(void)
|
||||
{
|
||||
return SKF_AD_MAX;
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/percpu_counter.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/seqlock.h>
|
||||
#include <linux/gfp.h>
|
||||
|
||||
/*
|
||||
* When maximum proportion of some event type is specified, this is the
|
||||
|
|
@ -32,7 +33,7 @@ struct fprop_global {
|
|||
seqcount_t sequence;
|
||||
};
|
||||
|
||||
int fprop_global_init(struct fprop_global *p);
|
||||
int fprop_global_init(struct fprop_global *p, gfp_t gfp);
|
||||
void fprop_global_destroy(struct fprop_global *p);
|
||||
bool fprop_new_period(struct fprop_global *p, int periods);
|
||||
|
||||
|
|
@ -79,7 +80,7 @@ struct fprop_local_percpu {
|
|||
raw_spinlock_t lock; /* Protect period and numerator */
|
||||
};
|
||||
|
||||
int fprop_local_init_percpu(struct fprop_local_percpu *pl);
|
||||
int fprop_local_init_percpu(struct fprop_local_percpu *pl, gfp_t gfp);
|
||||
void fprop_local_destroy_percpu(struct fprop_local_percpu *pl);
|
||||
void __fprop_inc_percpu(struct fprop_global *p, struct fprop_local_percpu *pl);
|
||||
void __fprop_inc_percpu_max(struct fprop_global *p, struct fprop_local_percpu *pl,
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ struct font_desc {
|
|||
#define SUN12x22_IDX 7
|
||||
#define ACORN8x8_IDX 8
|
||||
#define MINI4x6_IDX 9
|
||||
#define FONT6x10_IDX 10
|
||||
|
||||
extern const struct font_desc font_vga_8x8,
|
||||
font_vga_8x16,
|
||||
|
|
@ -41,7 +42,8 @@ extern const struct font_desc font_vga_8x8,
|
|||
font_sun_8x16,
|
||||
font_sun_12x22,
|
||||
font_acorn_8x8,
|
||||
font_mini_4x6;
|
||||
font_mini_4x6,
|
||||
font_6x10;
|
||||
|
||||
/* Find a font with a specific name */
|
||||
|
||||
|
|
|
|||
|
|
@ -246,15 +246,6 @@ static inline int freezable_schedule_hrtimeout_range(ktime_t *expires,
|
|||
* defined in <linux/wait.h>
|
||||
*/
|
||||
|
||||
#define wait_event_freezekillable(wq, condition) \
|
||||
({ \
|
||||
int __retval; \
|
||||
freezer_do_not_count(); \
|
||||
__retval = wait_event_killable(wq, (condition)); \
|
||||
freezer_count(); \
|
||||
__retval; \
|
||||
})
|
||||
|
||||
/* DO NOT ADD ANY NEW CALLERS OF THIS FUNCTION */
|
||||
#define wait_event_freezekillable_unsafe(wq, condition) \
|
||||
({ \
|
||||
|
|
@ -265,35 +256,6 @@ static inline int freezable_schedule_hrtimeout_range(ktime_t *expires,
|
|||
__retval; \
|
||||
})
|
||||
|
||||
#define wait_event_freezable(wq, condition) \
|
||||
({ \
|
||||
int __retval; \
|
||||
freezer_do_not_count(); \
|
||||
__retval = wait_event_interruptible(wq, (condition)); \
|
||||
freezer_count(); \
|
||||
__retval; \
|
||||
})
|
||||
|
||||
#define wait_event_freezable_timeout(wq, condition, timeout) \
|
||||
({ \
|
||||
long __retval = timeout; \
|
||||
freezer_do_not_count(); \
|
||||
__retval = wait_event_interruptible_timeout(wq, (condition), \
|
||||
__retval); \
|
||||
freezer_count(); \
|
||||
__retval; \
|
||||
})
|
||||
|
||||
#define wait_event_freezable_exclusive(wq, condition) \
|
||||
({ \
|
||||
int __retval; \
|
||||
freezer_do_not_count(); \
|
||||
__retval = wait_event_interruptible_exclusive(wq, condition); \
|
||||
freezer_count(); \
|
||||
__retval; \
|
||||
})
|
||||
|
||||
|
||||
#else /* !CONFIG_FREEZER */
|
||||
static inline bool frozen(struct task_struct *p) { return false; }
|
||||
static inline bool freezing(struct task_struct *p) { return false; }
|
||||
|
|
@ -331,18 +293,6 @@ static inline void set_freezable(void) {}
|
|||
#define freezable_schedule_hrtimeout_range(expires, delta, mode) \
|
||||
schedule_hrtimeout_range(expires, delta, mode)
|
||||
|
||||
#define wait_event_freezable(wq, condition) \
|
||||
wait_event_interruptible(wq, condition)
|
||||
|
||||
#define wait_event_freezable_timeout(wq, condition, timeout) \
|
||||
wait_event_interruptible_timeout(wq, condition, timeout)
|
||||
|
||||
#define wait_event_freezable_exclusive(wq, condition) \
|
||||
wait_event_interruptible_exclusive(wq, condition)
|
||||
|
||||
#define wait_event_freezekillable(wq, condition) \
|
||||
wait_event_killable(wq, condition)
|
||||
|
||||
#define wait_event_freezekillable_unsafe(wq, condition) \
|
||||
wait_event_killable(wq, condition)
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/pid.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/semaphore.h>
|
||||
#include <linux/fiemap.h>
|
||||
|
|
@ -134,7 +135,7 @@ typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
|
|||
#define FMODE_CAN_WRITE ((__force fmode_t)0x40000)
|
||||
|
||||
/* File was opened by fanotify and shouldn't generate fanotify events */
|
||||
#define FMODE_NONOTIFY ((__force fmode_t)0x1000000)
|
||||
#define FMODE_NONOTIFY ((__force fmode_t)0x4000000)
|
||||
|
||||
/*
|
||||
* Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector
|
||||
|
|
@ -192,8 +193,6 @@ typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
|
|||
#define READ 0
|
||||
#define WRITE RW_MASK
|
||||
#define READA RWA_MASK
|
||||
#define KERNEL_READ (READ|REQ_KERNEL)
|
||||
#define KERNEL_WRITE (WRITE|REQ_KERNEL)
|
||||
|
||||
#define READ_SYNC (READ | REQ_SYNC)
|
||||
#define WRITE_SYNC (WRITE | REQ_SYNC | REQ_NOIDLE)
|
||||
|
|
@ -224,6 +223,13 @@ typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
|
|||
#define ATTR_OPEN (1 << 15) /* Truncating from open(O_TRUNC) */
|
||||
#define ATTR_TIMES_SET (1 << 16)
|
||||
|
||||
/*
|
||||
* Whiteout is represented by a char device. The following constants define the
|
||||
* mode and device number to use.
|
||||
*/
|
||||
#define WHITEOUT_MODE 0
|
||||
#define WHITEOUT_DEV 0
|
||||
|
||||
/*
|
||||
* This is the Inode Attributes structure, used for notify_change(). It
|
||||
* uses the above definitions as flags, to know which values have changed.
|
||||
|
|
@ -256,6 +262,12 @@ struct iattr {
|
|||
*/
|
||||
#include <linux/quota.h>
|
||||
|
||||
/*
|
||||
* Maximum number of layers of fs stack. Needs to be limited to
|
||||
* prevent kernel stack overflow
|
||||
*/
|
||||
#define FILESYSTEM_MAX_STACK_DEPTH 2
|
||||
|
||||
/**
|
||||
* enum positive_aop_returns - aop return codes with specific semantics
|
||||
*
|
||||
|
|
@ -390,7 +402,7 @@ struct address_space {
|
|||
atomic_t i_mmap_writable;/* count VM_SHARED mappings */
|
||||
struct rb_root i_mmap; /* tree of private and shared mappings */
|
||||
struct list_head i_mmap_nonlinear;/*list VM_NONLINEAR mappings */
|
||||
struct mutex i_mmap_mutex; /* protect tree, count, list */
|
||||
struct rw_semaphore i_mmap_rwsem; /* protect tree, count, list */
|
||||
/* Protected by tree_lock together with the radix tree */
|
||||
unsigned long nrpages; /* number of total pages */
|
||||
unsigned long nrshadows; /* number of shadow entries */
|
||||
|
|
@ -456,6 +468,26 @@ struct block_device {
|
|||
|
||||
int mapping_tagged(struct address_space *mapping, int tag);
|
||||
|
||||
static inline void i_mmap_lock_write(struct address_space *mapping)
|
||||
{
|
||||
down_write(&mapping->i_mmap_rwsem);
|
||||
}
|
||||
|
||||
static inline void i_mmap_unlock_write(struct address_space *mapping)
|
||||
{
|
||||
up_write(&mapping->i_mmap_rwsem);
|
||||
}
|
||||
|
||||
static inline void i_mmap_lock_read(struct address_space *mapping)
|
||||
{
|
||||
down_read(&mapping->i_mmap_rwsem);
|
||||
}
|
||||
|
||||
static inline void i_mmap_unlock_read(struct address_space *mapping)
|
||||
{
|
||||
up_read(&mapping->i_mmap_rwsem);
|
||||
}
|
||||
|
||||
/*
|
||||
* Might pages of this file be mapped into userspace?
|
||||
*/
|
||||
|
|
@ -595,9 +627,6 @@ struct inode {
|
|||
const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
|
||||
struct file_lock *i_flock;
|
||||
struct address_space i_data;
|
||||
#ifdef CONFIG_QUOTA
|
||||
struct dquot *i_dquot[MAXQUOTAS];
|
||||
#endif
|
||||
struct list_head i_devices;
|
||||
union {
|
||||
struct pipe_inode_info *i_pipe;
|
||||
|
|
@ -628,11 +657,13 @@ static inline int inode_unhashed(struct inode *inode)
|
|||
* 2: child/target
|
||||
* 3: xattr
|
||||
* 4: second non-directory
|
||||
* The last is for certain operations (such as rename) which lock two
|
||||
* 5: second parent (when locking independent directories in rename)
|
||||
*
|
||||
* I_MUTEX_NONDIR2 is for certain operations (such as rename) which lock two
|
||||
* non-directories at once.
|
||||
*
|
||||
* The locking order between these classes is
|
||||
* parent -> child -> normal -> xattr -> second non-directory
|
||||
* parent[2] -> child -> grandchild -> normal -> xattr -> second non-directory
|
||||
*/
|
||||
enum inode_i_mutex_lock_class
|
||||
{
|
||||
|
|
@ -640,7 +671,8 @@ enum inode_i_mutex_lock_class
|
|||
I_MUTEX_PARENT,
|
||||
I_MUTEX_CHILD,
|
||||
I_MUTEX_XATTR,
|
||||
I_MUTEX_NONDIR2
|
||||
I_MUTEX_NONDIR2,
|
||||
I_MUTEX_PARENT2,
|
||||
};
|
||||
|
||||
void lock_two_nondirectories(struct inode *, struct inode*);
|
||||
|
|
@ -775,7 +807,6 @@ struct file {
|
|||
struct rcu_head fu_rcuhead;
|
||||
} f_u;
|
||||
struct path f_path;
|
||||
#define f_dentry f_path.dentry
|
||||
struct inode *f_inode; /* cached value */
|
||||
const struct file_operations *f_op;
|
||||
|
||||
|
|
@ -851,13 +882,7 @@ static inline struct file *get_file(struct file *f)
|
|||
*/
|
||||
#define FILE_LOCK_DEFERRED 1
|
||||
|
||||
/*
|
||||
* The POSIX file lock owner is determined by
|
||||
* the "struct files_struct" in the thread group
|
||||
* (or NULL for no owner - BSD locks).
|
||||
*
|
||||
* Lockd stuffs a "host" pointer into this.
|
||||
*/
|
||||
/* legacy typedef, should eventually be removed */
|
||||
typedef void *fl_owner_t;
|
||||
|
||||
struct file_lock_operations {
|
||||
|
|
@ -868,10 +893,13 @@ struct file_lock_operations {
|
|||
struct lock_manager_operations {
|
||||
int (*lm_compare_owner)(struct file_lock *, struct file_lock *);
|
||||
unsigned long (*lm_owner_key)(struct file_lock *);
|
||||
void (*lm_get_owner)(struct file_lock *, struct file_lock *);
|
||||
void (*lm_put_owner)(struct file_lock *);
|
||||
void (*lm_notify)(struct file_lock *); /* unblock callback */
|
||||
int (*lm_grant)(struct file_lock *, struct file_lock *, int);
|
||||
void (*lm_break)(struct file_lock *);
|
||||
int (*lm_change)(struct file_lock **, int);
|
||||
int (*lm_grant)(struct file_lock *, int);
|
||||
bool (*lm_break)(struct file_lock *);
|
||||
int (*lm_change)(struct file_lock **, int, struct list_head *);
|
||||
void (*lm_setup)(struct file_lock *, void **);
|
||||
};
|
||||
|
||||
struct lock_manager {
|
||||
|
|
@ -966,7 +994,7 @@ void locks_free_lock(struct file_lock *fl);
|
|||
extern void locks_init_lock(struct file_lock *);
|
||||
extern struct file_lock * locks_alloc_lock(void);
|
||||
extern void locks_copy_lock(struct file_lock *, struct file_lock *);
|
||||
extern void __locks_copy_lock(struct file_lock *, const struct file_lock *);
|
||||
extern void locks_copy_conflock(struct file_lock *, struct file_lock *);
|
||||
extern void locks_remove_posix(struct file *, fl_owner_t);
|
||||
extern void locks_remove_file(struct file *);
|
||||
extern void locks_release_private(struct file_lock *);
|
||||
|
|
@ -980,11 +1008,9 @@ extern int vfs_cancel_lock(struct file *filp, struct file_lock *fl);
|
|||
extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl);
|
||||
extern int __break_lease(struct inode *inode, unsigned int flags, unsigned int type);
|
||||
extern void lease_get_mtime(struct inode *, struct timespec *time);
|
||||
extern int generic_setlease(struct file *, long, struct file_lock **);
|
||||
extern int vfs_setlease(struct file *, long, struct file_lock **);
|
||||
extern int lease_modify(struct file_lock **, int);
|
||||
extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
|
||||
extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
|
||||
extern int generic_setlease(struct file *, long, struct file_lock **, void **priv);
|
||||
extern int vfs_setlease(struct file *, long, struct file_lock **, void **);
|
||||
extern int lease_modify(struct file_lock **, int, struct list_head *);
|
||||
#else /* !CONFIG_FILE_LOCKING */
|
||||
static inline int fcntl_getlk(struct file *file, unsigned int cmd,
|
||||
struct flock __user *user)
|
||||
|
|
@ -1013,12 +1039,12 @@ static inline int fcntl_setlk64(unsigned int fd, struct file *file,
|
|||
#endif
|
||||
static inline int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
|
||||
{
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int fcntl_getlease(struct file *filp)
|
||||
{
|
||||
return 0;
|
||||
return F_UNLCK;
|
||||
}
|
||||
|
||||
static inline void locks_init_lock(struct file_lock *fl)
|
||||
|
|
@ -1026,7 +1052,7 @@ static inline void locks_init_lock(struct file_lock *fl)
|
|||
return;
|
||||
}
|
||||
|
||||
static inline void __locks_copy_lock(struct file_lock *new, struct file_lock *fl)
|
||||
static inline void locks_copy_conflock(struct file_lock *new, struct file_lock *fl)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -1100,33 +1126,22 @@ static inline void lease_get_mtime(struct inode *inode, struct timespec *time)
|
|||
}
|
||||
|
||||
static inline int generic_setlease(struct file *filp, long arg,
|
||||
struct file_lock **flp)
|
||||
struct file_lock **flp, void **priv)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int vfs_setlease(struct file *filp, long arg,
|
||||
struct file_lock **lease)
|
||||
struct file_lock **lease, void **priv)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int lease_modify(struct file_lock **before, int arg)
|
||||
static inline int lease_modify(struct file_lock **before, int arg,
|
||||
struct list_head *dispose)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int lock_may_read(struct inode *inode, loff_t start,
|
||||
unsigned long len)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int lock_may_write(struct inode *inode, loff_t start,
|
||||
unsigned long len)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
#endif /* !CONFIG_FILE_LOCKING */
|
||||
|
||||
|
||||
|
|
@ -1151,8 +1166,8 @@ extern void fasync_free(struct fasync_struct *);
|
|||
/* can be called from interrupts */
|
||||
extern void kill_fasync(struct fasync_struct **, int, int);
|
||||
|
||||
extern int __f_setown(struct file *filp, struct pid *, enum pid_type, int force);
|
||||
extern int f_setown(struct file *filp, unsigned long arg, int force);
|
||||
extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force);
|
||||
extern void f_setown(struct file *filp, unsigned long arg, int force);
|
||||
extern void f_delown(struct file *filp);
|
||||
extern pid_t f_getown(struct file *filp);
|
||||
extern int send_sigurg(struct fown_struct *fown);
|
||||
|
|
@ -1226,6 +1241,7 @@ struct super_block {
|
|||
struct backing_dev_info *s_bdi;
|
||||
struct mtd_info *s_mtd;
|
||||
struct hlist_node s_instances;
|
||||
unsigned int s_quota_types; /* Bitmask of supported quota types */
|
||||
struct quota_info s_dquot; /* Diskquota specific options */
|
||||
|
||||
struct sb_writers s_writers;
|
||||
|
|
@ -1284,6 +1300,11 @@ struct super_block {
|
|||
struct list_lru s_dentry_lru ____cacheline_aligned_in_smp;
|
||||
struct list_lru s_inode_lru ____cacheline_aligned_in_smp;
|
||||
struct rcu_head rcu;
|
||||
|
||||
/*
|
||||
* Indicates how deep in a filesystem stack this SB is
|
||||
*/
|
||||
int s_stack_depth;
|
||||
};
|
||||
|
||||
extern struct timespec current_fs_time(struct super_block *sb);
|
||||
|
|
@ -1416,6 +1437,7 @@ extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct ino
|
|||
extern int vfs_rmdir(struct inode *, struct dentry *);
|
||||
extern int vfs_unlink(struct inode *, struct dentry *, struct inode **);
|
||||
extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int);
|
||||
extern int vfs_whiteout(struct inode *, struct dentry *);
|
||||
|
||||
/*
|
||||
* VFS dentry helper functions.
|
||||
|
|
@ -1463,7 +1485,10 @@ int fiemap_check_flags(struct fiemap_extent_info *fieinfo, u32 fs_flags);
|
|||
* This allows the kernel to read directories into kernel space or
|
||||
* to have different dirent layouts depending on the binary type.
|
||||
*/
|
||||
typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
|
||||
struct dir_context;
|
||||
typedef int (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64,
|
||||
unsigned);
|
||||
|
||||
struct dir_context {
|
||||
const filldir_t actor;
|
||||
loff_t pos;
|
||||
|
|
@ -1493,6 +1518,7 @@ struct file_operations {
|
|||
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
int (*mmap) (struct file *, struct vm_area_struct *);
|
||||
void (*mremap)(struct file *, struct vm_area_struct *);
|
||||
int (*open) (struct inode *, struct file *);
|
||||
int (*flush) (struct file *, fl_owner_t id);
|
||||
int (*release) (struct inode *, struct file *);
|
||||
|
|
@ -1506,10 +1532,10 @@ struct file_operations {
|
|||
int (*flock) (struct file *, int, struct file_lock *);
|
||||
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
|
||||
ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
|
||||
int (*setlease)(struct file *, long, struct file_lock **);
|
||||
int (*setlease)(struct file *, long, struct file_lock **, void **);
|
||||
long (*fallocate)(struct file *file, int mode, loff_t offset,
|
||||
loff_t len);
|
||||
int (*show_fdinfo)(struct seq_file *m, struct file *f);
|
||||
void (*show_fdinfo)(struct seq_file *m, struct file *f);
|
||||
};
|
||||
|
||||
struct inode_operations {
|
||||
|
|
@ -1546,6 +1572,9 @@ struct inode_operations {
|
|||
umode_t create_mode, int *opened);
|
||||
int (*tmpfile) (struct inode *, struct dentry *, umode_t);
|
||||
int (*set_acl)(struct inode *, struct posix_acl *, int);
|
||||
|
||||
/* WARNING: probably going away soon, do not use! */
|
||||
int (*dentry_open)(struct dentry *, struct file *, const struct cred *);
|
||||
} ____cacheline_aligned;
|
||||
|
||||
ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
|
||||
|
|
@ -1553,6 +1582,7 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
|
|||
struct iovec *fast_pointer,
|
||||
struct iovec **ret_pointer);
|
||||
|
||||
extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *);
|
||||
extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
|
||||
extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
|
||||
extern ssize_t vfs_readv(struct file *, const struct iovec __user *,
|
||||
|
|
@ -1570,7 +1600,9 @@ struct super_operations {
|
|||
void (*evict_inode) (struct inode *);
|
||||
void (*put_super) (struct super_block *);
|
||||
int (*sync_fs)(struct super_block *sb, int wait);
|
||||
int (*freeze_super) (struct super_block *);
|
||||
int (*freeze_fs) (struct super_block *);
|
||||
int (*thaw_super) (struct super_block *);
|
||||
int (*unfreeze_fs) (struct super_block *);
|
||||
int (*statfs) (struct dentry *, struct kstatfs *);
|
||||
int (*remount_fs) (struct super_block *, int *, char *);
|
||||
|
|
@ -1583,6 +1615,7 @@ struct super_operations {
|
|||
#ifdef CONFIG_QUOTA
|
||||
ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
|
||||
ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
|
||||
struct dquot **(*get_dquots)(struct inode *);
|
||||
#endif
|
||||
int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
|
||||
long (*nr_cached_objects)(struct super_block *, int);
|
||||
|
|
@ -1643,6 +1676,9 @@ struct super_operations {
|
|||
#define IS_AUTOMOUNT(inode) ((inode)->i_flags & S_AUTOMOUNT)
|
||||
#define IS_NOSEC(inode) ((inode)->i_flags & S_NOSEC)
|
||||
|
||||
#define IS_WHITEOUT(inode) (S_ISCHR(inode->i_mode) && \
|
||||
(inode)->i_rdev == WHITEOUT_DEV)
|
||||
|
||||
/*
|
||||
* Inode state bits. Protected by inode->i_lock
|
||||
*
|
||||
|
|
@ -1855,7 +1891,8 @@ extern struct vfsmount *kern_mount_data(struct file_system_type *, void *data);
|
|||
extern void kern_unmount(struct vfsmount *mnt);
|
||||
extern int may_umount_tree(struct vfsmount *);
|
||||
extern int may_umount(struct vfsmount *);
|
||||
extern long do_mount(const char *, const char *, const char *, unsigned long, void *);
|
||||
extern long do_mount(const char *, const char __user *,
|
||||
const char *, unsigned long, void *);
|
||||
extern struct vfsmount *collect_mounts(struct path *);
|
||||
extern void drop_collected_mounts(struct vfsmount *);
|
||||
extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *,
|
||||
|
|
@ -1874,7 +1911,7 @@ extern int current_umask(void);
|
|||
extern void ihold(struct inode * inode);
|
||||
extern void iput(struct inode *);
|
||||
|
||||
static inline struct inode *file_inode(struct file *f)
|
||||
static inline struct inode *file_inode(const struct file *f)
|
||||
{
|
||||
return f->f_inode;
|
||||
}
|
||||
|
|
@ -2049,7 +2086,7 @@ struct filename {
|
|||
extern long vfs_truncate(struct path *, loff_t);
|
||||
extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs,
|
||||
struct file *filp);
|
||||
extern int do_fallocate(struct file *file, int mode, loff_t offset,
|
||||
extern int vfs_fallocate(struct file *file, int mode, loff_t offset,
|
||||
loff_t len);
|
||||
extern long do_sys_open(int dfd, const char __user *filename, int flags,
|
||||
umode_t mode);
|
||||
|
|
@ -2057,9 +2094,11 @@ extern struct file *file_open_name(struct filename *, int, umode_t);
|
|||
extern struct file *filp_open(const char *, int, umode_t);
|
||||
extern struct file *file_open_root(struct dentry *, struct vfsmount *,
|
||||
const char *, int);
|
||||
extern int vfs_open(const struct path *, struct file *, const struct cred *);
|
||||
extern struct file * dentry_open(const struct path *, int, const struct cred *);
|
||||
extern int filp_close(struct file *, fl_owner_t id);
|
||||
|
||||
extern struct filename *getname_flags(const char __user *, int, int *);
|
||||
extern struct filename *getname(const char __user *);
|
||||
extern struct filename *getname_kernel(const char *);
|
||||
|
||||
|
|
@ -2137,7 +2176,6 @@ static inline int sb_is_blkdev_sb(struct super_block *sb)
|
|||
extern int sync_filesystem(struct super_block *);
|
||||
extern const struct file_operations def_blk_fops;
|
||||
extern const struct file_operations def_chr_fops;
|
||||
extern const struct file_operations bad_sock_fops;
|
||||
#ifdef CONFIG_BLOCK
|
||||
extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
|
||||
extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long);
|
||||
|
|
@ -2270,7 +2308,9 @@ extern sector_t bmap(struct inode *, sector_t);
|
|||
#endif
|
||||
extern int notify_change(struct dentry *, struct iattr *, struct inode **);
|
||||
extern int inode_permission(struct inode *, int);
|
||||
extern int __inode_permission(struct inode *, int);
|
||||
extern int generic_permission(struct inode *, int);
|
||||
extern int __check_sticky(struct inode *dir, struct inode *inode);
|
||||
|
||||
static inline bool execute_ok(struct inode *inode)
|
||||
{
|
||||
|
|
@ -2455,6 +2495,7 @@ extern ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, lo
|
|||
extern ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos);
|
||||
|
||||
/* fs/block_dev.c */
|
||||
extern ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to);
|
||||
extern ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from);
|
||||
extern int blkdev_fsync(struct file *filp, loff_t start, loff_t end,
|
||||
int datasync);
|
||||
|
|
@ -2469,6 +2510,9 @@ extern ssize_t iter_file_splice_write(struct pipe_inode_info *,
|
|||
struct file *, loff_t *, size_t, unsigned int);
|
||||
extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe,
|
||||
struct file *out, loff_t *, size_t len, unsigned int flags);
|
||||
extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
|
||||
loff_t *opos, size_t len, unsigned int flags);
|
||||
|
||||
|
||||
extern void
|
||||
file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping);
|
||||
|
|
@ -2611,6 +2655,7 @@ extern int simple_write_end(struct file *file, struct address_space *mapping,
|
|||
struct page *page, void *fsdata);
|
||||
extern int always_delete_dentry(const struct dentry *);
|
||||
extern struct inode *alloc_anon_inode(struct super_block *);
|
||||
extern int simple_nosetlease(struct file *, long, struct file_lock **, void **);
|
||||
extern const struct dentry_operations simple_dentry_operations;
|
||||
|
||||
extern struct dentry *simple_lookup(struct inode *, struct dentry *, unsigned int flags);
|
||||
|
|
@ -2753,12 +2798,25 @@ static inline int is_sxid(umode_t mode)
|
|||
return (mode & S_ISUID) || ((mode & S_ISGID) && (mode & S_IXGRP));
|
||||
}
|
||||
|
||||
static inline int check_sticky(struct inode *dir, struct inode *inode)
|
||||
{
|
||||
if (!(dir->i_mode & S_ISVTX))
|
||||
return 0;
|
||||
|
||||
return __check_sticky(dir, inode);
|
||||
}
|
||||
|
||||
static inline void inode_has_no_xattr(struct inode *inode)
|
||||
{
|
||||
if (!is_sxid(inode->i_mode) && (inode->i_sb->s_flags & MS_NOSEC))
|
||||
inode->i_flags |= S_NOSEC;
|
||||
}
|
||||
|
||||
static inline bool is_root_inode(struct inode *inode)
|
||||
{
|
||||
return inode == inode->i_sb->s_root->d_inode;
|
||||
}
|
||||
|
||||
static inline bool dir_emit(struct dir_context *ctx,
|
||||
const char *name, int namelen,
|
||||
u64 ino, unsigned type)
|
||||
|
|
|
|||
|
|
@ -139,7 +139,6 @@ struct fs_platform_info {
|
|||
int rx_ring, tx_ring; /* number of buffers on rx */
|
||||
__u8 macaddr[ETH_ALEN]; /* mac address */
|
||||
int rx_copybreak; /* limit we copy small frames */
|
||||
int use_napi; /* use NAPI */
|
||||
int napi_weight; /* NAPI weight */
|
||||
|
||||
int use_rmii; /* use RMII mode */
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue