Linux 5.13-rc2
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmChnGAeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGBS0IAJKCWwkob9JbkWOI rWSOSi5K9RKGhNHvMh9q7iPL69k/dpa8dxYMBqybD1Gm4WTCdD4sImAXgCjJmL13 DDddNSFRxafhgD06qx2otYJrCzqIB6QJUij9/GdD4KpRgpsKf/7aYrmJB8WlPxjC nw0gfkpHThbJ8LhfUaoUSZqzX8GWvmoemdy+8Ihff5vGWIs+MREcGTtEds2hwiVG qnaGrD8q3FEwpqlygX5aSgDhc2IlqHf7240CKpYRMVEOJG67vjioOzEUG5ZGU0Ng FnExscjc6Jn+uuoVZp++ATx8GACYEx87MWaHNJ5e3abpRG0Za3HUbYEtg55AMTPK 3v/j9KE= =4Jt+ -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmCj6lYACgkQJNaLcl1U h9D2lAf/WSv9JuXPU4bFmwQoBki6TwZ0q50McFO3Bu7zKAvXI4YIih6v7ga8+E72 ZNFaZt85yo/kA71UZT5RJ1RmPRm94UYjez31QCqBNHM5htSBkauQg1472vIxXtFp M434fbYQk/rG7OiZWKaQ/sdF8HwCqubpadvCdjTRWWosjZQ5dPVIBFWitcCecp/W P7xFm4j6wZLoLlQLVxyv6yzKTovtVDby7sahTPnKHBpwTb9C21WgVwQYFxoWaYJq qZNgq7AHiVcI+0IwNxLyUjQ8wHVjbcYOHY3UoUFCVX0dbA6jDc+1hvOW0HEVfBks SKuGmTOapxEa3jOxUKnihRQPsFphTA== =ki2z -----END PGP SIGNATURE----- Merge tag 'v5.13-rc2' into spi-5.13 Linux 5.13-rc2
This commit is contained in:
commit
c37fe6aff8
12993 changed files with 647764 additions and 255257 deletions
|
|
@ -222,10 +222,14 @@ void __iomem *__acpi_map_table(unsigned long phys, unsigned long size);
|
|||
void __acpi_unmap_table(void __iomem *map, unsigned long size);
|
||||
int early_acpi_boot_init(void);
|
||||
int acpi_boot_init (void);
|
||||
void acpi_boot_table_prepare (void);
|
||||
void acpi_boot_table_init (void);
|
||||
int acpi_mps_check (void);
|
||||
int acpi_numa_init (void);
|
||||
|
||||
int acpi_locate_initial_tables (void);
|
||||
void acpi_reserve_initial_tables (void);
|
||||
void acpi_table_init_complete (void);
|
||||
int acpi_table_init (void);
|
||||
int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
|
||||
int __init acpi_table_parse_entries(char *id, unsigned long table_size,
|
||||
|
|
@ -744,6 +748,11 @@ acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline bool acpi_reduced_hardware(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void acpi_dev_put(struct acpi_device *adev) {}
|
||||
|
||||
static inline bool is_acpi_node(const struct fwnode_handle *fwnode)
|
||||
|
|
@ -814,9 +823,12 @@ static inline int acpi_boot_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void acpi_boot_table_prepare(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void acpi_boot_table_init(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int acpi_mps_check(void)
|
||||
|
|
@ -1027,9 +1039,14 @@ static inline void acpi_ec_set_gpe_wake_mask(u8 action) {}
|
|||
__printf(3, 4)
|
||||
void acpi_handle_printk(const char *level, acpi_handle handle,
|
||||
const char *fmt, ...);
|
||||
void acpi_evaluation_failure_warn(acpi_handle handle, const char *name,
|
||||
acpi_status status);
|
||||
#else /* !CONFIG_ACPI */
|
||||
static inline __printf(3, 4) void
|
||||
acpi_handle_printk(const char *level, void *handle, const char *fmt, ...) {}
|
||||
static inline void acpi_evaluation_failure_warn(acpi_handle handle,
|
||||
const char *name,
|
||||
acpi_status status) {}
|
||||
#endif /* !CONFIG_ACPI */
|
||||
|
||||
#if defined(CONFIG_ACPI) && defined(CONFIG_DYNAMIC_DEBUG)
|
||||
|
|
@ -1079,19 +1096,25 @@ void __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, const c
|
|||
#if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB)
|
||||
bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
|
||||
struct acpi_resource_gpio **agpio);
|
||||
int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index);
|
||||
int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index);
|
||||
#else
|
||||
static inline bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
|
||||
struct acpi_resource_gpio **agpio)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)
|
||||
static inline int acpi_dev_gpio_irq_get_by(struct acpi_device *adev,
|
||||
const char *name, int index)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)
|
||||
{
|
||||
return acpi_dev_gpio_irq_get_by(adev, NULL, index);
|
||||
}
|
||||
|
||||
/* Device properties */
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
|
|
|||
15
include/linux/align.h
Normal file
15
include/linux/align.h
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _LINUX_ALIGN_H
|
||||
#define _LINUX_ALIGN_H
|
||||
|
||||
#include <linux/const.h>
|
||||
|
||||
/* @a is a power of 2 value */
|
||||
#define ALIGN(x, a) __ALIGN_KERNEL((x), (a))
|
||||
#define ALIGN_DOWN(x, a) __ALIGN_KERNEL((x) - ((a) - 1), (a))
|
||||
#define __ALIGN_MASK(x, mask) __ALIGN_KERNEL_MASK((x), (mask))
|
||||
#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a)))
|
||||
#define PTR_ALIGN_DOWN(p, a) ((typeof(p))ALIGN_DOWN((unsigned long)(p), (a)))
|
||||
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0)
|
||||
|
||||
#endif /* _LINUX_ALIGN_H */
|
||||
|
|
@ -105,8 +105,19 @@ extern struct bus_type amba_bustype;
|
|||
#define amba_get_drvdata(d) dev_get_drvdata(&d->dev)
|
||||
#define amba_set_drvdata(d,p) dev_set_drvdata(&d->dev, p)
|
||||
|
||||
#ifdef CONFIG_ARM_AMBA
|
||||
int amba_driver_register(struct amba_driver *);
|
||||
void amba_driver_unregister(struct amba_driver *);
|
||||
#else
|
||||
static inline int amba_driver_register(struct amba_driver *drv)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline void amba_driver_unregister(struct amba_driver *drv)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
|
||||
void amba_device_put(struct amba_device *);
|
||||
int amba_device_add(struct amba_device *, struct resource *);
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct amd_iommu;
|
||||
|
||||
/*
|
||||
* This is mainly used to communicate information back-and-forth
|
||||
* between SVM and IOMMU for setting up and tearing down posted
|
||||
|
|
@ -32,24 +34,6 @@ struct pci_dev;
|
|||
extern int amd_iommu_detect(void);
|
||||
extern int amd_iommu_init_hardware(void);
|
||||
|
||||
/**
|
||||
* amd_iommu_enable_device_erratum() - Enable erratum workaround for device
|
||||
* in the IOMMUv2 driver
|
||||
* @pdev: The PCI device the workaround is necessary for
|
||||
* @erratum: The erratum workaround to enable
|
||||
*
|
||||
* The function needs to be called before amd_iommu_init_device().
|
||||
* Possible values for the erratum number are for now:
|
||||
* - AMD_PRI_DEV_ERRATUM_ENABLE_RESET - Reset PRI capability when PRI
|
||||
* is enabled
|
||||
* - AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE - Limit number of outstanding PRI
|
||||
* requests to one
|
||||
*/
|
||||
#define AMD_PRI_DEV_ERRATUM_ENABLE_RESET 0
|
||||
#define AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE 1
|
||||
|
||||
extern void amd_iommu_enable_device_erratum(struct pci_dev *pdev, u32 erratum);
|
||||
|
||||
/**
|
||||
* amd_iommu_init_device() - Init device for use with IOMMUv2 driver
|
||||
* @pdev: The PCI device to initialize
|
||||
|
|
@ -212,4 +196,14 @@ static inline int amd_iommu_deactivate_guest_mode(void *data)
|
|||
}
|
||||
#endif /* defined(CONFIG_AMD_IOMMU) && defined(CONFIG_IRQ_REMAP) */
|
||||
|
||||
int amd_iommu_get_num_iommus(void);
|
||||
bool amd_iommu_pc_supported(void);
|
||||
u8 amd_iommu_pc_get_max_banks(unsigned int idx);
|
||||
u8 amd_iommu_pc_get_max_counters(unsigned int idx);
|
||||
int amd_iommu_pc_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn,
|
||||
u64 *value);
|
||||
int amd_iommu_pc_get_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn,
|
||||
u64 *value);
|
||||
struct amd_iommu *get_amd_iommu(unsigned int idx);
|
||||
|
||||
#endif /* _ASM_X86_AMD_IOMMU_H */
|
||||
|
|
|
|||
|
|
@ -23,18 +23,31 @@ static inline unsigned long topology_get_cpu_scale(int cpu)
|
|||
|
||||
void topology_set_cpu_scale(unsigned int cpu, unsigned long capacity);
|
||||
|
||||
DECLARE_PER_CPU(unsigned long, freq_scale);
|
||||
DECLARE_PER_CPU(unsigned long, arch_freq_scale);
|
||||
|
||||
static inline unsigned long topology_get_freq_scale(int cpu)
|
||||
{
|
||||
return per_cpu(freq_scale, cpu);
|
||||
return per_cpu(arch_freq_scale, cpu);
|
||||
}
|
||||
|
||||
void topology_set_freq_scale(const struct cpumask *cpus, unsigned long cur_freq,
|
||||
unsigned long max_freq);
|
||||
bool topology_scale_freq_invariant(void);
|
||||
|
||||
bool arch_freq_counters_available(const struct cpumask *cpus);
|
||||
enum scale_freq_source {
|
||||
SCALE_FREQ_SOURCE_CPUFREQ = 0,
|
||||
SCALE_FREQ_SOURCE_ARCH,
|
||||
SCALE_FREQ_SOURCE_CPPC,
|
||||
};
|
||||
|
||||
struct scale_freq_data {
|
||||
enum scale_freq_source source;
|
||||
void (*set_freq_scale)(void);
|
||||
};
|
||||
|
||||
void topology_scale_freq_tick(void);
|
||||
void topology_set_scale_freq_source(struct scale_freq_data *data, const struct cpumask *cpus);
|
||||
void topology_clear_scale_freq_source(enum scale_freq_source source, const struct cpumask *cpus);
|
||||
|
||||
DECLARE_PER_CPU(unsigned long, thermal_pressure);
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@
|
|||
#define ARM_SMCCC_OWNER_TRUSTED_OS 50
|
||||
#define ARM_SMCCC_OWNER_TRUSTED_OS_END 63
|
||||
|
||||
#define ARM_SMCCC_FUNC_QUERY_CALL_UID 0xff01
|
||||
|
||||
#define ARM_SMCCC_QUIRK_NONE 0
|
||||
#define ARM_SMCCC_QUIRK_QCOM_A6 1 /* Save/restore register a6 */
|
||||
|
||||
|
|
@ -87,8 +89,47 @@
|
|||
ARM_SMCCC_SMC_32, \
|
||||
0, 0x7fff)
|
||||
|
||||
#define ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_32, \
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_FUNC_QUERY_CALL_UID)
|
||||
|
||||
/* KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74 */
|
||||
#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0 0xb66fb428U
|
||||
#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1 0xe911c52eU
|
||||
#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2 0x564bcaa9U
|
||||
#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3 0x743a004dU
|
||||
|
||||
/* KVM "vendor specific" services */
|
||||
#define ARM_SMCCC_KVM_FUNC_FEATURES 0
|
||||
#define ARM_SMCCC_KVM_FUNC_PTP 1
|
||||
#define ARM_SMCCC_KVM_FUNC_FEATURES_2 127
|
||||
#define ARM_SMCCC_KVM_NUM_FUNCS 128
|
||||
|
||||
#define ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_32, \
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_FEATURES)
|
||||
|
||||
#define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED 1
|
||||
|
||||
/*
|
||||
* ptp_kvm is a feature used for time sync between vm and host.
|
||||
* ptp_kvm module in guest kernel will get service from host using
|
||||
* this hypercall ID.
|
||||
*/
|
||||
#define ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_32, \
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_PTP)
|
||||
|
||||
/* ptp_kvm counter type ID */
|
||||
#define KVM_PTP_VIRT_COUNTER 0
|
||||
#define KVM_PTP_PHYS_COUNTER 1
|
||||
|
||||
/* Paravirtualised time calls (defined by ARM DEN0057A) */
|
||||
#define ARM_SMCCC_HV_PV_TIME_FEATURES \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* rWTM BIU Mailbox driver for Armada 37xx
|
||||
*
|
||||
* Author: Marek Behun <marek.behun@nic.cz>
|
||||
* Author: Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_ARMADA_37XX_RWTM_MAILBOX_H_
|
||||
|
|
|
|||
32
include/linux/asn1_encoder.h
Normal file
32
include/linux/asn1_encoder.h
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#ifndef _LINUX_ASN1_ENCODER_H
|
||||
#define _LINUX_ASN1_ENCODER_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/asn1.h>
|
||||
#include <linux/asn1_ber_bytecode.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
#define asn1_oid_len(oid) (sizeof(oid)/sizeof(u32))
|
||||
unsigned char *
|
||||
asn1_encode_integer(unsigned char *data, const unsigned char *end_data,
|
||||
s64 integer);
|
||||
unsigned char *
|
||||
asn1_encode_oid(unsigned char *data, const unsigned char *end_data,
|
||||
u32 oid[], int oid_len);
|
||||
unsigned char *
|
||||
asn1_encode_tag(unsigned char *data, const unsigned char *end_data,
|
||||
u32 tag, const unsigned char *string, int len);
|
||||
unsigned char *
|
||||
asn1_encode_octet_string(unsigned char *data,
|
||||
const unsigned char *end_data,
|
||||
const unsigned char *string, u32 len);
|
||||
unsigned char *
|
||||
asn1_encode_sequence(unsigned char *data, const unsigned char *end_data,
|
||||
const unsigned char *seq, int len);
|
||||
unsigned char *
|
||||
asn1_encode_boolean(unsigned char *data, const unsigned char *end_data,
|
||||
bool val);
|
||||
|
||||
#endif
|
||||
|
|
@ -112,7 +112,6 @@ async_schedule_dev_domain(async_func_t func, struct device *dev,
|
|||
return async_schedule_node_domain(func, dev, dev_to_node(dev), domain);
|
||||
}
|
||||
|
||||
void async_unregister_domain(struct async_domain *domain);
|
||||
extern void async_synchronize_full(void);
|
||||
extern void async_synchronize_full_domain(struct async_domain *domain);
|
||||
extern void async_synchronize_cookie(async_cookie_t cookie);
|
||||
|
|
|
|||
|
|
@ -1,12 +0,0 @@
|
|||
/* atm_suni.h - Driver-specific declarations of the SUNI driver (for use by
|
||||
driver-specific utilities) */
|
||||
|
||||
/* Written 1998,2000 by Werner Almesberger, EPFL ICA */
|
||||
|
||||
|
||||
#ifndef LINUX_ATM_SUNI_H
|
||||
#define LINUX_ATM_SUNI_H
|
||||
|
||||
/* everything obsoleted */
|
||||
|
||||
#endif
|
||||
|
|
@ -151,7 +151,7 @@ struct atm_dev {
|
|||
const char *type; /* device type name */
|
||||
int number; /* device index */
|
||||
void *dev_data; /* per-device data */
|
||||
void *phy_data; /* private PHY date */
|
||||
void *phy_data; /* private PHY data */
|
||||
unsigned long flags; /* device flags (ATM_DF_*) */
|
||||
struct list_head local; /* local ATM addresses */
|
||||
struct list_head lecs; /* LECS ATM addresses learned via ILMI */
|
||||
|
|
|
|||
|
|
@ -136,6 +136,12 @@ enum virtchnl_ops {
|
|||
VIRTCHNL_OP_DISABLE_CHANNELS = 31,
|
||||
VIRTCHNL_OP_ADD_CLOUD_FILTER = 32,
|
||||
VIRTCHNL_OP_DEL_CLOUD_FILTER = 33,
|
||||
/* opcode 34 - 44 are reserved */
|
||||
VIRTCHNL_OP_ADD_RSS_CFG = 45,
|
||||
VIRTCHNL_OP_DEL_RSS_CFG = 46,
|
||||
VIRTCHNL_OP_ADD_FDIR_FILTER = 47,
|
||||
VIRTCHNL_OP_DEL_FDIR_FILTER = 48,
|
||||
VIRTCHNL_OP_MAX,
|
||||
};
|
||||
|
||||
/* These macros are used to generate compilation errors if a structure/union
|
||||
|
|
@ -247,6 +253,9 @@ VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_vsi_resource);
|
|||
#define VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM 0X00200000
|
||||
#define VIRTCHNL_VF_OFFLOAD_RX_ENCAP_CSUM 0X00400000
|
||||
#define VIRTCHNL_VF_OFFLOAD_ADQ 0X00800000
|
||||
#define VIRTCHNL_VF_OFFLOAD_USO 0X02000000
|
||||
#define VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF 0X08000000
|
||||
#define VIRTCHNL_VF_OFFLOAD_FDIR_PF 0X10000000
|
||||
|
||||
/* Define below the capability flags that are not offloads */
|
||||
#define VIRTCHNL_VF_CAP_ADV_LINK_SPEED 0x00000080
|
||||
|
|
@ -476,7 +485,6 @@ struct virtchnl_rss_key {
|
|||
u16 vsi_id;
|
||||
u16 key_len;
|
||||
u8 key[1]; /* RSS hash key, packed bytes */
|
||||
u8 pad[1];
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_rss_key);
|
||||
|
|
@ -485,7 +493,6 @@ struct virtchnl_rss_lut {
|
|||
u16 vsi_id;
|
||||
u16 lut_entries;
|
||||
u8 lut[1]; /* RSS lookup table */
|
||||
u8 pad[1];
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_rss_lut);
|
||||
|
|
@ -559,6 +566,11 @@ enum virtchnl_action {
|
|||
/* action types */
|
||||
VIRTCHNL_ACTION_DROP = 0,
|
||||
VIRTCHNL_ACTION_TC_REDIRECT,
|
||||
VIRTCHNL_ACTION_PASSTHRU,
|
||||
VIRTCHNL_ACTION_QUEUE,
|
||||
VIRTCHNL_ACTION_Q_REGION,
|
||||
VIRTCHNL_ACTION_MARK,
|
||||
VIRTCHNL_ACTION_COUNT,
|
||||
};
|
||||
|
||||
enum virtchnl_flow_type {
|
||||
|
|
@ -668,6 +680,285 @@ enum virtchnl_vfr_states {
|
|||
VIRTCHNL_VFR_VFACTIVE,
|
||||
};
|
||||
|
||||
/* Type of RSS algorithm */
|
||||
enum virtchnl_rss_algorithm {
|
||||
VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC = 0,
|
||||
VIRTCHNL_RSS_ALG_R_ASYMMETRIC = 1,
|
||||
VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC = 2,
|
||||
VIRTCHNL_RSS_ALG_XOR_SYMMETRIC = 3,
|
||||
};
|
||||
|
||||
#define VIRTCHNL_MAX_NUM_PROTO_HDRS 32
|
||||
#define PROTO_HDR_SHIFT 5
|
||||
#define PROTO_HDR_FIELD_START(proto_hdr_type) ((proto_hdr_type) << PROTO_HDR_SHIFT)
|
||||
#define PROTO_HDR_FIELD_MASK ((1UL << PROTO_HDR_SHIFT) - 1)
|
||||
|
||||
/* VF use these macros to configure each protocol header.
|
||||
* Specify which protocol headers and protocol header fields base on
|
||||
* virtchnl_proto_hdr_type and virtchnl_proto_hdr_field.
|
||||
* @param hdr: a struct of virtchnl_proto_hdr
|
||||
* @param hdr_type: ETH/IPV4/TCP, etc
|
||||
* @param field: SRC/DST/TEID/SPI, etc
|
||||
*/
|
||||
#define VIRTCHNL_ADD_PROTO_HDR_FIELD(hdr, field) \
|
||||
((hdr)->field_selector |= BIT((field) & PROTO_HDR_FIELD_MASK))
|
||||
#define VIRTCHNL_DEL_PROTO_HDR_FIELD(hdr, field) \
|
||||
((hdr)->field_selector &= ~BIT((field) & PROTO_HDR_FIELD_MASK))
|
||||
#define VIRTCHNL_TEST_PROTO_HDR_FIELD(hdr, val) \
|
||||
((hdr)->field_selector & BIT((val) & PROTO_HDR_FIELD_MASK))
|
||||
#define VIRTCHNL_GET_PROTO_HDR_FIELD(hdr) ((hdr)->field_selector)
|
||||
|
||||
#define VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, hdr_type, field) \
|
||||
(VIRTCHNL_ADD_PROTO_HDR_FIELD(hdr, \
|
||||
VIRTCHNL_PROTO_HDR_ ## hdr_type ## _ ## field))
|
||||
#define VIRTCHNL_DEL_PROTO_HDR_FIELD_BIT(hdr, hdr_type, field) \
|
||||
(VIRTCHNL_DEL_PROTO_HDR_FIELD(hdr, \
|
||||
VIRTCHNL_PROTO_HDR_ ## hdr_type ## _ ## field))
|
||||
|
||||
#define VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, hdr_type) \
|
||||
((hdr)->type = VIRTCHNL_PROTO_HDR_ ## hdr_type)
|
||||
#define VIRTCHNL_GET_PROTO_HDR_TYPE(hdr) \
|
||||
(((hdr)->type) >> PROTO_HDR_SHIFT)
|
||||
#define VIRTCHNL_TEST_PROTO_HDR_TYPE(hdr, val) \
|
||||
((hdr)->type == ((val) >> PROTO_HDR_SHIFT))
|
||||
#define VIRTCHNL_TEST_PROTO_HDR(hdr, val) \
|
||||
(VIRTCHNL_TEST_PROTO_HDR_TYPE((hdr), (val)) && \
|
||||
VIRTCHNL_TEST_PROTO_HDR_FIELD((hdr), (val)))
|
||||
|
||||
/* Protocol header type within a packet segment. A segment consists of one or
|
||||
* more protocol headers that make up a logical group of protocol headers. Each
|
||||
* logical group of protocol headers encapsulates or is encapsulated using/by
|
||||
* tunneling or encapsulation protocols for network virtualization.
|
||||
*/
|
||||
enum virtchnl_proto_hdr_type {
|
||||
VIRTCHNL_PROTO_HDR_NONE,
|
||||
VIRTCHNL_PROTO_HDR_ETH,
|
||||
VIRTCHNL_PROTO_HDR_S_VLAN,
|
||||
VIRTCHNL_PROTO_HDR_C_VLAN,
|
||||
VIRTCHNL_PROTO_HDR_IPV4,
|
||||
VIRTCHNL_PROTO_HDR_IPV6,
|
||||
VIRTCHNL_PROTO_HDR_TCP,
|
||||
VIRTCHNL_PROTO_HDR_UDP,
|
||||
VIRTCHNL_PROTO_HDR_SCTP,
|
||||
VIRTCHNL_PROTO_HDR_GTPU_IP,
|
||||
VIRTCHNL_PROTO_HDR_GTPU_EH,
|
||||
VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_DWN,
|
||||
VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP,
|
||||
VIRTCHNL_PROTO_HDR_PPPOE,
|
||||
VIRTCHNL_PROTO_HDR_L2TPV3,
|
||||
VIRTCHNL_PROTO_HDR_ESP,
|
||||
VIRTCHNL_PROTO_HDR_AH,
|
||||
VIRTCHNL_PROTO_HDR_PFCP,
|
||||
};
|
||||
|
||||
/* Protocol header field within a protocol header. */
|
||||
enum virtchnl_proto_hdr_field {
|
||||
/* ETHER */
|
||||
VIRTCHNL_PROTO_HDR_ETH_SRC =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_ETH),
|
||||
VIRTCHNL_PROTO_HDR_ETH_DST,
|
||||
VIRTCHNL_PROTO_HDR_ETH_ETHERTYPE,
|
||||
/* S-VLAN */
|
||||
VIRTCHNL_PROTO_HDR_S_VLAN_ID =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_S_VLAN),
|
||||
/* C-VLAN */
|
||||
VIRTCHNL_PROTO_HDR_C_VLAN_ID =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_C_VLAN),
|
||||
/* IPV4 */
|
||||
VIRTCHNL_PROTO_HDR_IPV4_SRC =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV4),
|
||||
VIRTCHNL_PROTO_HDR_IPV4_DST,
|
||||
VIRTCHNL_PROTO_HDR_IPV4_DSCP,
|
||||
VIRTCHNL_PROTO_HDR_IPV4_TTL,
|
||||
VIRTCHNL_PROTO_HDR_IPV4_PROT,
|
||||
/* IPV6 */
|
||||
VIRTCHNL_PROTO_HDR_IPV6_SRC =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
|
||||
VIRTCHNL_PROTO_HDR_IPV6_DST,
|
||||
VIRTCHNL_PROTO_HDR_IPV6_TC,
|
||||
VIRTCHNL_PROTO_HDR_IPV6_HOP_LIMIT,
|
||||
VIRTCHNL_PROTO_HDR_IPV6_PROT,
|
||||
/* TCP */
|
||||
VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
|
||||
VIRTCHNL_PROTO_HDR_TCP_DST_PORT,
|
||||
/* UDP */
|
||||
VIRTCHNL_PROTO_HDR_UDP_SRC_PORT =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_UDP),
|
||||
VIRTCHNL_PROTO_HDR_UDP_DST_PORT,
|
||||
/* SCTP */
|
||||
VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_SCTP),
|
||||
VIRTCHNL_PROTO_HDR_SCTP_DST_PORT,
|
||||
/* GTPU_IP */
|
||||
VIRTCHNL_PROTO_HDR_GTPU_IP_TEID =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_GTPU_IP),
|
||||
/* GTPU_EH */
|
||||
VIRTCHNL_PROTO_HDR_GTPU_EH_PDU =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_GTPU_EH),
|
||||
VIRTCHNL_PROTO_HDR_GTPU_EH_QFI,
|
||||
/* PPPOE */
|
||||
VIRTCHNL_PROTO_HDR_PPPOE_SESS_ID =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_PPPOE),
|
||||
/* L2TPV3 */
|
||||
VIRTCHNL_PROTO_HDR_L2TPV3_SESS_ID =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_L2TPV3),
|
||||
/* ESP */
|
||||
VIRTCHNL_PROTO_HDR_ESP_SPI =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_ESP),
|
||||
/* AH */
|
||||
VIRTCHNL_PROTO_HDR_AH_SPI =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_AH),
|
||||
/* PFCP */
|
||||
VIRTCHNL_PROTO_HDR_PFCP_S_FIELD =
|
||||
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_PFCP),
|
||||
VIRTCHNL_PROTO_HDR_PFCP_SEID,
|
||||
};
|
||||
|
||||
struct virtchnl_proto_hdr {
|
||||
enum virtchnl_proto_hdr_type type;
|
||||
u32 field_selector; /* a bit mask to select field for header type */
|
||||
u8 buffer[64];
|
||||
/**
|
||||
* binary buffer in network order for specific header type.
|
||||
* For example, if type = VIRTCHNL_PROTO_HDR_IPV4, a IPv4
|
||||
* header is expected to be copied into the buffer.
|
||||
*/
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(72, virtchnl_proto_hdr);
|
||||
|
||||
struct virtchnl_proto_hdrs {
|
||||
u8 tunnel_level;
|
||||
/**
|
||||
* specify where protocol header start from.
|
||||
* 0 - from the outer layer
|
||||
* 1 - from the first inner layer
|
||||
* 2 - from the second inner layer
|
||||
* ....
|
||||
**/
|
||||
int count; /* the proto layers must < VIRTCHNL_MAX_NUM_PROTO_HDRS */
|
||||
struct virtchnl_proto_hdr proto_hdr[VIRTCHNL_MAX_NUM_PROTO_HDRS];
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(2312, virtchnl_proto_hdrs);
|
||||
|
||||
struct virtchnl_rss_cfg {
|
||||
struct virtchnl_proto_hdrs proto_hdrs; /* protocol headers */
|
||||
enum virtchnl_rss_algorithm rss_algorithm; /* RSS algorithm type */
|
||||
u8 reserved[128]; /* reserve for future */
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(2444, virtchnl_rss_cfg);
|
||||
|
||||
/* action configuration for FDIR */
|
||||
struct virtchnl_filter_action {
|
||||
enum virtchnl_action type;
|
||||
union {
|
||||
/* used for queue and qgroup action */
|
||||
struct {
|
||||
u16 index;
|
||||
u8 region;
|
||||
} queue;
|
||||
/* used for count action */
|
||||
struct {
|
||||
/* share counter ID with other flow rules */
|
||||
u8 shared;
|
||||
u32 id; /* counter ID */
|
||||
} count;
|
||||
/* used for mark action */
|
||||
u32 mark_id;
|
||||
u8 reserve[32];
|
||||
} act_conf;
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(36, virtchnl_filter_action);
|
||||
|
||||
#define VIRTCHNL_MAX_NUM_ACTIONS 8
|
||||
|
||||
struct virtchnl_filter_action_set {
|
||||
/* action number must be less then VIRTCHNL_MAX_NUM_ACTIONS */
|
||||
int count;
|
||||
struct virtchnl_filter_action actions[VIRTCHNL_MAX_NUM_ACTIONS];
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(292, virtchnl_filter_action_set);
|
||||
|
||||
/* pattern and action for FDIR rule */
|
||||
struct virtchnl_fdir_rule {
|
||||
struct virtchnl_proto_hdrs proto_hdrs;
|
||||
struct virtchnl_filter_action_set action_set;
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(2604, virtchnl_fdir_rule);
|
||||
|
||||
/* Status returned to VF after VF requests FDIR commands
|
||||
* VIRTCHNL_FDIR_SUCCESS
|
||||
* VF FDIR related request is successfully done by PF
|
||||
* The request can be OP_ADD/DEL.
|
||||
*
|
||||
* VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE
|
||||
* OP_ADD_FDIR_FILTER request is failed due to no Hardware resource.
|
||||
*
|
||||
* VIRTCHNL_FDIR_FAILURE_RULE_EXIST
|
||||
* OP_ADD_FDIR_FILTER request is failed due to the rule is already existed.
|
||||
*
|
||||
* VIRTCHNL_FDIR_FAILURE_RULE_CONFLICT
|
||||
* OP_ADD_FDIR_FILTER request is failed due to conflict with existing rule.
|
||||
*
|
||||
* VIRTCHNL_FDIR_FAILURE_RULE_NONEXIST
|
||||
* OP_DEL_FDIR_FILTER request is failed due to this rule doesn't exist.
|
||||
*
|
||||
* VIRTCHNL_FDIR_FAILURE_RULE_INVALID
|
||||
* OP_ADD_FDIR_FILTER request is failed due to parameters validation
|
||||
* or HW doesn't support.
|
||||
*
|
||||
* VIRTCHNL_FDIR_FAILURE_RULE_TIMEOUT
|
||||
* OP_ADD/DEL_FDIR_FILTER request is failed due to timing out
|
||||
* for programming.
|
||||
*/
|
||||
enum virtchnl_fdir_prgm_status {
|
||||
VIRTCHNL_FDIR_SUCCESS = 0,
|
||||
VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE,
|
||||
VIRTCHNL_FDIR_FAILURE_RULE_EXIST,
|
||||
VIRTCHNL_FDIR_FAILURE_RULE_CONFLICT,
|
||||
VIRTCHNL_FDIR_FAILURE_RULE_NONEXIST,
|
||||
VIRTCHNL_FDIR_FAILURE_RULE_INVALID,
|
||||
VIRTCHNL_FDIR_FAILURE_RULE_TIMEOUT,
|
||||
};
|
||||
|
||||
/* VIRTCHNL_OP_ADD_FDIR_FILTER
|
||||
* VF sends this request to PF by filling out vsi_id,
|
||||
* validate_only and rule_cfg. PF will return flow_id
|
||||
* if the request is successfully done and return add_status to VF.
|
||||
*/
|
||||
struct virtchnl_fdir_add {
|
||||
u16 vsi_id; /* INPUT */
|
||||
/*
|
||||
* 1 for validating a fdir rule, 0 for creating a fdir rule.
|
||||
* Validate and create share one ops: VIRTCHNL_OP_ADD_FDIR_FILTER.
|
||||
*/
|
||||
u16 validate_only; /* INPUT */
|
||||
u32 flow_id; /* OUTPUT */
|
||||
struct virtchnl_fdir_rule rule_cfg; /* INPUT */
|
||||
enum virtchnl_fdir_prgm_status status; /* OUTPUT */
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(2616, virtchnl_fdir_add);
|
||||
|
||||
/* VIRTCHNL_OP_DEL_FDIR_FILTER
|
||||
* VF sends this request to PF by filling out vsi_id
|
||||
* and flow_id. PF will return del_status to VF.
|
||||
*/
|
||||
struct virtchnl_fdir_del {
|
||||
u16 vsi_id; /* INPUT */
|
||||
u16 pad;
|
||||
u32 flow_id; /* INPUT */
|
||||
enum virtchnl_fdir_prgm_status status; /* OUTPUT */
|
||||
};
|
||||
|
||||
VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_fdir_del);
|
||||
|
||||
/**
|
||||
* virtchnl_vc_validate_vf_msg
|
||||
* @ver: Virtchnl version info
|
||||
|
|
@ -828,6 +1119,16 @@ virtchnl_vc_validate_vf_msg(struct virtchnl_version_info *ver, u32 v_opcode,
|
|||
case VIRTCHNL_OP_DEL_CLOUD_FILTER:
|
||||
valid_len = sizeof(struct virtchnl_filter);
|
||||
break;
|
||||
case VIRTCHNL_OP_ADD_RSS_CFG:
|
||||
case VIRTCHNL_OP_DEL_RSS_CFG:
|
||||
valid_len = sizeof(struct virtchnl_rss_cfg);
|
||||
break;
|
||||
case VIRTCHNL_OP_ADD_FDIR_FILTER:
|
||||
valid_len = sizeof(struct virtchnl_fdir_add);
|
||||
break;
|
||||
case VIRTCHNL_OP_DEL_FDIR_FILTER:
|
||||
valid_len = sizeof(struct virtchnl_fdir_del);
|
||||
break;
|
||||
/* These are always errors coming from the VF. */
|
||||
case VIRTCHNL_OP_EVENT:
|
||||
case VIRTCHNL_OP_UNKNOWN:
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@ struct coredump_params {
|
|||
unsigned long mm_flags;
|
||||
loff_t written;
|
||||
loff_t pos;
|
||||
loff_t to_skip;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -20,11 +20,11 @@
|
|||
#define BIO_BUG_ON
|
||||
#endif
|
||||
|
||||
#define BIO_MAX_PAGES 256U
|
||||
#define BIO_MAX_VECS 256U
|
||||
|
||||
static inline unsigned int bio_max_segs(unsigned int nr_segs)
|
||||
{
|
||||
return min(nr_segs, BIO_MAX_PAGES);
|
||||
return min(nr_segs, BIO_MAX_VECS);
|
||||
}
|
||||
|
||||
#define bio_prio(bio) (bio)->bi_ioprio
|
||||
|
|
@ -483,16 +483,10 @@ extern void bio_check_pages_dirty(struct bio *bio);
|
|||
extern void bio_copy_data_iter(struct bio *dst, struct bvec_iter *dst_iter,
|
||||
struct bio *src, struct bvec_iter *src_iter);
|
||||
extern void bio_copy_data(struct bio *dst, struct bio *src);
|
||||
extern void bio_list_copy_data(struct bio *dst, struct bio *src);
|
||||
extern void bio_free_pages(struct bio *bio);
|
||||
void zero_fill_bio_iter(struct bio *bio, struct bvec_iter iter);
|
||||
void bio_truncate(struct bio *bio, unsigned new_size);
|
||||
void guard_bio_eod(struct bio *bio);
|
||||
|
||||
static inline void zero_fill_bio(struct bio *bio)
|
||||
{
|
||||
zero_fill_bio_iter(bio, bio->bi_iter);
|
||||
}
|
||||
void zero_fill_bio(struct bio *bio);
|
||||
|
||||
extern const char *bio_devname(struct bio *bio, char *buffer);
|
||||
|
||||
|
|
|
|||
|
|
@ -4,10 +4,13 @@
|
|||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/align.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
|
||||
/*
|
||||
* bitmaps provide bit arrays that consume one or more unsigned
|
||||
|
|
@ -118,54 +121,59 @@
|
|||
* Allocation and deallocation of bitmap.
|
||||
* Provided in lib/bitmap.c to avoid circular dependency.
|
||||
*/
|
||||
extern unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags);
|
||||
extern unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags);
|
||||
extern void bitmap_free(const unsigned long *bitmap);
|
||||
unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags);
|
||||
unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags);
|
||||
void bitmap_free(const unsigned long *bitmap);
|
||||
|
||||
/* Managed variants of the above. */
|
||||
unsigned long *devm_bitmap_alloc(struct device *dev,
|
||||
unsigned int nbits, gfp_t flags);
|
||||
unsigned long *devm_bitmap_zalloc(struct device *dev,
|
||||
unsigned int nbits, gfp_t flags);
|
||||
|
||||
/*
|
||||
* lib/bitmap.c provides these functions:
|
||||
*/
|
||||
|
||||
extern int __bitmap_equal(const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
extern bool __pure __bitmap_or_equal(const unsigned long *src1,
|
||||
const unsigned long *src2,
|
||||
const unsigned long *src3,
|
||||
unsigned int nbits);
|
||||
extern void __bitmap_complement(unsigned long *dst, const unsigned long *src,
|
||||
unsigned int nbits);
|
||||
extern void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
|
||||
unsigned int shift, unsigned int nbits);
|
||||
extern void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
|
||||
unsigned int shift, unsigned int nbits);
|
||||
extern void bitmap_cut(unsigned long *dst, const unsigned long *src,
|
||||
unsigned int first, unsigned int cut,
|
||||
unsigned int nbits);
|
||||
extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
|
||||
int __bitmap_equal(const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
bool __pure __bitmap_or_equal(const unsigned long *src1,
|
||||
const unsigned long *src2,
|
||||
const unsigned long *src3,
|
||||
unsigned int nbits);
|
||||
void __bitmap_complement(unsigned long *dst, const unsigned long *src,
|
||||
unsigned int nbits);
|
||||
void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
|
||||
unsigned int shift, unsigned int nbits);
|
||||
void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
|
||||
unsigned int shift, unsigned int nbits);
|
||||
void bitmap_cut(unsigned long *dst, const unsigned long *src,
|
||||
unsigned int first, unsigned int cut, unsigned int nbits);
|
||||
int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
void __bitmap_replace(unsigned long *dst,
|
||||
const unsigned long *old, const unsigned long *new,
|
||||
const unsigned long *mask, unsigned int nbits);
|
||||
int __bitmap_intersects(const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
extern void __bitmap_replace(unsigned long *dst,
|
||||
const unsigned long *old, const unsigned long *new,
|
||||
const unsigned long *mask, unsigned int nbits);
|
||||
extern int __bitmap_intersects(const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
extern int __bitmap_subset(const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
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);
|
||||
int __bitmap_subset(const unsigned long *bitmap1,
|
||||
const unsigned long *bitmap2, unsigned int nbits);
|
||||
int __bitmap_weight(const unsigned long *bitmap, unsigned int nbits);
|
||||
void __bitmap_set(unsigned long *map, unsigned int start, int len);
|
||||
void __bitmap_clear(unsigned long *map, unsigned int start, int len);
|
||||
|
||||
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);
|
||||
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
|
||||
|
|
@ -190,46 +198,38 @@ bitmap_find_next_zero_area(unsigned long *map,
|
|||
align_mask, 0);
|
||||
}
|
||||
|
||||
extern int bitmap_parse(const char *buf, unsigned int buflen,
|
||||
int bitmap_parse(const char *buf, unsigned int buflen,
|
||||
unsigned long *dst, int nbits);
|
||||
extern int bitmap_parse_user(const char __user *ubuf, unsigned int ulen,
|
||||
int bitmap_parse_user(const char __user *ubuf, unsigned int ulen,
|
||||
unsigned long *dst, int nbits);
|
||||
extern int bitmap_parselist(const char *buf, unsigned long *maskp,
|
||||
int bitmap_parselist(const char *buf, unsigned long *maskp,
|
||||
int nmaskbits);
|
||||
extern int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen,
|
||||
int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen,
|
||||
unsigned long *dst, int nbits);
|
||||
extern void bitmap_remap(unsigned long *dst, const unsigned long *src,
|
||||
void bitmap_remap(unsigned long *dst, const unsigned long *src,
|
||||
const unsigned long *old, const unsigned long *new, unsigned int nbits);
|
||||
extern int bitmap_bitremap(int oldbit,
|
||||
int bitmap_bitremap(int oldbit,
|
||||
const unsigned long *old, const unsigned long *new, int bits);
|
||||
extern void bitmap_onto(unsigned long *dst, const unsigned long *orig,
|
||||
void bitmap_onto(unsigned long *dst, const unsigned long *orig,
|
||||
const unsigned long *relmap, unsigned int bits);
|
||||
extern void bitmap_fold(unsigned long *dst, const unsigned long *orig,
|
||||
void bitmap_fold(unsigned long *dst, const unsigned long *orig,
|
||||
unsigned int sz, unsigned int nbits);
|
||||
extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order);
|
||||
extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order);
|
||||
extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
|
||||
int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order);
|
||||
void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order);
|
||||
int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
|
||||
|
||||
#ifdef __BIG_ENDIAN
|
||||
extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits);
|
||||
void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits);
|
||||
#else
|
||||
#define bitmap_copy_le bitmap_copy
|
||||
#endif
|
||||
extern unsigned int bitmap_ord_to_pos(const unsigned long *bitmap, unsigned int ord, unsigned int nbits);
|
||||
extern int bitmap_print_to_pagebuf(bool list, char *buf,
|
||||
unsigned int bitmap_ord_to_pos(const unsigned long *bitmap, unsigned int ord, unsigned int nbits);
|
||||
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 - 1)))
|
||||
#define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1)))
|
||||
|
||||
/*
|
||||
* The static inlines below do not handle constant nbits==0 correctly,
|
||||
* so make such users (should any ever turn up) call the out-of-line
|
||||
* versions.
|
||||
*/
|
||||
#define small_const_nbits(nbits) \
|
||||
(__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG && (nbits) > 0)
|
||||
|
||||
static inline void bitmap_zero(unsigned long *dst, unsigned int nbits)
|
||||
{
|
||||
unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
|
||||
|
|
@ -265,9 +265,9 @@ static inline void bitmap_copy_clear_tail(unsigned long *dst,
|
|||
* therefore conversion is not needed when copying data from/to arrays of u32.
|
||||
*/
|
||||
#if BITS_PER_LONG == 64
|
||||
extern void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf,
|
||||
void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf,
|
||||
unsigned int nbits);
|
||||
extern void bitmap_to_arr32(u32 *buf, const unsigned long *bitmap,
|
||||
void bitmap_to_arr32(u32 *buf, const unsigned long *bitmap,
|
||||
unsigned int nbits);
|
||||
#else
|
||||
#define bitmap_from_arr32(bitmap, buf, nbits) \
|
||||
|
|
|
|||
|
|
@ -286,17 +286,5 @@ static __always_inline void __assign_bit(long nr, volatile unsigned long *addr,
|
|||
})
|
||||
#endif
|
||||
|
||||
#ifndef find_last_bit
|
||||
/**
|
||||
* find_last_bit - find the last set bit in a memory region
|
||||
* @addr: The address to start the search at
|
||||
* @size: The number of bits to search
|
||||
*
|
||||
* Returns the bit number of the last set bit, or size.
|
||||
*/
|
||||
extern unsigned long find_last_bit(const unsigned long *addr,
|
||||
unsigned long size);
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -306,12 +306,21 @@ struct blk_mq_ops {
|
|||
* reserved budget. Also we have to handle failure case
|
||||
* of .get_budget for avoiding I/O deadlock.
|
||||
*/
|
||||
bool (*get_budget)(struct request_queue *);
|
||||
int (*get_budget)(struct request_queue *);
|
||||
|
||||
/**
|
||||
* @put_budget: Release the reserved budget.
|
||||
*/
|
||||
void (*put_budget)(struct request_queue *);
|
||||
void (*put_budget)(struct request_queue *, int);
|
||||
|
||||
/**
|
||||
* @set_rq_budget_token: store rq's budget token
|
||||
*/
|
||||
void (*set_rq_budget_token)(struct request *, int);
|
||||
/**
|
||||
* @get_rq_budget_token: retrieve rq's budget token
|
||||
*/
|
||||
int (*get_rq_budget_token)(struct request *);
|
||||
|
||||
/**
|
||||
* @timeout: Called on request timeout.
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
#include <linux/minmax.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/backing-dev-defs.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/mempool.h>
|
||||
|
|
@ -85,8 +84,6 @@ typedef __u32 __bitwise req_flags_t;
|
|||
#define RQF_ELVPRIV ((__force req_flags_t)(1 << 12))
|
||||
/* account into disk and partition IO statistics */
|
||||
#define RQF_IO_STAT ((__force req_flags_t)(1 << 13))
|
||||
/* request came from our alloc pool */
|
||||
#define RQF_ALLOCED ((__force req_flags_t)(1 << 14))
|
||||
/* runtime pm request */
|
||||
#define RQF_PM ((__force req_flags_t)(1 << 15))
|
||||
/* on IO scheduler merge hash */
|
||||
|
|
@ -274,6 +271,12 @@ static inline bool bio_is_passthrough(struct bio *bio)
|
|||
return blk_op_is_scsi(op) || blk_op_is_private(op);
|
||||
}
|
||||
|
||||
static inline bool blk_op_is_passthrough(unsigned int op)
|
||||
{
|
||||
return (blk_op_is_scsi(op & REQ_OP_MASK) ||
|
||||
blk_op_is_private(op & REQ_OP_MASK));
|
||||
}
|
||||
|
||||
static inline unsigned short req_get_ioprio(struct request *req)
|
||||
{
|
||||
return req->ioprio;
|
||||
|
|
@ -313,8 +316,17 @@ enum blk_zoned_model {
|
|||
BLK_ZONED_HM, /* Host-managed zoned block device */
|
||||
};
|
||||
|
||||
/*
|
||||
* BLK_BOUNCE_NONE: never bounce (default)
|
||||
* BLK_BOUNCE_HIGH: bounce all highmem pages
|
||||
*/
|
||||
enum blk_bounce {
|
||||
BLK_BOUNCE_NONE,
|
||||
BLK_BOUNCE_HIGH,
|
||||
};
|
||||
|
||||
struct queue_limits {
|
||||
unsigned long bounce_pfn;
|
||||
enum blk_bounce bounce;
|
||||
unsigned long seg_boundary_mask;
|
||||
unsigned long virt_boundary_mask;
|
||||
|
||||
|
|
@ -436,11 +448,6 @@ struct request_queue {
|
|||
*/
|
||||
int id;
|
||||
|
||||
/*
|
||||
* queue needs bounce pages for pages above this limit
|
||||
*/
|
||||
gfp_t bounce_gfp;
|
||||
|
||||
spinlock_t queue_lock;
|
||||
|
||||
/*
|
||||
|
|
@ -669,11 +676,6 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q);
|
|||
extern void blk_set_pm_only(struct request_queue *q);
|
||||
extern void blk_clear_pm_only(struct request_queue *q);
|
||||
|
||||
static inline bool blk_account_rq(struct request *rq)
|
||||
{
|
||||
return (rq->rq_flags & RQF_STARTED) && !blk_rq_is_passthrough(rq);
|
||||
}
|
||||
|
||||
#define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist)
|
||||
|
||||
#define rq_data_dir(rq) (op_is_write(req_op(rq)) ? WRITE : READ)
|
||||
|
|
@ -685,6 +687,8 @@ static inline bool blk_account_rq(struct request *rq)
|
|||
dma_map_page_attrs(dev, (bv)->bv_page, (bv)->bv_offset, (bv)->bv_len, \
|
||||
(dir), (attrs))
|
||||
|
||||
#define queue_to_disk(q) (dev_to_disk(kobj_to_dev((q)->kobj.parent)))
|
||||
|
||||
static inline bool queue_is_mq(struct request_queue *q)
|
||||
{
|
||||
return q->mq_ops;
|
||||
|
|
@ -840,24 +844,6 @@ static inline unsigned int blk_queue_depth(struct request_queue *q)
|
|||
return q->nr_requests;
|
||||
}
|
||||
|
||||
extern unsigned long blk_max_low_pfn, blk_max_pfn;
|
||||
|
||||
/*
|
||||
* standard bounce addresses:
|
||||
*
|
||||
* BLK_BOUNCE_HIGH : bounce all highmem pages
|
||||
* BLK_BOUNCE_ANY : don't bounce anything
|
||||
* BLK_BOUNCE_ISA : bounce pages above ISA DMA boundary
|
||||
*/
|
||||
|
||||
#if BITS_PER_LONG == 32
|
||||
#define BLK_BOUNCE_HIGH ((u64)blk_max_low_pfn << PAGE_SHIFT)
|
||||
#else
|
||||
#define BLK_BOUNCE_HIGH -1ULL
|
||||
#endif
|
||||
#define BLK_BOUNCE_ANY (-1ULL)
|
||||
#define BLK_BOUNCE_ISA (DMA_BIT_MASK(24))
|
||||
|
||||
/*
|
||||
* default timeout for SG_IO if none specified
|
||||
*/
|
||||
|
|
@ -923,7 +909,7 @@ extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src,
|
|||
extern void blk_rq_unprep_clone(struct request *rq);
|
||||
extern blk_status_t blk_insert_cloned_request(struct request_queue *q,
|
||||
struct request *rq);
|
||||
extern int blk_rq_append_bio(struct request *rq, struct bio **bio);
|
||||
int blk_rq_append_bio(struct request *rq, struct bio *bio);
|
||||
extern void blk_queue_split(struct bio **);
|
||||
extern int scsi_verify_blk_ioctl(struct block_device *, unsigned int);
|
||||
extern int scsi_cmd_blk_ioctl(struct block_device *, fmode_t,
|
||||
|
|
@ -1141,7 +1127,7 @@ extern void blk_abort_request(struct request *);
|
|||
* Access functions for manipulating queue properties
|
||||
*/
|
||||
extern void blk_cleanup_queue(struct request_queue *);
|
||||
extern void blk_queue_bounce_limit(struct request_queue *, u64);
|
||||
void blk_queue_bounce_limit(struct request_queue *q, enum blk_bounce limit);
|
||||
extern void blk_queue_max_hw_sectors(struct request_queue *, unsigned int);
|
||||
extern void blk_queue_chunk_sectors(struct request_queue *, unsigned int);
|
||||
extern void blk_queue_max_segments(struct request_queue *, unsigned short);
|
||||
|
|
@ -1870,7 +1856,6 @@ struct block_device_operations {
|
|||
unsigned int (*check_events) (struct gendisk *disk,
|
||||
unsigned int clearing);
|
||||
void (*unlock_native_capacity) (struct gendisk *);
|
||||
int (*revalidate_disk) (struct gendisk *);
|
||||
int (*getgeo)(struct block_device *, struct hd_geometry *);
|
||||
int (*set_read_only)(struct block_device *bdev, bool ro);
|
||||
/* this callback is with swap_lock and sometimes page table lock held */
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#include <linux/preempt.h>
|
||||
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
#if defined(CONFIG_PREEMPT_RT) || defined(CONFIG_TRACE_IRQFLAGS)
|
||||
extern void __local_bh_disable_ip(unsigned long ip, unsigned int cnt);
|
||||
#else
|
||||
static __always_inline void __local_bh_disable_ip(unsigned long ip, unsigned int cnt)
|
||||
|
|
@ -32,4 +32,10 @@ static inline void local_bh_enable(void)
|
|||
__local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
extern bool local_bh_blocked(void);
|
||||
#else
|
||||
static inline bool local_bh_blocked(void) { return false; }
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_BH_H */
|
||||
|
|
|
|||
|
|
@ -20,14 +20,25 @@ struct bpf_sock_ops_kern;
|
|||
struct bpf_cgroup_storage;
|
||||
struct ctl_table;
|
||||
struct ctl_table_header;
|
||||
struct task_struct;
|
||||
|
||||
#ifdef CONFIG_CGROUP_BPF
|
||||
|
||||
extern struct static_key_false cgroup_bpf_enabled_key[MAX_BPF_ATTACH_TYPE];
|
||||
#define cgroup_bpf_enabled(type) static_branch_unlikely(&cgroup_bpf_enabled_key[type])
|
||||
|
||||
DECLARE_PER_CPU(struct bpf_cgroup_storage*,
|
||||
bpf_cgroup_storage[MAX_BPF_CGROUP_STORAGE_TYPE]);
|
||||
#define BPF_CGROUP_STORAGE_NEST_MAX 8
|
||||
|
||||
struct bpf_cgroup_storage_info {
|
||||
struct task_struct *task;
|
||||
struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE];
|
||||
};
|
||||
|
||||
/* For each cpu, permit maximum BPF_CGROUP_STORAGE_NEST_MAX number of tasks
|
||||
* to use bpf cgroup storage simultaneously.
|
||||
*/
|
||||
DECLARE_PER_CPU(struct bpf_cgroup_storage_info,
|
||||
bpf_cgroup_storage_info[BPF_CGROUP_STORAGE_NEST_MAX]);
|
||||
|
||||
#define for_each_cgroup_storage_type(stype) \
|
||||
for (stype = 0; stype < MAX_BPF_CGROUP_STORAGE_TYPE; stype++)
|
||||
|
|
@ -161,13 +172,42 @@ static inline enum bpf_cgroup_storage_type cgroup_storage_type(
|
|||
return BPF_CGROUP_STORAGE_SHARED;
|
||||
}
|
||||
|
||||
static inline void bpf_cgroup_storage_set(struct bpf_cgroup_storage
|
||||
*storage[MAX_BPF_CGROUP_STORAGE_TYPE])
|
||||
static inline int bpf_cgroup_storage_set(struct bpf_cgroup_storage
|
||||
*storage[MAX_BPF_CGROUP_STORAGE_TYPE])
|
||||
{
|
||||
enum bpf_cgroup_storage_type stype;
|
||||
int i, err = 0;
|
||||
|
||||
for_each_cgroup_storage_type(stype)
|
||||
this_cpu_write(bpf_cgroup_storage[stype], storage[stype]);
|
||||
preempt_disable();
|
||||
for (i = 0; i < BPF_CGROUP_STORAGE_NEST_MAX; i++) {
|
||||
if (unlikely(this_cpu_read(bpf_cgroup_storage_info[i].task) != NULL))
|
||||
continue;
|
||||
|
||||
this_cpu_write(bpf_cgroup_storage_info[i].task, current);
|
||||
for_each_cgroup_storage_type(stype)
|
||||
this_cpu_write(bpf_cgroup_storage_info[i].storage[stype],
|
||||
storage[stype]);
|
||||
goto out;
|
||||
}
|
||||
err = -EBUSY;
|
||||
WARN_ON_ONCE(1);
|
||||
|
||||
out:
|
||||
preempt_enable();
|
||||
return err;
|
||||
}
|
||||
|
||||
static inline void bpf_cgroup_storage_unset(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < BPF_CGROUP_STORAGE_NEST_MAX; i++) {
|
||||
if (unlikely(this_cpu_read(bpf_cgroup_storage_info[i].task) != current))
|
||||
continue;
|
||||
|
||||
this_cpu_write(bpf_cgroup_storage_info[i].task, NULL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
struct bpf_cgroup_storage *
|
||||
|
|
@ -418,7 +458,6 @@ int cgroup_bpf_prog_query(const union bpf_attr *attr,
|
|||
union bpf_attr __user *uattr);
|
||||
#else
|
||||
|
||||
struct bpf_prog;
|
||||
struct cgroup_bpf {};
|
||||
static inline int cgroup_bpf_inherit(struct cgroup *cgrp) { return 0; }
|
||||
static inline void cgroup_bpf_offline(struct cgroup *cgrp) {}
|
||||
|
|
@ -448,8 +487,9 @@ static inline int cgroup_bpf_prog_query(const union bpf_attr *attr,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void bpf_cgroup_storage_set(
|
||||
struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE]) {}
|
||||
static inline int bpf_cgroup_storage_set(
|
||||
struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE]) { return 0; }
|
||||
static inline void bpf_cgroup_storage_unset(void) {}
|
||||
static inline int bpf_cgroup_storage_assign(struct bpf_prog_aux *aux,
|
||||
struct bpf_map *map) { return 0; }
|
||||
static inline struct bpf_cgroup_storage *bpf_cgroup_storage_alloc(
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/capability.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/percpu-refcount.h>
|
||||
|
||||
struct bpf_verifier_env;
|
||||
struct bpf_verifier_log;
|
||||
|
|
@ -39,6 +40,8 @@ struct bpf_local_storage;
|
|||
struct bpf_local_storage_map;
|
||||
struct kobject;
|
||||
struct mem_cgroup;
|
||||
struct module;
|
||||
struct bpf_func_state;
|
||||
|
||||
extern struct idr btf_idr;
|
||||
extern spinlock_t btf_idr_lock;
|
||||
|
|
@ -54,7 +57,7 @@ struct bpf_iter_seq_info {
|
|||
u32 seq_priv_size;
|
||||
};
|
||||
|
||||
/* map is generic key/value storage optionally accesible by eBPF programs */
|
||||
/* map is generic key/value storage optionally accessible by eBPF programs */
|
||||
struct bpf_map_ops {
|
||||
/* funcs callable from userspace (via syscall) */
|
||||
int (*map_alloc_check)(union bpf_attr *attr);
|
||||
|
|
@ -117,6 +120,9 @@ struct bpf_map_ops {
|
|||
void *owner, u32 size);
|
||||
struct bpf_local_storage __rcu ** (*map_owner_storage_ptr)(void *owner);
|
||||
|
||||
/* Misc helpers.*/
|
||||
int (*map_redirect)(struct bpf_map *map, u32 ifindex, u64 flags);
|
||||
|
||||
/* map_meta_equal must be implemented for maps that can be
|
||||
* used as an inner map. It is a runtime check to ensure
|
||||
* an inner map can be inserted to an outer map.
|
||||
|
|
@ -129,6 +135,13 @@ struct bpf_map_ops {
|
|||
bool (*map_meta_equal)(const struct bpf_map *meta0,
|
||||
const struct bpf_map *meta1);
|
||||
|
||||
|
||||
int (*map_set_for_each_callback_args)(struct bpf_verifier_env *env,
|
||||
struct bpf_func_state *caller,
|
||||
struct bpf_func_state *callee);
|
||||
int (*map_for_each_callback)(struct bpf_map *map, void *callback_fn,
|
||||
void *callback_ctx, u64 flags);
|
||||
|
||||
/* BTF name and id of struct allocated by map_alloc */
|
||||
const char * const map_btf_name;
|
||||
int *map_btf_id;
|
||||
|
|
@ -295,6 +308,9 @@ enum bpf_arg_type {
|
|||
ARG_CONST_ALLOC_SIZE_OR_ZERO, /* number of allocated bytes requested */
|
||||
ARG_PTR_TO_BTF_ID_SOCK_COMMON, /* pointer to in-kernel sock_common or bpf-mirrored bpf_sock */
|
||||
ARG_PTR_TO_PERCPU_BTF_ID, /* pointer to in-kernel percpu type */
|
||||
ARG_PTR_TO_FUNC, /* pointer to a bpf program function */
|
||||
ARG_PTR_TO_STACK_OR_NULL, /* pointer to stack or NULL */
|
||||
ARG_PTR_TO_CONST_STR, /* pointer to a null terminated read-only string */
|
||||
__BPF_ARG_TYPE_MAX,
|
||||
};
|
||||
|
||||
|
|
@ -411,6 +427,9 @@ enum bpf_reg_type {
|
|||
PTR_TO_RDWR_BUF, /* reg points to a read/write buffer */
|
||||
PTR_TO_RDWR_BUF_OR_NULL, /* reg points to a read/write buffer or NULL */
|
||||
PTR_TO_PERCPU_BTF_ID, /* reg points to a percpu kernel variable */
|
||||
PTR_TO_FUNC, /* reg points to a bpf program function */
|
||||
PTR_TO_MAP_KEY, /* reg points to a map element key */
|
||||
__BPF_REG_TYPE_MAX,
|
||||
};
|
||||
|
||||
/* The information passed from prog-specific *_is_valid_access
|
||||
|
|
@ -464,6 +483,7 @@ struct bpf_verifier_ops {
|
|||
const struct btf_type *t, int off, int size,
|
||||
enum bpf_access_type atype,
|
||||
u32 *next_btf_id);
|
||||
bool (*check_kfunc_call)(u32 kfunc_btf_id);
|
||||
};
|
||||
|
||||
struct bpf_prog_offload_ops {
|
||||
|
|
@ -506,6 +526,11 @@ enum bpf_cgroup_storage_type {
|
|||
*/
|
||||
#define MAX_BPF_FUNC_ARGS 12
|
||||
|
||||
/* The maximum number of arguments passed through registers
|
||||
* a single function may have.
|
||||
*/
|
||||
#define MAX_BPF_FUNC_REG_ARGS 5
|
||||
|
||||
struct btf_func_model {
|
||||
u8 ret_size;
|
||||
u8 nr_args;
|
||||
|
|
@ -556,7 +581,8 @@ struct bpf_tramp_progs {
|
|||
* fentry = a set of program to run before calling original function
|
||||
* fexit = a set of program to run after original function
|
||||
*/
|
||||
int arch_prepare_bpf_trampoline(void *image, void *image_end,
|
||||
struct bpf_tramp_image;
|
||||
int arch_prepare_bpf_trampoline(struct bpf_tramp_image *tr, void *image, void *image_end,
|
||||
const struct btf_func_model *m, u32 flags,
|
||||
struct bpf_tramp_progs *tprogs,
|
||||
void *orig_call);
|
||||
|
|
@ -565,6 +591,8 @@ u64 notrace __bpf_prog_enter(struct bpf_prog *prog);
|
|||
void notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start);
|
||||
u64 notrace __bpf_prog_enter_sleepable(struct bpf_prog *prog);
|
||||
void notrace __bpf_prog_exit_sleepable(struct bpf_prog *prog, u64 start);
|
||||
void notrace __bpf_tramp_enter(struct bpf_tramp_image *tr);
|
||||
void notrace __bpf_tramp_exit(struct bpf_tramp_image *tr);
|
||||
|
||||
struct bpf_ksym {
|
||||
unsigned long start;
|
||||
|
|
@ -583,6 +611,18 @@ enum bpf_tramp_prog_type {
|
|||
BPF_TRAMP_REPLACE, /* more than MAX */
|
||||
};
|
||||
|
||||
struct bpf_tramp_image {
|
||||
void *image;
|
||||
struct bpf_ksym ksym;
|
||||
struct percpu_ref pcref;
|
||||
void *ip_after_call;
|
||||
void *ip_epilogue;
|
||||
union {
|
||||
struct rcu_head rcu;
|
||||
struct work_struct work;
|
||||
};
|
||||
};
|
||||
|
||||
struct bpf_trampoline {
|
||||
/* hlist for trampoline_table */
|
||||
struct hlist_node hlist;
|
||||
|
|
@ -605,9 +645,9 @@ struct bpf_trampoline {
|
|||
/* Number of attached programs. A counter per kind. */
|
||||
int progs_cnt[BPF_TRAMP_MAX];
|
||||
/* Executable image of trampoline */
|
||||
void *image;
|
||||
struct bpf_tramp_image *cur_image;
|
||||
u64 selector;
|
||||
struct bpf_ksym ksym;
|
||||
struct module *mod;
|
||||
};
|
||||
|
||||
struct bpf_attach_target_info {
|
||||
|
|
@ -635,7 +675,7 @@ struct bpf_dispatcher {
|
|||
struct bpf_ksym ksym;
|
||||
};
|
||||
|
||||
static __always_inline unsigned int bpf_dispatcher_nop_func(
|
||||
static __always_inline __nocfi unsigned int bpf_dispatcher_nop_func(
|
||||
const void *ctx,
|
||||
const struct bpf_insn *insnsi,
|
||||
unsigned int (*bpf_func)(const void *,
|
||||
|
|
@ -663,7 +703,7 @@ void bpf_trampoline_put(struct bpf_trampoline *tr);
|
|||
}
|
||||
|
||||
#define DEFINE_BPF_DISPATCHER(name) \
|
||||
noinline unsigned int bpf_dispatcher_##name##_func( \
|
||||
noinline __nocfi unsigned int bpf_dispatcher_##name##_func( \
|
||||
const void *ctx, \
|
||||
const struct bpf_insn *insnsi, \
|
||||
unsigned int (*bpf_func)(const void *, \
|
||||
|
|
@ -691,6 +731,8 @@ void bpf_image_ksym_add(void *data, struct bpf_ksym *ksym);
|
|||
void bpf_image_ksym_del(struct bpf_ksym *ksym);
|
||||
void bpf_ksym_add(struct bpf_ksym *ksym);
|
||||
void bpf_ksym_del(struct bpf_ksym *ksym);
|
||||
int bpf_jit_charge_modmem(u32 pages);
|
||||
void bpf_jit_uncharge_modmem(u32 pages);
|
||||
#else
|
||||
static inline int bpf_trampoline_link_prog(struct bpf_prog *prog,
|
||||
struct bpf_trampoline *tr)
|
||||
|
|
@ -759,6 +801,8 @@ struct btf_mod_pair {
|
|||
struct module *module;
|
||||
};
|
||||
|
||||
struct bpf_kfunc_desc_tab;
|
||||
|
||||
struct bpf_prog_aux {
|
||||
atomic64_t refcnt;
|
||||
u32 used_map_cnt;
|
||||
|
|
@ -787,7 +831,6 @@ struct bpf_prog_aux {
|
|||
bool func_proto_unreliable;
|
||||
bool sleepable;
|
||||
bool tail_call_reachable;
|
||||
enum bpf_tramp_prog_type trampoline_prog_type;
|
||||
struct hlist_node tramp_hlist;
|
||||
/* BTF_KIND_FUNC_PROTO for valid attach_btf_id */
|
||||
const struct btf_type *attach_func_proto;
|
||||
|
|
@ -796,6 +839,7 @@ struct bpf_prog_aux {
|
|||
struct bpf_prog **func;
|
||||
void *jit_data; /* JIT specific data. arch dependent */
|
||||
struct bpf_jit_poke_descriptor *poke_tab;
|
||||
struct bpf_kfunc_desc_tab *kfunc_tab;
|
||||
u32 size_poke_tab;
|
||||
struct bpf_ksym ksym;
|
||||
const struct bpf_prog_ops *ops;
|
||||
|
|
@ -887,7 +931,6 @@ struct bpf_link_primer {
|
|||
};
|
||||
|
||||
struct bpf_struct_ops_value;
|
||||
struct btf_type;
|
||||
struct btf_member;
|
||||
|
||||
#define BPF_STRUCT_OPS_MAX_NR_MEMBERS 64
|
||||
|
|
@ -1070,6 +1113,13 @@ int bpf_prog_array_copy(struct bpf_prog_array *old_array,
|
|||
/* BPF program asks to set CN on the packet. */
|
||||
#define BPF_RET_SET_CN (1 << 0)
|
||||
|
||||
/* For BPF_PROG_RUN_ARRAY_FLAGS and __BPF_PROG_RUN_ARRAY,
|
||||
* if bpf_cgroup_storage_set() failed, the rest of programs
|
||||
* will not execute. This should be a really rare scenario
|
||||
* as it requires BPF_CGROUP_STORAGE_NEST_MAX number of
|
||||
* preemptions all between bpf_cgroup_storage_set() and
|
||||
* bpf_cgroup_storage_unset() on the same cpu.
|
||||
*/
|
||||
#define BPF_PROG_RUN_ARRAY_FLAGS(array, ctx, func, ret_flags) \
|
||||
({ \
|
||||
struct bpf_prog_array_item *_item; \
|
||||
|
|
@ -1082,10 +1132,12 @@ int bpf_prog_array_copy(struct bpf_prog_array *old_array,
|
|||
_array = rcu_dereference(array); \
|
||||
_item = &_array->items[0]; \
|
||||
while ((_prog = READ_ONCE(_item->prog))) { \
|
||||
bpf_cgroup_storage_set(_item->cgroup_storage); \
|
||||
if (unlikely(bpf_cgroup_storage_set(_item->cgroup_storage))) \
|
||||
break; \
|
||||
func_ret = func(_prog, ctx); \
|
||||
_ret &= (func_ret & 1); \
|
||||
*(ret_flags) |= (func_ret >> 1); \
|
||||
bpf_cgroup_storage_unset(); \
|
||||
_item++; \
|
||||
} \
|
||||
rcu_read_unlock(); \
|
||||
|
|
@ -1093,7 +1145,7 @@ int bpf_prog_array_copy(struct bpf_prog_array *old_array,
|
|||
_ret; \
|
||||
})
|
||||
|
||||
#define __BPF_PROG_RUN_ARRAY(array, ctx, func, check_non_null) \
|
||||
#define __BPF_PROG_RUN_ARRAY(array, ctx, func, check_non_null, set_cg_storage) \
|
||||
({ \
|
||||
struct bpf_prog_array_item *_item; \
|
||||
struct bpf_prog *_prog; \
|
||||
|
|
@ -1106,8 +1158,14 @@ int bpf_prog_array_copy(struct bpf_prog_array *old_array,
|
|||
goto _out; \
|
||||
_item = &_array->items[0]; \
|
||||
while ((_prog = READ_ONCE(_item->prog))) { \
|
||||
bpf_cgroup_storage_set(_item->cgroup_storage); \
|
||||
_ret &= func(_prog, ctx); \
|
||||
if (!set_cg_storage) { \
|
||||
_ret &= func(_prog, ctx); \
|
||||
} else { \
|
||||
if (unlikely(bpf_cgroup_storage_set(_item->cgroup_storage))) \
|
||||
break; \
|
||||
_ret &= func(_prog, ctx); \
|
||||
bpf_cgroup_storage_unset(); \
|
||||
} \
|
||||
_item++; \
|
||||
} \
|
||||
_out: \
|
||||
|
|
@ -1153,10 +1211,10 @@ _out: \
|
|||
})
|
||||
|
||||
#define BPF_PROG_RUN_ARRAY(array, ctx, func) \
|
||||
__BPF_PROG_RUN_ARRAY(array, ctx, func, false)
|
||||
__BPF_PROG_RUN_ARRAY(array, ctx, func, false, true)
|
||||
|
||||
#define BPF_PROG_RUN_ARRAY_CHECK(array, ctx, func) \
|
||||
__BPF_PROG_RUN_ARRAY(array, ctx, func, true)
|
||||
__BPF_PROG_RUN_ARRAY(array, ctx, func, true, false)
|
||||
|
||||
#ifdef CONFIG_BPF_SYSCALL
|
||||
DECLARE_PER_CPU(int, bpf_prog_active);
|
||||
|
|
@ -1380,6 +1438,10 @@ void bpf_iter_map_show_fdinfo(const struct bpf_iter_aux_info *aux,
|
|||
int bpf_iter_map_fill_link_info(const struct bpf_iter_aux_info *aux,
|
||||
struct bpf_link_info *info);
|
||||
|
||||
int map_set_for_each_callback_args(struct bpf_verifier_env *env,
|
||||
struct bpf_func_state *caller,
|
||||
struct bpf_func_state *callee);
|
||||
|
||||
int bpf_percpu_hash_copy(struct bpf_map *map, void *key, void *value);
|
||||
int bpf_percpu_array_copy(struct bpf_map *map, void *key, void *value);
|
||||
int bpf_percpu_hash_update(struct bpf_map *map, void *key, void *value,
|
||||
|
|
@ -1429,9 +1491,9 @@ struct btf *bpf_get_btf_vmlinux(void);
|
|||
/* Map specifics */
|
||||
struct xdp_buff;
|
||||
struct sk_buff;
|
||||
struct bpf_dtab_netdev;
|
||||
struct bpf_cpu_map_entry;
|
||||
|
||||
struct bpf_dtab_netdev *__dev_map_lookup_elem(struct bpf_map *map, u32 key);
|
||||
struct bpf_dtab_netdev *__dev_map_hash_lookup_elem(struct bpf_map *map, u32 key);
|
||||
void __dev_flush(void);
|
||||
int dev_xdp_enqueue(struct net_device *dev, struct xdp_buff *xdp,
|
||||
struct net_device *dev_rx);
|
||||
|
|
@ -1441,7 +1503,6 @@ int dev_map_generic_redirect(struct bpf_dtab_netdev *dst, struct sk_buff *skb,
|
|||
struct bpf_prog *xdp_prog);
|
||||
bool dev_map_can_have_prog(struct bpf_map *map);
|
||||
|
||||
struct bpf_cpu_map_entry *__cpu_map_lookup_elem(struct bpf_map *map, u32 key);
|
||||
void __cpu_map_flush(void);
|
||||
int cpu_map_enqueue(struct bpf_cpu_map_entry *rcpu, struct xdp_buff *xdp,
|
||||
struct net_device *dev_rx);
|
||||
|
|
@ -1470,6 +1531,10 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
|
|||
int bpf_prog_test_run_raw_tp(struct bpf_prog *prog,
|
||||
const union bpf_attr *kattr,
|
||||
union bpf_attr __user *uattr);
|
||||
int bpf_prog_test_run_sk_lookup(struct bpf_prog *prog,
|
||||
const union bpf_attr *kattr,
|
||||
union bpf_attr __user *uattr);
|
||||
bool bpf_prog_test_check_kfunc_call(u32 kfunc_id);
|
||||
bool btf_ctx_access(int off, int size, enum bpf_access_type type,
|
||||
const struct bpf_prog *prog,
|
||||
struct bpf_insn_access_aux *info);
|
||||
|
|
@ -1488,8 +1553,11 @@ int btf_distill_func_proto(struct bpf_verifier_log *log,
|
|||
struct btf_func_model *m);
|
||||
|
||||
struct bpf_reg_state;
|
||||
int btf_check_func_arg_match(struct bpf_verifier_env *env, int subprog,
|
||||
struct bpf_reg_state *regs);
|
||||
int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog,
|
||||
struct bpf_reg_state *regs);
|
||||
int btf_check_kfunc_arg_match(struct bpf_verifier_env *env,
|
||||
const struct btf *btf, u32 func_id,
|
||||
struct bpf_reg_state *regs);
|
||||
int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog,
|
||||
struct bpf_reg_state *reg);
|
||||
int btf_check_type_match(struct bpf_verifier_log *log, const struct bpf_prog *prog,
|
||||
|
|
@ -1499,6 +1567,11 @@ struct bpf_prog *bpf_prog_by_id(u32 id);
|
|||
struct bpf_link *bpf_link_by_id(u32 id);
|
||||
|
||||
const struct bpf_func_proto *bpf_base_func_proto(enum bpf_func_id func_id);
|
||||
void bpf_task_storage_free(struct task_struct *task);
|
||||
bool bpf_prog_has_kfunc_call(const struct bpf_prog *prog);
|
||||
const struct btf_func_model *
|
||||
bpf_jit_find_kfunc_model(const struct bpf_prog *prog,
|
||||
const struct bpf_insn *insn);
|
||||
#else /* !CONFIG_BPF_SYSCALL */
|
||||
static inline struct bpf_prog *bpf_prog_get(u32 ufd)
|
||||
{
|
||||
|
|
@ -1568,17 +1641,6 @@ static inline int bpf_obj_get_user(const char __user *pathname, int flags)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline struct net_device *__dev_map_lookup_elem(struct bpf_map *map,
|
||||
u32 key)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct net_device *__dev_map_hash_lookup_elem(struct bpf_map *map,
|
||||
u32 key)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline bool dev_map_can_have_prog(struct bpf_map *map)
|
||||
{
|
||||
return false;
|
||||
|
|
@ -1590,6 +1652,7 @@ static inline void __dev_flush(void)
|
|||
|
||||
struct xdp_buff;
|
||||
struct bpf_dtab_netdev;
|
||||
struct bpf_cpu_map_entry;
|
||||
|
||||
static inline
|
||||
int dev_xdp_enqueue(struct net_device *dev, struct xdp_buff *xdp,
|
||||
|
|
@ -1614,12 +1677,6 @@ static inline int dev_map_generic_redirect(struct bpf_dtab_netdev *dst,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
struct bpf_cpu_map_entry *__cpu_map_lookup_elem(struct bpf_map *map, u32 key)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void __cpu_map_flush(void)
|
||||
{
|
||||
}
|
||||
|
|
@ -1670,6 +1727,18 @@ static inline int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
|
|||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int bpf_prog_test_run_sk_lookup(struct bpf_prog *prog,
|
||||
const union bpf_attr *kattr,
|
||||
union bpf_attr __user *uattr)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline bool bpf_prog_test_check_kfunc_call(u32 kfunc_id)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void bpf_map_put(struct bpf_map *map)
|
||||
{
|
||||
}
|
||||
|
|
@ -1684,6 +1753,22 @@ bpf_base_func_proto(enum bpf_func_id func_id)
|
|||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void bpf_task_storage_free(struct task_struct *task)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool bpf_prog_has_kfunc_call(const struct bpf_prog *prog)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline const struct btf_func_model *
|
||||
bpf_jit_find_kfunc_model(const struct bpf_prog *prog,
|
||||
const struct bpf_insn *insn)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_BPF_SYSCALL */
|
||||
|
||||
void __bpf_free_used_btfs(struct bpf_prog_aux *aux,
|
||||
|
|
@ -1768,22 +1853,24 @@ static inline void bpf_map_offload_map_free(struct bpf_map *map)
|
|||
}
|
||||
#endif /* CONFIG_NET && CONFIG_BPF_SYSCALL */
|
||||
|
||||
#if defined(CONFIG_BPF_STREAM_PARSER)
|
||||
int sock_map_prog_update(struct bpf_map *map, struct bpf_prog *prog,
|
||||
struct bpf_prog *old, u32 which);
|
||||
#if defined(CONFIG_INET) && defined(CONFIG_BPF_SYSCALL)
|
||||
int sock_map_get_from_fd(const union bpf_attr *attr, struct bpf_prog *prog);
|
||||
int sock_map_prog_detach(const union bpf_attr *attr, enum bpf_prog_type ptype);
|
||||
int sock_map_update_elem_sys(struct bpf_map *map, void *key, void *value, u64 flags);
|
||||
void sock_map_unhash(struct sock *sk);
|
||||
void sock_map_close(struct sock *sk, long timeout);
|
||||
|
||||
void bpf_sk_reuseport_detach(struct sock *sk);
|
||||
int bpf_fd_reuseport_array_lookup_elem(struct bpf_map *map, void *key,
|
||||
void *value);
|
||||
int bpf_fd_reuseport_array_update_elem(struct bpf_map *map, void *key,
|
||||
void *value, u64 map_flags);
|
||||
#else
|
||||
static inline int sock_map_prog_update(struct bpf_map *map,
|
||||
struct bpf_prog *prog,
|
||||
struct bpf_prog *old, u32 which)
|
||||
static inline void bpf_sk_reuseport_detach(struct sock *sk)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BPF_SYSCALL
|
||||
static inline int sock_map_get_from_fd(const union bpf_attr *attr,
|
||||
struct bpf_prog *prog)
|
||||
{
|
||||
|
|
@ -1801,20 +1888,7 @@ static inline int sock_map_update_elem_sys(struct bpf_map *map, void *key, void
|
|||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif /* CONFIG_BPF_STREAM_PARSER */
|
||||
|
||||
#if defined(CONFIG_INET) && defined(CONFIG_BPF_SYSCALL)
|
||||
void bpf_sk_reuseport_detach(struct sock *sk);
|
||||
int bpf_fd_reuseport_array_lookup_elem(struct bpf_map *map, void *key,
|
||||
void *value);
|
||||
int bpf_fd_reuseport_array_update_elem(struct bpf_map *map, void *key,
|
||||
void *value, u64 map_flags);
|
||||
#else
|
||||
static inline void bpf_sk_reuseport_detach(struct sock *sk)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BPF_SYSCALL
|
||||
static inline int bpf_fd_reuseport_array_lookup_elem(struct bpf_map *map,
|
||||
void *key, void *value)
|
||||
{
|
||||
|
|
@ -1881,11 +1955,15 @@ extern const struct bpf_func_proto bpf_skc_to_tcp_request_sock_proto;
|
|||
extern const struct bpf_func_proto bpf_skc_to_udp6_sock_proto;
|
||||
extern const struct bpf_func_proto bpf_copy_from_user_proto;
|
||||
extern const struct bpf_func_proto bpf_snprintf_btf_proto;
|
||||
extern const struct bpf_func_proto bpf_snprintf_proto;
|
||||
extern const struct bpf_func_proto bpf_per_cpu_ptr_proto;
|
||||
extern const struct bpf_func_proto bpf_this_cpu_ptr_proto;
|
||||
extern const struct bpf_func_proto bpf_ktime_get_coarse_ns_proto;
|
||||
extern const struct bpf_func_proto bpf_sock_from_file_proto;
|
||||
extern const struct bpf_func_proto bpf_get_socket_ptr_cookie_proto;
|
||||
extern const struct bpf_func_proto bpf_task_storage_get_proto;
|
||||
extern const struct bpf_func_proto bpf_task_storage_delete_proto;
|
||||
extern const struct bpf_func_proto bpf_for_each_map_elem_proto;
|
||||
|
||||
const struct bpf_func_proto *bpf_tracing_func_proto(
|
||||
enum bpf_func_id func_id, const struct bpf_prog *prog);
|
||||
|
|
@ -2003,4 +2081,8 @@ int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
|
|||
struct btf_id_set;
|
||||
bool btf_id_set_contains(const struct btf_id_set *set, u32 id);
|
||||
|
||||
int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args,
|
||||
u32 **bin_buf, u32 num_args);
|
||||
void bpf_bprintf_cleanup(void);
|
||||
|
||||
#endif /* _LINUX_BPF_H */
|
||||
|
|
|
|||
|
|
@ -126,7 +126,8 @@ bpf_local_storage_lookup(struct bpf_local_storage *local_storage,
|
|||
struct bpf_local_storage_map *smap,
|
||||
bool cacheit_lockit);
|
||||
|
||||
void bpf_local_storage_map_free(struct bpf_local_storage_map *smap);
|
||||
void bpf_local_storage_map_free(struct bpf_local_storage_map *smap,
|
||||
int __percpu *busy_counter);
|
||||
|
||||
int bpf_local_storage_map_check_btf(const struct bpf_map *map,
|
||||
const struct btf *btf,
|
||||
|
|
|
|||
|
|
@ -38,21 +38,9 @@ static inline struct bpf_storage_blob *bpf_inode(
|
|||
return inode->i_security + bpf_lsm_blob_sizes.lbs_inode;
|
||||
}
|
||||
|
||||
static inline struct bpf_storage_blob *bpf_task(
|
||||
const struct task_struct *task)
|
||||
{
|
||||
if (unlikely(!task->security))
|
||||
return NULL;
|
||||
|
||||
return task->security + bpf_lsm_blob_sizes.lbs_task;
|
||||
}
|
||||
|
||||
extern const struct bpf_func_proto bpf_inode_storage_get_proto;
|
||||
extern const struct bpf_func_proto bpf_inode_storage_delete_proto;
|
||||
extern const struct bpf_func_proto bpf_task_storage_get_proto;
|
||||
extern const struct bpf_func_proto bpf_task_storage_delete_proto;
|
||||
void bpf_inode_storage_free(struct inode *inode);
|
||||
void bpf_task_storage_free(struct task_struct *task);
|
||||
|
||||
#else /* !CONFIG_BPF_LSM */
|
||||
|
||||
|
|
@ -73,20 +61,10 @@ static inline struct bpf_storage_blob *bpf_inode(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct bpf_storage_blob *bpf_task(
|
||||
const struct task_struct *task)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void bpf_inode_storage_free(struct inode *inode)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void bpf_task_storage_free(struct task_struct *task)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BPF_LSM */
|
||||
|
||||
#endif /* _LINUX_BPF_LSM_H */
|
||||
|
|
|
|||
|
|
@ -103,19 +103,17 @@ BPF_MAP_TYPE(BPF_MAP_TYPE_HASH_OF_MAPS, htab_of_maps_map_ops)
|
|||
BPF_MAP_TYPE(BPF_MAP_TYPE_DEVMAP, dev_map_ops)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_DEVMAP_HASH, dev_map_hash_ops)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_SK_STORAGE, sk_storage_map_ops)
|
||||
#if defined(CONFIG_BPF_STREAM_PARSER)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_SOCKMAP, sock_map_ops)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_SOCKHASH, sock_hash_ops)
|
||||
#endif
|
||||
#ifdef CONFIG_BPF_LSM
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_INODE_STORAGE, inode_storage_map_ops)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_TASK_STORAGE, task_storage_map_ops)
|
||||
#endif
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_TASK_STORAGE, task_storage_map_ops)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_CPUMAP, cpu_map_ops)
|
||||
#if defined(CONFIG_XDP_SOCKETS)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_XSKMAP, xsk_map_ops)
|
||||
#endif
|
||||
#ifdef CONFIG_INET
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_SOCKMAP, sock_map_ops)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_SOCKHASH, sock_hash_ops)
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_REUSEPORT_SOCKARRAY, reuseport_array_ops)
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -68,6 +68,8 @@ struct bpf_reg_state {
|
|||
unsigned long raw1;
|
||||
unsigned long raw2;
|
||||
} raw;
|
||||
|
||||
u32 subprogno; /* for PTR_TO_FUNC */
|
||||
};
|
||||
/* For PTR_TO_PACKET, used to find other pointers with the same variable
|
||||
* offset, so they can share range knowledge.
|
||||
|
|
@ -204,6 +206,7 @@ struct bpf_func_state {
|
|||
int acquired_refs;
|
||||
struct bpf_reference_state *refs;
|
||||
int allocated_stack;
|
||||
bool in_callback_fn;
|
||||
struct bpf_stack_state *stack;
|
||||
};
|
||||
|
||||
|
|
@ -299,10 +302,11 @@ struct bpf_verifier_state_list {
|
|||
};
|
||||
|
||||
/* Possible states for alu_state member. */
|
||||
#define BPF_ALU_SANITIZE_SRC 1U
|
||||
#define BPF_ALU_SANITIZE_DST 2U
|
||||
#define BPF_ALU_SANITIZE_SRC (1U << 0)
|
||||
#define BPF_ALU_SANITIZE_DST (1U << 1)
|
||||
#define BPF_ALU_NEG_VALUE (1U << 2)
|
||||
#define BPF_ALU_NON_POINTER (1U << 3)
|
||||
#define BPF_ALU_IMMEDIATE (1U << 4)
|
||||
#define BPF_ALU_SANITIZE (BPF_ALU_SANITIZE_SRC | \
|
||||
BPF_ALU_SANITIZE_DST)
|
||||
|
||||
|
|
@ -484,6 +488,15 @@ static inline u64 bpf_trampoline_compute_key(const struct bpf_prog *tgt_prog,
|
|||
return ((u64)btf_obj_id(btf) << 32) | 0x80000000 | btf_id;
|
||||
}
|
||||
|
||||
/* unpack the IDs from the key as constructed above */
|
||||
static inline void bpf_trampoline_unpack_key(u64 key, u32 *obj_id, u32 *btf_id)
|
||||
{
|
||||
if (obj_id)
|
||||
*obj_id = key >> 32;
|
||||
if (btf_id)
|
||||
*btf_id = key & 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
int bpf_check_attach_target(struct bpf_verifier_log *log,
|
||||
const struct bpf_prog *prog,
|
||||
const struct bpf_prog *tgt_prog,
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#include <uapi/linux/bpf.h>
|
||||
|
||||
#define BTF_TYPE_EMIT(type) ((void)(type *)0)
|
||||
#define BTF_TYPE_EMIT_ENUM(enum_val) ((void)enum_val)
|
||||
|
||||
struct btf;
|
||||
struct btf_member;
|
||||
|
|
@ -109,6 +110,7 @@ const struct btf_type *btf_type_resolve_func_ptr(const struct btf *btf,
|
|||
const struct btf_type *
|
||||
btf_resolve_size(const struct btf *btf, const struct btf_type *type,
|
||||
u32 *type_size);
|
||||
const char *btf_type_str(const struct btf_type *t);
|
||||
|
||||
#define for_each_member(i, struct_type, member) \
|
||||
for (i = 0, member = btf_type_member(struct_type); \
|
||||
|
|
@ -140,6 +142,11 @@ static inline bool btf_type_is_enum(const struct btf_type *t)
|
|||
return BTF_INFO_KIND(t->info) == BTF_KIND_ENUM;
|
||||
}
|
||||
|
||||
static inline bool btf_type_is_scalar(const struct btf_type *t)
|
||||
{
|
||||
return btf_type_is_int(t) || btf_type_is_enum(t);
|
||||
}
|
||||
|
||||
static inline bool btf_type_is_typedef(const struct btf_type *t)
|
||||
{
|
||||
return BTF_INFO_KIND(t->info) == BTF_KIND_TYPEDEF;
|
||||
|
|
|
|||
|
|
@ -194,6 +194,8 @@ void __breadahead_gfp(struct block_device *, sector_t block, unsigned int size,
|
|||
struct buffer_head *__bread_gfp(struct block_device *,
|
||||
sector_t block, unsigned size, gfp_t gfp);
|
||||
void invalidate_bh_lrus(void);
|
||||
void invalidate_bh_lrus_cpu(int cpu);
|
||||
bool has_bh_in_lru(int cpu, void *dummy);
|
||||
struct buffer_head *alloc_buffer_head(gfp_t gfp_flags);
|
||||
void free_buffer_head(struct buffer_head * bh);
|
||||
void unlock_buffer(struct buffer_head *bh);
|
||||
|
|
@ -406,6 +408,8 @@ static inline int inode_has_buffers(struct inode *inode) { return 0; }
|
|||
static inline void invalidate_inode_buffers(struct inode *inode) {}
|
||||
static inline int remove_inode_buffers(struct inode *inode) { return 1; }
|
||||
static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; }
|
||||
static inline void invalidate_bh_lrus_cpu(int cpu) {}
|
||||
static inline bool has_bh_in_lru(int cpu, void *dummy) { return 0; }
|
||||
#define buffer_heads_over_limit 0
|
||||
|
||||
#endif /* CONFIG_BLOCK */
|
||||
|
|
|
|||
|
|
@ -36,6 +36,9 @@ static inline int is_warning_bug(const struct bug_entry *bug)
|
|||
return bug->flags & BUGFLAG_WARNING;
|
||||
}
|
||||
|
||||
void bug_get_file_line(struct bug_entry *bug, const char **file,
|
||||
unsigned int *line);
|
||||
|
||||
struct bug_entry *find_bug(unsigned long bugaddr);
|
||||
|
||||
enum bug_trap_type report_bug(unsigned long bug_addr, struct pt_regs *regs);
|
||||
|
|
@ -58,6 +61,13 @@ static inline enum bug_trap_type report_bug(unsigned long bug_addr,
|
|||
return BUG_TRAP_TYPE_BUG;
|
||||
}
|
||||
|
||||
struct bug_entry;
|
||||
static inline void bug_get_file_line(struct bug_entry *bug, const char **file,
|
||||
unsigned int *line)
|
||||
{
|
||||
*file = NULL;
|
||||
*line = 0;
|
||||
}
|
||||
|
||||
static inline void generic_bug_clear_once(void) {}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2020 Pengutronix, Marc Kleine-Budde <kernel@pengutronix.de>
|
||||
* Copyright (c) 2021 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
|
||||
*/
|
||||
|
||||
#ifndef _CAN_BITTIMING_H
|
||||
|
|
@ -10,9 +11,83 @@
|
|||
|
||||
#define CAN_SYNC_SEG 1
|
||||
|
||||
|
||||
/* Kilobits and Megabits per second */
|
||||
#define CAN_KBPS 1000UL
|
||||
#define CAN_MBPS 1000000UL
|
||||
|
||||
/* Megahertz */
|
||||
#define CAN_MHZ 1000000UL
|
||||
|
||||
/*
|
||||
* struct can_tdc - CAN FD Transmission Delay Compensation parameters
|
||||
*
|
||||
* At high bit rates, the propagation delay from the TX pin to the RX
|
||||
* pin of the transceiver causes measurement errors: the sample point
|
||||
* on the RX pin might occur on the previous bit.
|
||||
*
|
||||
* To solve this issue, ISO 11898-1 introduces in section 11.3.3
|
||||
* "Transmitter delay compensation" a SSP (Secondary Sample Point)
|
||||
* equal to the distance, in time quanta, from the start of the bit
|
||||
* time on the TX pin to the actual measurement on the RX pin.
|
||||
*
|
||||
* This structure contains the parameters to calculate that SSP.
|
||||
*
|
||||
* @tdcv: Transmitter Delay Compensation Value. Distance, in time
|
||||
* quanta, from when the bit is sent on the TX pin to when it is
|
||||
* received on the RX pin of the transmitter. Possible options:
|
||||
*
|
||||
* O: automatic mode. The controller dynamically measure @tdcv
|
||||
* for each transmitted CAN FD frame.
|
||||
*
|
||||
* Other values: manual mode. Use the fixed provided value.
|
||||
*
|
||||
* @tdco: Transmitter Delay Compensation Offset. Offset value, in time
|
||||
* quanta, defining the distance between the start of the bit
|
||||
* reception on the RX pin of the transceiver and the SSP
|
||||
* position such as SSP = @tdcv + @tdco.
|
||||
*
|
||||
* If @tdco is zero, then TDC is disabled and both @tdcv and
|
||||
* @tdcf should be ignored.
|
||||
*
|
||||
* @tdcf: Transmitter Delay Compensation Filter window. Defines the
|
||||
* minimum value for the SSP position in time quanta. If SSP is
|
||||
* less than @tdcf, then no delay compensations occur and the
|
||||
* normal sampling point is used instead. The feature is enabled
|
||||
* if and only if @tdcv is set to zero (automatic mode) and @tdcf
|
||||
* is configured to a value greater than @tdco.
|
||||
*/
|
||||
struct can_tdc {
|
||||
u32 tdcv;
|
||||
u32 tdco;
|
||||
u32 tdcf;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct can_tdc_const - CAN hardware-dependent constant for
|
||||
* Transmission Delay Compensation
|
||||
*
|
||||
* @tdcv_max: Transmitter Delay Compensation Value maximum value.
|
||||
* Should be set to zero if the controller does not support
|
||||
* manual mode for tdcv.
|
||||
* @tdco_max: Transmitter Delay Compensation Offset maximum value.
|
||||
* Should not be zero. If the controller does not support TDC,
|
||||
* then the pointer to this structure should be NULL.
|
||||
* @tdcf_max: Transmitter Delay Compensation Filter window maximum
|
||||
* value. Should be set to zero if the controller does not
|
||||
* support this feature.
|
||||
*/
|
||||
struct can_tdc_const {
|
||||
u32 tdcv_max;
|
||||
u32 tdco_max;
|
||||
u32 tdcf_max;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CAN_CALC_BITTIMING
|
||||
int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,
|
||||
const struct can_bittiming_const *btc);
|
||||
|
||||
void can_calc_tdco(struct net_device *dev);
|
||||
#else /* !CONFIG_CAN_CALC_BITTIMING */
|
||||
static inline int
|
||||
can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,
|
||||
|
|
@ -21,6 +96,10 @@ can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,
|
|||
netdev_err(dev, "bit-timing calculation not available\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void can_calc_tdco(struct net_device *dev)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_CAN_CALC_BITTIMING */
|
||||
|
||||
int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt,
|
||||
|
|
|
|||
|
|
@ -39,19 +39,23 @@ struct can_priv {
|
|||
struct net_device *dev;
|
||||
struct can_device_stats can_stats;
|
||||
|
||||
struct can_bittiming bittiming, data_bittiming;
|
||||
const struct can_bittiming_const *bittiming_const,
|
||||
*data_bittiming_const;
|
||||
const u16 *termination_const;
|
||||
unsigned int termination_const_cnt;
|
||||
u16 termination;
|
||||
const u32 *bitrate_const;
|
||||
struct can_bittiming bittiming, data_bittiming;
|
||||
const struct can_tdc_const *tdc_const;
|
||||
struct can_tdc tdc;
|
||||
|
||||
unsigned int bitrate_const_cnt;
|
||||
const u32 *bitrate_const;
|
||||
const u32 *data_bitrate_const;
|
||||
unsigned int data_bitrate_const_cnt;
|
||||
u32 bitrate_max;
|
||||
struct can_clock clock;
|
||||
|
||||
unsigned int termination_const_cnt;
|
||||
const u16 *termination_const;
|
||||
u16 termination;
|
||||
|
||||
enum can_state state;
|
||||
|
||||
/* CAN controller features - see include/uapi/linux/can/netlink.h */
|
||||
|
|
|
|||
|
|
@ -23,7 +23,8 @@ struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx,
|
|||
u8 *len_ptr, unsigned int *frame_len_ptr);
|
||||
unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx,
|
||||
unsigned int *frame_len_ptr);
|
||||
void can_free_echo_skb(struct net_device *dev, unsigned int idx);
|
||||
void can_free_echo_skb(struct net_device *dev, unsigned int idx,
|
||||
unsigned int *frame_len_ptr);
|
||||
struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf);
|
||||
struct sk_buff *alloc_canfd_skb(struct net_device *dev,
|
||||
struct canfd_frame **cfd);
|
||||
|
|
@ -65,8 +66,12 @@ static inline void can_skb_reserve(struct sk_buff *skb)
|
|||
|
||||
static inline void can_skb_set_owner(struct sk_buff *skb, struct sock *sk)
|
||||
{
|
||||
if (sk) {
|
||||
sock_hold(sk);
|
||||
/* If the socket has already been closed by user space, the
|
||||
* refcount may already be 0 (and the socket will be freed
|
||||
* after the last TX skb has been freed). So only increase
|
||||
* socket refcount if the refcount is > 0.
|
||||
*/
|
||||
if (sk && refcount_inc_not_zero(&sk->sk_refcnt)) {
|
||||
skb->destructor = sock_efree;
|
||||
skb->sk = sk;
|
||||
}
|
||||
|
|
|
|||
41
include/linux/cfi.h
Normal file
41
include/linux/cfi.h
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Clang Control Flow Integrity (CFI) support.
|
||||
*
|
||||
* Copyright (C) 2021 Google LLC
|
||||
*/
|
||||
#ifndef _LINUX_CFI_H
|
||||
#define _LINUX_CFI_H
|
||||
|
||||
#ifdef CONFIG_CFI_CLANG
|
||||
typedef void (*cfi_check_fn)(uint64_t id, void *ptr, void *diag);
|
||||
|
||||
/* Compiler-generated function in each module, and the kernel */
|
||||
extern void __cfi_check(uint64_t id, void *ptr, void *diag);
|
||||
|
||||
/*
|
||||
* Force the compiler to generate a CFI jump table entry for a function
|
||||
* and store the jump table address to __cfi_jt_<function>.
|
||||
*/
|
||||
#define __CFI_ADDRESSABLE(fn, __attr) \
|
||||
const void *__cfi_jt_ ## fn __visible __attr = (void *)&fn
|
||||
|
||||
#ifdef CONFIG_CFI_CLANG_SHADOW
|
||||
|
||||
extern void cfi_module_add(struct module *mod, unsigned long base_addr);
|
||||
extern void cfi_module_remove(struct module *mod, unsigned long base_addr);
|
||||
|
||||
#else
|
||||
|
||||
static inline void cfi_module_add(struct module *mod, unsigned long base_addr) {}
|
||||
static inline void cfi_module_remove(struct module *mod, unsigned long base_addr) {}
|
||||
|
||||
#endif /* CONFIG_CFI_CLANG_SHADOW */
|
||||
|
||||
#else /* !CONFIG_CFI_CLANG */
|
||||
|
||||
#define __CFI_ADDRESSABLE(fn, __attr)
|
||||
|
||||
#endif /* CONFIG_CFI_CLANG */
|
||||
|
||||
#endif /* _LINUX_CFI_H */
|
||||
|
|
@ -61,6 +61,10 @@ SUBSYS(pids)
|
|||
SUBSYS(rdma)
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_CGROUP_MISC)
|
||||
SUBSYS(misc)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following subsystems are not supported on the default hierarchy.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -785,6 +785,23 @@ struct clk *clk_register_divider_table(struct device *dev, const char *name,
|
|||
(parent_data), (flags), (reg), (shift), \
|
||||
(width), (clk_divider_flags), (table), \
|
||||
(lock))
|
||||
/**
|
||||
* devm_clk_hw_register_divider - register a divider clock with the clock framework
|
||||
* @dev: device registering this clock
|
||||
* @name: name of this clock
|
||||
* @parent_name: name of clock's parent
|
||||
* @flags: framework-specific flags
|
||||
* @reg: register address to adjust divider
|
||||
* @shift: number of bits to shift the bitfield
|
||||
* @width: width of the bitfield
|
||||
* @clk_divider_flags: divider-specific flags for this clock
|
||||
* @lock: shared register lock for this clock
|
||||
*/
|
||||
#define devm_clk_hw_register_divider(dev, name, parent_name, flags, reg, shift, \
|
||||
width, clk_divider_flags, lock) \
|
||||
__devm_clk_hw_register_divider((dev), NULL, (name), (parent_name), NULL, \
|
||||
NULL, (flags), (reg), (shift), (width), \
|
||||
(clk_divider_flags), NULL, (lock))
|
||||
/**
|
||||
* devm_clk_hw_register_divider_table - register a table based divider clock
|
||||
* with the clock framework (devres variant)
|
||||
|
|
@ -868,6 +885,13 @@ struct clk_hw *__clk_hw_register_mux(struct device *dev, struct device_node *np,
|
|||
const struct clk_parent_data *parent_data,
|
||||
unsigned long flags, void __iomem *reg, u8 shift, u32 mask,
|
||||
u8 clk_mux_flags, u32 *table, spinlock_t *lock);
|
||||
struct clk_hw *__devm_clk_hw_register_mux(struct device *dev, struct device_node *np,
|
||||
const char *name, u8 num_parents,
|
||||
const char * const *parent_names,
|
||||
const struct clk_hw **parent_hws,
|
||||
const struct clk_parent_data *parent_data,
|
||||
unsigned long flags, void __iomem *reg, u8 shift, u32 mask,
|
||||
u8 clk_mux_flags, u32 *table, spinlock_t *lock);
|
||||
struct clk *clk_register_mux_table(struct device *dev, const char *name,
|
||||
const char * const *parent_names, u8 num_parents,
|
||||
unsigned long flags, void __iomem *reg, u8 shift, u32 mask,
|
||||
|
|
@ -902,6 +926,12 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name,
|
|||
__clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, NULL, \
|
||||
(parent_data), (flags), (reg), (shift), \
|
||||
BIT((width)) - 1, (clk_mux_flags), NULL, (lock))
|
||||
#define devm_clk_hw_register_mux(dev, name, parent_names, num_parents, flags, reg, \
|
||||
shift, width, clk_mux_flags, lock) \
|
||||
__devm_clk_hw_register_mux((dev), NULL, (name), (num_parents), \
|
||||
(parent_names), NULL, NULL, (flags), (reg), \
|
||||
(shift), BIT((width)) - 1, (clk_mux_flags), \
|
||||
NULL, (lock))
|
||||
|
||||
int clk_mux_val_to_index(struct clk_hw *hw, u32 *table, unsigned int flags,
|
||||
unsigned int val);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2012-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_CLK_TEGRA_H_
|
||||
|
|
@ -123,6 +123,8 @@ static inline void tegra_cpu_clock_resume(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
extern int tegra210_plle_hw_sequence_start(void);
|
||||
extern bool tegra210_plle_hw_sequence_is_enabled(void);
|
||||
extern void tegra210_xusb_pll_hw_control_enable(void);
|
||||
extern void tegra210_xusb_pll_hw_sequence_start(void);
|
||||
extern void tegra210_sata_pll_hw_control_enable(void);
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/clocksource_ids.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
|
|
@ -62,6 +63,10 @@ struct module;
|
|||
* 400-499: Perfect
|
||||
* The ideal clocksource. A must-use where
|
||||
* available.
|
||||
* @id: Defaults to CSID_GENERIC. The id value is captured
|
||||
* in certain snapshot functions to allow callers to
|
||||
* validate the clocksource from which the snapshot was
|
||||
* taken.
|
||||
* @flags: Flags describing special properties
|
||||
* @enable: Optional function to enable the clocksource
|
||||
* @disable: Optional function to disable the clocksource
|
||||
|
|
@ -70,7 +75,7 @@ struct module;
|
|||
* @mark_unstable: Optional function to inform the clocksource driver that
|
||||
* the watchdog marked the clocksource unstable
|
||||
* @tick_stable: Optional function called periodically from the watchdog
|
||||
* code to provide stable syncrhonization points
|
||||
* code to provide stable synchronization points
|
||||
* @wd_list: List head to enqueue into the watchdog list (internal)
|
||||
* @cs_last: Last clocksource value for clocksource watchdog
|
||||
* @wd_last: Last watchdog value corresponding to @cs_last
|
||||
|
|
@ -100,6 +105,7 @@ struct clocksource {
|
|||
const char *name;
|
||||
struct list_head list;
|
||||
int rating;
|
||||
enum clocksource_ids id;
|
||||
enum vdso_clock_mode vdso_clock_mode;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
|
|||
12
include/linux/clocksource_ids.h
Normal file
12
include/linux/clocksource_ids.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _LINUX_CLOCKSOURCE_IDS_H
|
||||
#define _LINUX_CLOCKSOURCE_IDS_H
|
||||
|
||||
/* Enum to give clocksources a unique identifier */
|
||||
enum clocksource_ids {
|
||||
CSID_GENERIC = 0,
|
||||
CSID_ARM_ARCH_COUNTER,
|
||||
CSID_MAX,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -44,9 +44,9 @@ extern int cma_init_reserved_mem(phys_addr_t base, phys_addr_t size,
|
|||
unsigned int order_per_bit,
|
||||
const char *name,
|
||||
struct cma **res_cma);
|
||||
extern struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align,
|
||||
extern struct page *cma_alloc(struct cma *cma, unsigned long count, unsigned int align,
|
||||
bool no_warn);
|
||||
extern bool cma_release(struct cma *cma, const struct page *pages, unsigned int count);
|
||||
extern bool cma_release(struct cma *cma, const struct page *pages, unsigned long count);
|
||||
|
||||
extern int cma_for_each_area(int (*it)(struct cma *cma, void *data), void *data);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -81,7 +81,6 @@ static inline unsigned long compact_gap(unsigned int order)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_COMPACTION
|
||||
extern int sysctl_compact_memory;
|
||||
extern unsigned int sysctl_compaction_proactiveness;
|
||||
extern int sysctl_compaction_handler(struct ctl_table *table, int write,
|
||||
void *buffer, size_t *length, loff_t *ppos);
|
||||
|
|
|
|||
|
|
@ -75,7 +75,6 @@
|
|||
__diag_push(); \
|
||||
__diag_ignore(GCC, 8, "-Wattribute-alias", \
|
||||
"Type aliasing is used to sanitize syscall arguments");\
|
||||
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
|
||||
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) \
|
||||
__attribute__((alias(__stringify(__se_compat_sys##name)))); \
|
||||
ALLOW_ERROR_INJECTION(compat_sys##name, ERRNO); \
|
||||
|
|
@ -236,6 +235,8 @@ typedef struct compat_siginfo {
|
|||
char _dummy_pkey[__COMPAT_ADDR_BND_PKEY_PAD];
|
||||
u32 _pkey;
|
||||
} _addr_pkey;
|
||||
/* used when si_code=TRAP_PERF */
|
||||
compat_ulong_t _perf;
|
||||
};
|
||||
} _sigfault;
|
||||
|
||||
|
|
@ -465,6 +466,34 @@ put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
|
|||
unsafe_put_user(__s->sig[0], &__c->sig[0], label); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define unsafe_get_compat_sigset(set, compat, label) do { \
|
||||
const compat_sigset_t __user *__c = compat; \
|
||||
compat_sigset_word hi, lo; \
|
||||
sigset_t *__s = set; \
|
||||
\
|
||||
switch (_NSIG_WORDS) { \
|
||||
case 4: \
|
||||
unsafe_get_user(lo, &__c->sig[7], label); \
|
||||
unsafe_get_user(hi, &__c->sig[6], label); \
|
||||
__s->sig[3] = hi | (((long)lo) << 32); \
|
||||
fallthrough; \
|
||||
case 3: \
|
||||
unsafe_get_user(lo, &__c->sig[5], label); \
|
||||
unsafe_get_user(hi, &__c->sig[4], label); \
|
||||
__s->sig[2] = hi | (((long)lo) << 32); \
|
||||
fallthrough; \
|
||||
case 2: \
|
||||
unsafe_get_user(lo, &__c->sig[3], label); \
|
||||
unsafe_get_user(hi, &__c->sig[2], label); \
|
||||
__s->sig[1] = hi | (((long)lo) << 32); \
|
||||
fallthrough; \
|
||||
case 1: \
|
||||
unsafe_get_user(lo, &__c->sig[1], label); \
|
||||
unsafe_get_user(hi, &__c->sig[0], label); \
|
||||
__s->sig[0] = hi | (((long)lo) << 32); \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
#define unsafe_put_compat_sigset(compat, set, label) do { \
|
||||
compat_sigset_t __user *__c = compat; \
|
||||
|
|
@ -472,6 +501,13 @@ put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
|
|||
\
|
||||
unsafe_copy_to_user(__c, __s, sizeof(*__c), label); \
|
||||
} while (0)
|
||||
|
||||
#define unsafe_get_compat_sigset(set, compat, label) do { \
|
||||
const compat_sigset_t __user *__c = compat; \
|
||||
sigset_t *__s = set; \
|
||||
\
|
||||
unsafe_copy_from_user(__s, __c, sizeof(*__c), label); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
extern int compat_ptrace_request(struct task_struct *child,
|
||||
|
|
|
|||
|
|
@ -31,6 +31,12 @@
|
|||
#define __no_sanitize_thread
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP)
|
||||
#define __HAVE_BUILTIN_BSWAP32__
|
||||
#define __HAVE_BUILTIN_BSWAP64__
|
||||
#define __HAVE_BUILTIN_BSWAP16__
|
||||
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||
|
||||
#if __has_feature(undefined_behavior_sanitizer)
|
||||
/* GCC does not have __SANITIZE_UNDEFINED__ */
|
||||
#define __no_sanitize_undefined \
|
||||
|
|
@ -55,3 +61,6 @@
|
|||
#if __has_feature(shadow_call_stack)
|
||||
# define __noscs __attribute__((__no_sanitize__("shadow-call-stack")))
|
||||
#endif
|
||||
|
||||
#define __nocfi __attribute__((__no_sanitize__("cfi")))
|
||||
#define __cficanonical __attribute__((__cfi_canonical_jump_table__))
|
||||
|
|
|
|||
|
|
@ -90,15 +90,11 @@
|
|||
*/
|
||||
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||
|
||||
/*
|
||||
* sparse (__CHECKER__) pretends to be gcc, but can't do constant
|
||||
* folding in __builtin_bswap*() (yet), so don't set these for it.
|
||||
*/
|
||||
#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) && !defined(__CHECKER__)
|
||||
#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP)
|
||||
#define __HAVE_BUILTIN_BSWAP32__
|
||||
#define __HAVE_BUILTIN_BSWAP64__
|
||||
#define __HAVE_BUILTIN_BSWAP16__
|
||||
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP && !__CHECKER__ */
|
||||
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||
|
||||
#if GCC_VERSION >= 70000
|
||||
#define KASAN_ABI_VERSION 5
|
||||
|
|
|
|||
14
include/linux/compiler-version.h
Normal file
14
include/linux/compiler-version.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#ifdef __LINUX_COMPILER_VERSION_H
|
||||
#error "Please do not include <linux/compiler-version.h>. This is done by the build system."
|
||||
#endif
|
||||
#define __LINUX_COMPILER_VERSION_H
|
||||
|
||||
/*
|
||||
* This header exists to force full rebuild when the compiler is upgraded.
|
||||
*
|
||||
* When fixdep scans this, it will find this string "CONFIG_CC_VERSION_TEXT"
|
||||
* and add dependency on include/config/CC_VERSION_TEXT, which is touched
|
||||
* by Kconfig when the version string from the compiler changes.
|
||||
*/
|
||||
|
|
@ -242,6 +242,14 @@ struct ftrace_likely_data {
|
|||
# define __noscs
|
||||
#endif
|
||||
|
||||
#ifndef __nocfi
|
||||
# define __nocfi
|
||||
#endif
|
||||
|
||||
#ifndef __cficanonical
|
||||
# define __cficanonical
|
||||
#endif
|
||||
|
||||
#ifndef asm_volatile_goto
|
||||
#define asm_volatile_goto(x...) asm goto(x)
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/* -*- mode: c; c-basic-offset: 8; -*-
|
||||
* vim: noexpandtab sw=8 ts=8 sts=0:
|
||||
*
|
||||
/*
|
||||
* configfs.h - definitions for the device driver filesystem
|
||||
*
|
||||
* Based on sysfs:
|
||||
|
|
|
|||
|
|
@ -101,6 +101,7 @@ struct vc_data {
|
|||
unsigned int vc_rows;
|
||||
unsigned int vc_size_row; /* Bytes per row */
|
||||
unsigned int vc_scan_lines; /* # of scan lines */
|
||||
unsigned int vc_cell_height; /* CRTC character cell height */
|
||||
unsigned long vc_origin; /* [!] Start of real screen */
|
||||
unsigned long vc_scr_end; /* [!] End of real screen */
|
||||
unsigned long vc_visible_origin; /* [!] Top of visible window */
|
||||
|
|
|
|||
|
|
@ -71,6 +71,19 @@ static inline void exception_exit(enum ctx_state prev_ctx)
|
|||
}
|
||||
}
|
||||
|
||||
static __always_inline bool context_tracking_guest_enter(void)
|
||||
{
|
||||
if (context_tracking_enabled())
|
||||
__context_tracking_enter(CONTEXT_GUEST);
|
||||
|
||||
return context_tracking_enabled_this_cpu();
|
||||
}
|
||||
|
||||
static __always_inline void context_tracking_guest_exit(void)
|
||||
{
|
||||
if (context_tracking_enabled())
|
||||
__context_tracking_exit(CONTEXT_GUEST);
|
||||
}
|
||||
|
||||
/**
|
||||
* ct_state() - return the current context tracking state if known
|
||||
|
|
@ -92,6 +105,9 @@ static inline void user_exit_irqoff(void) { }
|
|||
static inline enum ctx_state exception_enter(void) { return 0; }
|
||||
static inline void exception_exit(enum ctx_state prev_ctx) { }
|
||||
static inline enum ctx_state ct_state(void) { return CONTEXT_DISABLED; }
|
||||
static inline bool context_tracking_guest_enter(void) { return false; }
|
||||
static inline void context_tracking_guest_exit(void) { }
|
||||
|
||||
#endif /* !CONFIG_CONTEXT_TRACKING */
|
||||
|
||||
#define CT_WARN_ON(cond) WARN_ON(context_tracking_enabled() && (cond))
|
||||
|
|
@ -102,80 +118,4 @@ extern void context_tracking_init(void);
|
|||
static inline void context_tracking_init(void) { }
|
||||
#endif /* CONFIG_CONTEXT_TRACKING_FORCE */
|
||||
|
||||
|
||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
|
||||
/* must be called with irqs disabled */
|
||||
static __always_inline void guest_enter_irqoff(void)
|
||||
{
|
||||
instrumentation_begin();
|
||||
if (vtime_accounting_enabled_this_cpu())
|
||||
vtime_guest_enter(current);
|
||||
else
|
||||
current->flags |= PF_VCPU;
|
||||
instrumentation_end();
|
||||
|
||||
if (context_tracking_enabled())
|
||||
__context_tracking_enter(CONTEXT_GUEST);
|
||||
|
||||
/* KVM does not hold any references to rcu protected data when it
|
||||
* switches CPU into a guest mode. In fact switching to a guest mode
|
||||
* is very similar to exiting to userspace from rcu point of view. In
|
||||
* addition CPU may stay in a guest mode for quite a long time (up to
|
||||
* one time slice). Lets treat guest mode as quiescent state, just like
|
||||
* we do with user-mode execution.
|
||||
*/
|
||||
if (!context_tracking_enabled_this_cpu()) {
|
||||
instrumentation_begin();
|
||||
rcu_virt_note_context_switch(smp_processor_id());
|
||||
instrumentation_end();
|
||||
}
|
||||
}
|
||||
|
||||
static __always_inline void guest_exit_irqoff(void)
|
||||
{
|
||||
if (context_tracking_enabled())
|
||||
__context_tracking_exit(CONTEXT_GUEST);
|
||||
|
||||
instrumentation_begin();
|
||||
if (vtime_accounting_enabled_this_cpu())
|
||||
vtime_guest_exit(current);
|
||||
else
|
||||
current->flags &= ~PF_VCPU;
|
||||
instrumentation_end();
|
||||
}
|
||||
|
||||
#else
|
||||
static __always_inline void guest_enter_irqoff(void)
|
||||
{
|
||||
/*
|
||||
* This is running in ioctl context so its safe
|
||||
* to assume that it's the stime pending cputime
|
||||
* to flush.
|
||||
*/
|
||||
instrumentation_begin();
|
||||
vtime_account_kernel(current);
|
||||
current->flags |= PF_VCPU;
|
||||
rcu_virt_note_context_switch(smp_processor_id());
|
||||
instrumentation_end();
|
||||
}
|
||||
|
||||
static __always_inline void guest_exit_irqoff(void)
|
||||
{
|
||||
instrumentation_begin();
|
||||
/* Flush the guest cputime we spent on the guest */
|
||||
vtime_account_kernel(current);
|
||||
current->flags &= ~PF_VCPU;
|
||||
instrumentation_end();
|
||||
}
|
||||
#endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */
|
||||
|
||||
static inline void guest_exit(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
guest_exit_irqoff();
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -7,34 +7,34 @@
|
|||
#include <linux/fs.h>
|
||||
#include <asm/siginfo.h>
|
||||
|
||||
#ifdef CONFIG_COREDUMP
|
||||
struct core_vma_metadata {
|
||||
unsigned long start, end;
|
||||
unsigned long flags;
|
||||
unsigned long dump_size;
|
||||
};
|
||||
|
||||
extern int core_uses_pid;
|
||||
extern char core_pattern[];
|
||||
extern unsigned int core_pipe_limit;
|
||||
|
||||
/*
|
||||
* These are the only things you should do on a core-file: use only these
|
||||
* functions to write out all the necessary info.
|
||||
*/
|
||||
struct coredump_params;
|
||||
extern int dump_skip(struct coredump_params *cprm, size_t nr);
|
||||
extern void dump_skip_to(struct coredump_params *cprm, unsigned long to);
|
||||
extern void dump_skip(struct coredump_params *cprm, size_t nr);
|
||||
extern int dump_emit(struct coredump_params *cprm, const void *addr, int nr);
|
||||
extern int dump_align(struct coredump_params *cprm, int align);
|
||||
extern void dump_truncate(struct coredump_params *cprm);
|
||||
int dump_user_range(struct coredump_params *cprm, unsigned long start,
|
||||
unsigned long len);
|
||||
int dump_vma_snapshot(struct coredump_params *cprm, int *vma_count,
|
||||
struct core_vma_metadata **vma_meta,
|
||||
size_t *vma_data_size_ptr);
|
||||
#ifdef CONFIG_COREDUMP
|
||||
extern void do_coredump(const kernel_siginfo_t *siginfo);
|
||||
#else
|
||||
static inline void do_coredump(const kernel_siginfo_t *siginfo) {}
|
||||
#endif
|
||||
|
||||
extern int core_uses_pid;
|
||||
extern char core_pattern[];
|
||||
extern unsigned int core_pipe_limit;
|
||||
|
||||
#endif /* _LINUX_COREDUMP_H */
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ enum coresight_dev_subtype_sink {
|
|||
CORESIGHT_DEV_SUBTYPE_SINK_PORT,
|
||||
CORESIGHT_DEV_SUBTYPE_SINK_BUFFER,
|
||||
CORESIGHT_DEV_SUBTYPE_SINK_SYSMEM,
|
||||
CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM,
|
||||
};
|
||||
|
||||
enum coresight_dev_subtype_link {
|
||||
|
|
@ -455,6 +456,18 @@ static inline void csdev_access_write64(struct csdev_access *csa, u64 val, u32 o
|
|||
}
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
static inline bool coresight_is_percpu_source(struct coresight_device *csdev)
|
||||
{
|
||||
return csdev && (csdev->type == CORESIGHT_DEV_TYPE_SOURCE) &&
|
||||
(csdev->subtype.source_subtype == CORESIGHT_DEV_SUBTYPE_SOURCE_PROC);
|
||||
}
|
||||
|
||||
static inline bool coresight_is_percpu_sink(struct coresight_device *csdev)
|
||||
{
|
||||
return csdev && (csdev->type == CORESIGHT_DEV_TYPE_SINK) &&
|
||||
(csdev->subtype.sink_subtype == CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM);
|
||||
}
|
||||
|
||||
extern struct coresight_device *
|
||||
coresight_register(struct coresight_desc *desc);
|
||||
extern void coresight_unregister(struct coresight_device *csdev);
|
||||
|
|
|
|||
|
|
@ -108,6 +108,8 @@ static inline void cpu_maps_update_done(void)
|
|||
{
|
||||
}
|
||||
|
||||
static inline int add_cpu(unsigned int cpu) { return 0;}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
extern struct bus_type cpu_subsys;
|
||||
|
||||
|
|
@ -137,6 +139,7 @@ static inline int cpus_read_trylock(void) { return true; }
|
|||
static inline void lockdep_assert_cpus_held(void) { }
|
||||
static inline void cpu_hotplug_disable(void) { }
|
||||
static inline void cpu_hotplug_enable(void) { }
|
||||
static inline int remove_cpu(unsigned int cpu) { return -EPERM; }
|
||||
static inline void smp_shutdown_nonboot_cpus(unsigned int primary_cpu) { }
|
||||
#endif /* !CONFIG_HOTPLUG_CPU */
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ enum cpuhp_state {
|
|||
CPUHP_PAGE_ALLOC_DEAD,
|
||||
CPUHP_NET_DEV_DEAD,
|
||||
CPUHP_PCI_XGENE_DEAD,
|
||||
CPUHP_IOMMU_INTEL_DEAD,
|
||||
CPUHP_IOMMU_IOVA_DEAD,
|
||||
CPUHP_LUSTRE_CFS_DEAD,
|
||||
CPUHP_AP_ARM_CACHE_B15_RAC_DEAD,
|
||||
CPUHP_PADATA_DEAD,
|
||||
|
|
@ -100,6 +100,7 @@ enum cpuhp_state {
|
|||
CPUHP_AP_CPU_PM_STARTING,
|
||||
CPUHP_AP_IRQ_GIC_STARTING,
|
||||
CPUHP_AP_IRQ_HIP04_STARTING,
|
||||
CPUHP_AP_IRQ_APPLE_AIC_STARTING,
|
||||
CPUHP_AP_IRQ_ARMADA_XP_STARTING,
|
||||
CPUHP_AP_IRQ_BCM2836_STARTING,
|
||||
CPUHP_AP_IRQ_MIPS_GIC_STARTING,
|
||||
|
|
@ -135,6 +136,7 @@ enum cpuhp_state {
|
|||
CPUHP_AP_RISCV_TIMER_STARTING,
|
||||
CPUHP_AP_CLINT_TIMER_STARTING,
|
||||
CPUHP_AP_CSKY_TIMER_STARTING,
|
||||
CPUHP_AP_TI_GP_TIMER_STARTING,
|
||||
CPUHP_AP_HYPERV_TIMER_STARTING,
|
||||
CPUHP_AP_KVM_STARTING,
|
||||
CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING,
|
||||
|
|
@ -167,6 +169,7 @@ enum cpuhp_state {
|
|||
CPUHP_AP_PERF_X86_RAPL_ONLINE,
|
||||
CPUHP_AP_PERF_X86_CQM_ONLINE,
|
||||
CPUHP_AP_PERF_X86_CSTATE_ONLINE,
|
||||
CPUHP_AP_PERF_X86_IDXD_ONLINE,
|
||||
CPUHP_AP_PERF_S390_CF_ONLINE,
|
||||
CPUHP_AP_PERF_S390_CFD_ONLINE,
|
||||
CPUHP_AP_PERF_S390_SF_ONLINE,
|
||||
|
|
@ -175,6 +178,8 @@ enum cpuhp_state {
|
|||
CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_L3_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_PA_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_L2X0_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE,
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@ struct cpuidle_state {
|
|||
char name[CPUIDLE_NAME_LEN];
|
||||
char desc[CPUIDLE_DESC_LEN];
|
||||
|
||||
u64 exit_latency_ns;
|
||||
u64 target_residency_ns;
|
||||
s64 exit_latency_ns;
|
||||
s64 target_residency_ns;
|
||||
unsigned int flags;
|
||||
unsigned int exit_latency; /* in US */
|
||||
int power_usage; /* in mW */
|
||||
|
|
|
|||
|
|
@ -91,44 +91,15 @@ extern struct cpumask __cpu_possible_mask;
|
|||
extern struct cpumask __cpu_online_mask;
|
||||
extern struct cpumask __cpu_present_mask;
|
||||
extern struct cpumask __cpu_active_mask;
|
||||
extern struct cpumask __cpu_dying_mask;
|
||||
#define cpu_possible_mask ((const struct cpumask *)&__cpu_possible_mask)
|
||||
#define cpu_online_mask ((const struct cpumask *)&__cpu_online_mask)
|
||||
#define cpu_present_mask ((const struct cpumask *)&__cpu_present_mask)
|
||||
#define cpu_active_mask ((const struct cpumask *)&__cpu_active_mask)
|
||||
#define cpu_dying_mask ((const struct cpumask *)&__cpu_dying_mask)
|
||||
|
||||
extern atomic_t __num_online_cpus;
|
||||
|
||||
#if NR_CPUS > 1
|
||||
/**
|
||||
* num_online_cpus() - Read the number of online CPUs
|
||||
*
|
||||
* Despite the fact that __num_online_cpus is of type atomic_t, this
|
||||
* interface gives only a momentary snapshot and is not protected against
|
||||
* concurrent CPU hotplug operations unless invoked from a cpuhp_lock held
|
||||
* region.
|
||||
*/
|
||||
static inline unsigned int num_online_cpus(void)
|
||||
{
|
||||
return atomic_read(&__num_online_cpus);
|
||||
}
|
||||
#define num_possible_cpus() cpumask_weight(cpu_possible_mask)
|
||||
#define num_present_cpus() cpumask_weight(cpu_present_mask)
|
||||
#define num_active_cpus() cpumask_weight(cpu_active_mask)
|
||||
#define cpu_online(cpu) cpumask_test_cpu((cpu), cpu_online_mask)
|
||||
#define cpu_possible(cpu) cpumask_test_cpu((cpu), cpu_possible_mask)
|
||||
#define cpu_present(cpu) cpumask_test_cpu((cpu), cpu_present_mask)
|
||||
#define cpu_active(cpu) cpumask_test_cpu((cpu), cpu_active_mask)
|
||||
#else
|
||||
#define num_online_cpus() 1U
|
||||
#define num_possible_cpus() 1U
|
||||
#define num_present_cpus() 1U
|
||||
#define num_active_cpus() 1U
|
||||
#define cpu_online(cpu) ((cpu) == 0)
|
||||
#define cpu_possible(cpu) ((cpu) == 0)
|
||||
#define cpu_present(cpu) ((cpu) == 0)
|
||||
#define cpu_active(cpu) ((cpu) == 0)
|
||||
#endif
|
||||
|
||||
extern cpumask_t cpus_booted_once_mask;
|
||||
|
||||
static inline void cpu_max_bits_warn(unsigned int cpu, unsigned int bits)
|
||||
|
|
@ -235,7 +206,7 @@ static inline unsigned int cpumask_last(const struct cpumask *srcp)
|
|||
return find_last_bit(cpumask_bits(srcp), nr_cpumask_bits);
|
||||
}
|
||||
|
||||
unsigned int cpumask_next(int n, const struct cpumask *srcp);
|
||||
unsigned int __pure cpumask_next(int n, const struct cpumask *srcp);
|
||||
|
||||
/**
|
||||
* cpumask_next_zero - get the next unset cpu in a cpumask
|
||||
|
|
@ -252,8 +223,8 @@ static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
|
|||
return find_next_zero_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
|
||||
}
|
||||
|
||||
int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *);
|
||||
int cpumask_any_but(const struct cpumask *mask, unsigned int cpu);
|
||||
int __pure cpumask_next_and(int n, const struct cpumask *, const struct cpumask *);
|
||||
int __pure cpumask_any_but(const struct cpumask *mask, unsigned int cpu);
|
||||
unsigned int cpumask_local_spread(unsigned int i, int node);
|
||||
int cpumask_any_and_distribute(const struct cpumask *src1p,
|
||||
const struct cpumask *src2p);
|
||||
|
|
@ -857,6 +828,14 @@ set_cpu_active(unsigned int cpu, bool active)
|
|||
cpumask_clear_cpu(cpu, &__cpu_active_mask);
|
||||
}
|
||||
|
||||
static inline void
|
||||
set_cpu_dying(unsigned int cpu, bool dying)
|
||||
{
|
||||
if (dying)
|
||||
cpumask_set_cpu(cpu, &__cpu_dying_mask);
|
||||
else
|
||||
cpumask_clear_cpu(cpu, &__cpu_dying_mask);
|
||||
}
|
||||
|
||||
/**
|
||||
* to_cpumask - convert an NR_CPUS bitmap to a struct cpumask *
|
||||
|
|
@ -894,6 +873,82 @@ static inline const struct cpumask *get_cpu_mask(unsigned int cpu)
|
|||
return to_cpumask(p);
|
||||
}
|
||||
|
||||
#if NR_CPUS > 1
|
||||
/**
|
||||
* num_online_cpus() - Read the number of online CPUs
|
||||
*
|
||||
* Despite the fact that __num_online_cpus is of type atomic_t, this
|
||||
* interface gives only a momentary snapshot and is not protected against
|
||||
* concurrent CPU hotplug operations unless invoked from a cpuhp_lock held
|
||||
* region.
|
||||
*/
|
||||
static inline unsigned int num_online_cpus(void)
|
||||
{
|
||||
return atomic_read(&__num_online_cpus);
|
||||
}
|
||||
#define num_possible_cpus() cpumask_weight(cpu_possible_mask)
|
||||
#define num_present_cpus() cpumask_weight(cpu_present_mask)
|
||||
#define num_active_cpus() cpumask_weight(cpu_active_mask)
|
||||
|
||||
static inline bool cpu_online(unsigned int cpu)
|
||||
{
|
||||
return cpumask_test_cpu(cpu, cpu_online_mask);
|
||||
}
|
||||
|
||||
static inline bool cpu_possible(unsigned int cpu)
|
||||
{
|
||||
return cpumask_test_cpu(cpu, cpu_possible_mask);
|
||||
}
|
||||
|
||||
static inline bool cpu_present(unsigned int cpu)
|
||||
{
|
||||
return cpumask_test_cpu(cpu, cpu_present_mask);
|
||||
}
|
||||
|
||||
static inline bool cpu_active(unsigned int cpu)
|
||||
{
|
||||
return cpumask_test_cpu(cpu, cpu_active_mask);
|
||||
}
|
||||
|
||||
static inline bool cpu_dying(unsigned int cpu)
|
||||
{
|
||||
return cpumask_test_cpu(cpu, cpu_dying_mask);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define num_online_cpus() 1U
|
||||
#define num_possible_cpus() 1U
|
||||
#define num_present_cpus() 1U
|
||||
#define num_active_cpus() 1U
|
||||
|
||||
static inline bool cpu_online(unsigned int cpu)
|
||||
{
|
||||
return cpu == 0;
|
||||
}
|
||||
|
||||
static inline bool cpu_possible(unsigned int cpu)
|
||||
{
|
||||
return cpu == 0;
|
||||
}
|
||||
|
||||
static inline bool cpu_present(unsigned int cpu)
|
||||
{
|
||||
return cpu == 0;
|
||||
}
|
||||
|
||||
static inline bool cpu_active(unsigned int cpu)
|
||||
{
|
||||
return cpu == 0;
|
||||
}
|
||||
|
||||
static inline bool cpu_dying(unsigned int cpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* NR_CPUS > 1 */
|
||||
|
||||
#define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
|
||||
|
||||
#if NR_CPUS <= BITS_PER_LONG
|
||||
|
|
|
|||
|
|
@ -96,6 +96,6 @@ void crc8_populate_msb(u8 table[CRC8_TABLE_SIZE], u8 polynomial);
|
|||
* Williams, Ross N., ross<at>ross.net
|
||||
* (see URL http://www.ross.net/crc/download/crc_v3.txt).
|
||||
*/
|
||||
u8 crc8(const u8 table[CRC8_TABLE_SIZE], u8 *pdata, size_t nbytes, u8 crc);
|
||||
u8 crc8(const u8 table[CRC8_TABLE_SIZE], const u8 *pdata, size_t nbytes, u8 crc);
|
||||
|
||||
#endif /* __CRC8_H_ */
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ do { \
|
|||
groups_free(group_info); \
|
||||
} while (0)
|
||||
|
||||
extern struct group_info init_groups;
|
||||
#ifdef CONFIG_MULTIUSER
|
||||
extern struct group_info *groups_alloc(int);
|
||||
extern void groups_free(struct group_info *);
|
||||
|
|
@ -140,7 +139,7 @@ struct cred {
|
|||
struct key *request_key_auth; /* assumed request_key authority */
|
||||
#endif
|
||||
#ifdef CONFIG_SECURITY
|
||||
void *security; /* subjective LSM security */
|
||||
void *security; /* LSM security */
|
||||
#endif
|
||||
struct user_struct *user; /* real user ID subscription */
|
||||
struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */
|
||||
|
|
|
|||
|
|
@ -1,364 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* $Revision: 3.0 $$Date: 1998/11/02 14:20:59 $
|
||||
* linux/include/linux/cyclades.h
|
||||
*
|
||||
* This file was initially written by
|
||||
* Randolph Bentson <bentson@grieg.seaslug.org> and is maintained by
|
||||
* Ivan Passos <ivan@cyclades.com>.
|
||||
*
|
||||
* This file contains the general definitions for the cyclades.c driver
|
||||
*$Log: cyclades.h,v $
|
||||
*Revision 3.1 2002/01/29 11:36:16 henrique
|
||||
*added throttle field on struct cyclades_port to indicate whether the
|
||||
*port is throttled or not
|
||||
*
|
||||
*Revision 3.1 2000/04/19 18:52:52 ivan
|
||||
*converted address fields to unsigned long and added fields for physical
|
||||
*addresses on cyclades_card structure;
|
||||
*
|
||||
*Revision 3.0 1998/11/02 14:20:59 ivan
|
||||
*added nports field on cyclades_card structure;
|
||||
*
|
||||
*Revision 2.5 1998/08/03 16:57:01 ivan
|
||||
*added cyclades_idle_stats structure;
|
||||
*
|
||||
*Revision 2.4 1998/06/01 12:09:53 ivan
|
||||
*removed closing_wait2 from cyclades_port structure;
|
||||
*
|
||||
*Revision 2.3 1998/03/16 18:01:12 ivan
|
||||
*changes in the cyclades_port structure to get it closer to the
|
||||
*standard serial port structure;
|
||||
*added constants for new ioctls;
|
||||
*
|
||||
*Revision 2.2 1998/02/17 16:50:00 ivan
|
||||
*changes in the cyclades_port structure (addition of shutdown_wait and
|
||||
*chip_rev variables);
|
||||
*added constants for new ioctls and for CD1400 rev. numbers.
|
||||
*
|
||||
*Revision 2.1 1997/10/24 16:03:00 ivan
|
||||
*added rflow (which allows enabling the CD1400 special flow control
|
||||
*feature) and rtsdtr_inv (which allows DTR/RTS pin inversion) to
|
||||
*cyclades_port structure;
|
||||
*added Alpha support
|
||||
*
|
||||
*Revision 2.0 1997/06/30 10:30:00 ivan
|
||||
*added some new doorbell command constants related to IOCTLW and
|
||||
*UART error signaling
|
||||
*
|
||||
*Revision 1.8 1997/06/03 15:30:00 ivan
|
||||
*added constant ZFIRM_HLT
|
||||
*added constant CyPCI_Ze_win ( = 2 * Cy_PCI_Zwin)
|
||||
*
|
||||
*Revision 1.7 1997/03/26 10:30:00 daniel
|
||||
*new entries at the end of cyclades_port struct to reallocate
|
||||
*variables illegally allocated within card memory.
|
||||
*
|
||||
*Revision 1.6 1996/09/09 18:35:30 bentson
|
||||
*fold in changes for Cyclom-Z -- including structures for
|
||||
*communicating with board as well modest changes to original
|
||||
*structures to support new features.
|
||||
*
|
||||
*Revision 1.5 1995/11/13 21:13:31 bentson
|
||||
*changes suggested by Michael Chastain <mec@duracef.shout.net>
|
||||
*to support use of this file in non-kernel applications
|
||||
*
|
||||
*
|
||||
*/
|
||||
#ifndef _LINUX_CYCLADES_H
|
||||
#define _LINUX_CYCLADES_H
|
||||
|
||||
#include <uapi/linux/cyclades.h>
|
||||
|
||||
|
||||
/* Per card data structure */
|
||||
struct cyclades_card {
|
||||
void __iomem *base_addr;
|
||||
union {
|
||||
void __iomem *p9050;
|
||||
struct RUNTIME_9060 __iomem *p9060;
|
||||
} ctl_addr;
|
||||
struct BOARD_CTRL __iomem *board_ctrl; /* cyz specific */
|
||||
int irq;
|
||||
unsigned int num_chips; /* 0 if card absent, -1 if Z/PCI, else Y */
|
||||
unsigned int first_line; /* minor number of first channel on card */
|
||||
unsigned int nports; /* Number of ports in the card */
|
||||
int bus_index; /* address shift - 0 for ISA, 1 for PCI */
|
||||
int intr_enabled; /* FW Interrupt flag - 0 disabled, 1 enabled */
|
||||
u32 hw_ver;
|
||||
spinlock_t card_lock;
|
||||
struct cyclades_port *ports;
|
||||
};
|
||||
|
||||
/***************************************
|
||||
* Memory access functions/macros *
|
||||
* (required to support Alpha systems) *
|
||||
***************************************/
|
||||
|
||||
#define cy_writeb(port,val) do { writeb((val), (port)); mb(); } while (0)
|
||||
#define cy_writew(port,val) do { writew((val), (port)); mb(); } while (0)
|
||||
#define cy_writel(port,val) do { writel((val), (port)); mb(); } while (0)
|
||||
|
||||
/*
|
||||
* Statistics counters
|
||||
*/
|
||||
struct cyclades_icount {
|
||||
__u32 cts, dsr, rng, dcd, tx, rx;
|
||||
__u32 frame, parity, overrun, brk;
|
||||
__u32 buf_overrun;
|
||||
};
|
||||
|
||||
/*
|
||||
* This is our internal structure for each serial port's state.
|
||||
*
|
||||
* Many fields are paralleled by the structure used by the serial_struct
|
||||
* structure.
|
||||
*
|
||||
* For definitions of the flags field, see tty.h
|
||||
*/
|
||||
|
||||
struct cyclades_port {
|
||||
int magic;
|
||||
struct tty_port port;
|
||||
struct cyclades_card *card;
|
||||
union {
|
||||
struct {
|
||||
void __iomem *base_addr;
|
||||
} cyy;
|
||||
struct {
|
||||
struct CH_CTRL __iomem *ch_ctrl;
|
||||
struct BUF_CTRL __iomem *buf_ctrl;
|
||||
} cyz;
|
||||
} u;
|
||||
int line;
|
||||
int flags; /* defined in tty.h */
|
||||
int type; /* UART type */
|
||||
int read_status_mask;
|
||||
int ignore_status_mask;
|
||||
int timeout;
|
||||
int xmit_fifo_size;
|
||||
int cor1,cor2,cor3,cor4,cor5;
|
||||
int tbpr,tco,rbpr,rco;
|
||||
int baud;
|
||||
int rflow;
|
||||
int rtsdtr_inv;
|
||||
int chip_rev;
|
||||
int custom_divisor;
|
||||
u8 x_char; /* to be pushed out ASAP */
|
||||
int breakon;
|
||||
int breakoff;
|
||||
int xmit_head;
|
||||
int xmit_tail;
|
||||
int xmit_cnt;
|
||||
int default_threshold;
|
||||
int default_timeout;
|
||||
unsigned long rflush_count;
|
||||
struct cyclades_monitor mon;
|
||||
struct cyclades_idle_stats idle_stats;
|
||||
struct cyclades_icount icount;
|
||||
struct completion shutdown_wait;
|
||||
int throttle;
|
||||
#ifdef CONFIG_CYZ_INTR
|
||||
struct timer_list rx_full_timer;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define CLOSING_WAIT_DELAY 30*HZ
|
||||
#define CY_CLOSING_WAIT_NONE ASYNC_CLOSING_WAIT_NONE
|
||||
#define CY_CLOSING_WAIT_INF ASYNC_CLOSING_WAIT_INF
|
||||
|
||||
|
||||
#define CyMAX_CHIPS_PER_CARD 8
|
||||
#define CyMAX_CHAR_FIFO 12
|
||||
#define CyPORTS_PER_CHIP 4
|
||||
#define CD1400_MAX_SPEED 115200
|
||||
|
||||
#define CyISA_Ywin 0x2000
|
||||
|
||||
#define CyPCI_Ywin 0x4000
|
||||
#define CyPCI_Yctl 0x80
|
||||
#define CyPCI_Zctl CTRL_WINDOW_SIZE
|
||||
#define CyPCI_Zwin 0x80000
|
||||
#define CyPCI_Ze_win (2 * CyPCI_Zwin)
|
||||
|
||||
#define PCI_DEVICE_ID_MASK 0x06
|
||||
|
||||
/**** CD1400 registers ****/
|
||||
|
||||
#define CD1400_REV_G 0x46
|
||||
#define CD1400_REV_J 0x48
|
||||
|
||||
#define CyRegSize 0x0400
|
||||
#define Cy_HwReset 0x1400
|
||||
#define Cy_ClrIntr 0x1800
|
||||
#define Cy_EpldRev 0x1e00
|
||||
|
||||
/* Global Registers */
|
||||
|
||||
#define CyGFRCR (0x40*2)
|
||||
#define CyRevE (44)
|
||||
#define CyCAR (0x68*2)
|
||||
#define CyCHAN_0 (0x00)
|
||||
#define CyCHAN_1 (0x01)
|
||||
#define CyCHAN_2 (0x02)
|
||||
#define CyCHAN_3 (0x03)
|
||||
#define CyGCR (0x4B*2)
|
||||
#define CyCH0_SERIAL (0x00)
|
||||
#define CyCH0_PARALLEL (0x80)
|
||||
#define CySVRR (0x67*2)
|
||||
#define CySRModem (0x04)
|
||||
#define CySRTransmit (0x02)
|
||||
#define CySRReceive (0x01)
|
||||
#define CyRICR (0x44*2)
|
||||
#define CyTICR (0x45*2)
|
||||
#define CyMICR (0x46*2)
|
||||
#define CyICR0 (0x00)
|
||||
#define CyICR1 (0x01)
|
||||
#define CyICR2 (0x02)
|
||||
#define CyICR3 (0x03)
|
||||
#define CyRIR (0x6B*2)
|
||||
#define CyTIR (0x6A*2)
|
||||
#define CyMIR (0x69*2)
|
||||
#define CyIRDirEq (0x80)
|
||||
#define CyIRBusy (0x40)
|
||||
#define CyIRUnfair (0x20)
|
||||
#define CyIRContext (0x1C)
|
||||
#define CyIRChannel (0x03)
|
||||
#define CyPPR (0x7E*2)
|
||||
#define CyCLOCK_20_1MS (0x27)
|
||||
#define CyCLOCK_25_1MS (0x31)
|
||||
#define CyCLOCK_25_5MS (0xf4)
|
||||
#define CyCLOCK_60_1MS (0x75)
|
||||
#define CyCLOCK_60_2MS (0xea)
|
||||
|
||||
/* Virtual Registers */
|
||||
|
||||
#define CyRIVR (0x43*2)
|
||||
#define CyTIVR (0x42*2)
|
||||
#define CyMIVR (0x41*2)
|
||||
#define CyIVRMask (0x07)
|
||||
#define CyIVRRxEx (0x07)
|
||||
#define CyIVRRxOK (0x03)
|
||||
#define CyIVRTxOK (0x02)
|
||||
#define CyIVRMdmOK (0x01)
|
||||
#define CyTDR (0x63*2)
|
||||
#define CyRDSR (0x62*2)
|
||||
#define CyTIMEOUT (0x80)
|
||||
#define CySPECHAR (0x70)
|
||||
#define CyBREAK (0x08)
|
||||
#define CyPARITY (0x04)
|
||||
#define CyFRAME (0x02)
|
||||
#define CyOVERRUN (0x01)
|
||||
#define CyMISR (0x4C*2)
|
||||
/* see CyMCOR_ and CyMSVR_ for bits*/
|
||||
#define CyEOSRR (0x60*2)
|
||||
|
||||
/* Channel Registers */
|
||||
|
||||
#define CyLIVR (0x18*2)
|
||||
#define CyMscsr (0x01)
|
||||
#define CyTdsr (0x02)
|
||||
#define CyRgdsr (0x03)
|
||||
#define CyRedsr (0x07)
|
||||
#define CyCCR (0x05*2)
|
||||
/* Format 1 */
|
||||
#define CyCHAN_RESET (0x80)
|
||||
#define CyCHIP_RESET (0x81)
|
||||
#define CyFlushTransFIFO (0x82)
|
||||
/* Format 2 */
|
||||
#define CyCOR_CHANGE (0x40)
|
||||
#define CyCOR1ch (0x02)
|
||||
#define CyCOR2ch (0x04)
|
||||
#define CyCOR3ch (0x08)
|
||||
/* Format 3 */
|
||||
#define CySEND_SPEC_1 (0x21)
|
||||
#define CySEND_SPEC_2 (0x22)
|
||||
#define CySEND_SPEC_3 (0x23)
|
||||
#define CySEND_SPEC_4 (0x24)
|
||||
/* Format 4 */
|
||||
#define CyCHAN_CTL (0x10)
|
||||
#define CyDIS_RCVR (0x01)
|
||||
#define CyENB_RCVR (0x02)
|
||||
#define CyDIS_XMTR (0x04)
|
||||
#define CyENB_XMTR (0x08)
|
||||
#define CySRER (0x06*2)
|
||||
#define CyMdmCh (0x80)
|
||||
#define CyRxData (0x10)
|
||||
#define CyTxRdy (0x04)
|
||||
#define CyTxMpty (0x02)
|
||||
#define CyNNDT (0x01)
|
||||
#define CyCOR1 (0x08*2)
|
||||
#define CyPARITY_NONE (0x00)
|
||||
#define CyPARITY_0 (0x20)
|
||||
#define CyPARITY_1 (0xA0)
|
||||
#define CyPARITY_E (0x40)
|
||||
#define CyPARITY_O (0xC0)
|
||||
#define Cy_1_STOP (0x00)
|
||||
#define Cy_1_5_STOP (0x04)
|
||||
#define Cy_2_STOP (0x08)
|
||||
#define Cy_5_BITS (0x00)
|
||||
#define Cy_6_BITS (0x01)
|
||||
#define Cy_7_BITS (0x02)
|
||||
#define Cy_8_BITS (0x03)
|
||||
#define CyCOR2 (0x09*2)
|
||||
#define CyIXM (0x80)
|
||||
#define CyTxIBE (0x40)
|
||||
#define CyETC (0x20)
|
||||
#define CyAUTO_TXFL (0x60)
|
||||
#define CyLLM (0x10)
|
||||
#define CyRLM (0x08)
|
||||
#define CyRtsAO (0x04)
|
||||
#define CyCtsAE (0x02)
|
||||
#define CyDsrAE (0x01)
|
||||
#define CyCOR3 (0x0A*2)
|
||||
#define CySPL_CH_DRANGE (0x80) /* special character detect range */
|
||||
#define CySPL_CH_DET1 (0x40) /* enable special character detection
|
||||
on SCHR4-SCHR3 */
|
||||
#define CyFL_CTRL_TRNSP (0x20) /* Flow Control Transparency */
|
||||
#define CySPL_CH_DET2 (0x10) /* Enable special character detection
|
||||
on SCHR2-SCHR1 */
|
||||
#define CyREC_FIFO (0x0F) /* Receive FIFO threshold */
|
||||
#define CyCOR4 (0x1E*2)
|
||||
#define CyCOR5 (0x1F*2)
|
||||
#define CyCCSR (0x0B*2)
|
||||
#define CyRxEN (0x80)
|
||||
#define CyRxFloff (0x40)
|
||||
#define CyRxFlon (0x20)
|
||||
#define CyTxEN (0x08)
|
||||
#define CyTxFloff (0x04)
|
||||
#define CyTxFlon (0x02)
|
||||
#define CyRDCR (0x0E*2)
|
||||
#define CySCHR1 (0x1A*2)
|
||||
#define CySCHR2 (0x1B*2)
|
||||
#define CySCHR3 (0x1C*2)
|
||||
#define CySCHR4 (0x1D*2)
|
||||
#define CySCRL (0x22*2)
|
||||
#define CySCRH (0x23*2)
|
||||
#define CyLNC (0x24*2)
|
||||
#define CyMCOR1 (0x15*2)
|
||||
#define CyMCOR2 (0x16*2)
|
||||
#define CyRTPR (0x21*2)
|
||||
#define CyMSVR1 (0x6C*2)
|
||||
#define CyMSVR2 (0x6D*2)
|
||||
#define CyANY_DELTA (0xF0)
|
||||
#define CyDSR (0x80)
|
||||
#define CyCTS (0x40)
|
||||
#define CyRI (0x20)
|
||||
#define CyDCD (0x10)
|
||||
#define CyDTR (0x02)
|
||||
#define CyRTS (0x01)
|
||||
#define CyPVSR (0x6F*2)
|
||||
#define CyRBPR (0x78*2)
|
||||
#define CyRCOR (0x7C*2)
|
||||
#define CyTBPR (0x72*2)
|
||||
#define CyTCOR (0x76*2)
|
||||
|
||||
/* Custom Registers */
|
||||
|
||||
#define CyPLX_VER (0x3400)
|
||||
#define PLX_9050 0x0b
|
||||
#define PLX_9060 0x0c
|
||||
#define PLX_9080 0x0d
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#endif /* _LINUX_CYCLADES_H */
|
||||
|
|
@ -59,6 +59,7 @@ struct qstr {
|
|||
|
||||
extern const struct qstr empty_name;
|
||||
extern const struct qstr slash_name;
|
||||
extern const struct qstr dotdot_name;
|
||||
|
||||
struct dentry_stat_t {
|
||||
long nr_dentry;
|
||||
|
|
@ -300,8 +301,8 @@ char *dynamic_dname(struct dentry *, char *, int, const char *, ...);
|
|||
extern char *__d_path(const struct path *, const struct path *, char *, int);
|
||||
extern char *d_absolute_path(const struct path *, char *, int);
|
||||
extern char *d_path(const struct path *, char *, int);
|
||||
extern char *dentry_path_raw(struct dentry *, char *, int);
|
||||
extern char *dentry_path(struct dentry *, char *, int);
|
||||
extern char *dentry_path_raw(const struct dentry *, char *, int);
|
||||
extern char *dentry_path(const struct dentry *, char *, int);
|
||||
|
||||
/* Allocation counts.. */
|
||||
|
||||
|
|
|
|||
|
|
@ -128,6 +128,8 @@ void debugfs_create_atomic_t(const char *name, umode_t mode,
|
|||
struct dentry *parent, atomic_t *value);
|
||||
struct dentry *debugfs_create_bool(const char *name, umode_t mode,
|
||||
struct dentry *parent, bool *value);
|
||||
void debugfs_create_str(const char *name, umode_t mode,
|
||||
struct dentry *parent, char **value);
|
||||
|
||||
struct dentry *debugfs_create_blob(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
|
|
@ -156,6 +158,9 @@ ssize_t debugfs_read_file_bool(struct file *file, char __user *user_buf,
|
|||
ssize_t debugfs_write_file_bool(struct file *file, const char __user *user_buf,
|
||||
size_t count, loff_t *ppos);
|
||||
|
||||
ssize_t debugfs_read_file_str(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos);
|
||||
|
||||
#else
|
||||
|
||||
#include <linux/err.h>
|
||||
|
|
@ -297,6 +302,11 @@ static inline struct dentry *debugfs_create_bool(const char *name, umode_t mode,
|
|||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline void debugfs_create_str(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
char **value)
|
||||
{ }
|
||||
|
||||
static inline struct dentry *debugfs_create_blob(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
struct debugfs_blob_wrapper *blob)
|
||||
|
|
@ -348,6 +358,13 @@ static inline ssize_t debugfs_write_file_bool(struct file *file,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline ssize_t debugfs_read_file_str(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -82,16 +82,16 @@ static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void delayacct_set_flag(int flag)
|
||||
static inline void delayacct_set_flag(struct task_struct *p, int flag)
|
||||
{
|
||||
if (current->delays)
|
||||
current->delays->flags |= flag;
|
||||
if (p->delays)
|
||||
p->delays->flags |= flag;
|
||||
}
|
||||
|
||||
static inline void delayacct_clear_flag(int flag)
|
||||
static inline void delayacct_clear_flag(struct task_struct *p, int flag)
|
||||
{
|
||||
if (current->delays)
|
||||
current->delays->flags &= ~flag;
|
||||
if (p->delays)
|
||||
p->delays->flags &= ~flag;
|
||||
}
|
||||
|
||||
static inline void delayacct_tsk_init(struct task_struct *tsk)
|
||||
|
|
@ -114,7 +114,7 @@ static inline void delayacct_tsk_free(struct task_struct *tsk)
|
|||
|
||||
static inline void delayacct_blkio_start(void)
|
||||
{
|
||||
delayacct_set_flag(DELAYACCT_PF_BLKIO);
|
||||
delayacct_set_flag(current, DELAYACCT_PF_BLKIO);
|
||||
if (current->delays)
|
||||
__delayacct_blkio_start();
|
||||
}
|
||||
|
|
@ -123,7 +123,7 @@ static inline void delayacct_blkio_end(struct task_struct *p)
|
|||
{
|
||||
if (p->delays)
|
||||
__delayacct_blkio_end(p);
|
||||
delayacct_clear_flag(DELAYACCT_PF_BLKIO);
|
||||
delayacct_clear_flag(p, DELAYACCT_PF_BLKIO);
|
||||
}
|
||||
|
||||
static inline int delayacct_add_tsk(struct taskstats *d,
|
||||
|
|
@ -166,9 +166,9 @@ static inline void delayacct_thrashing_end(void)
|
|||
}
|
||||
|
||||
#else
|
||||
static inline void delayacct_set_flag(int flag)
|
||||
static inline void delayacct_set_flag(struct task_struct *p, int flag)
|
||||
{}
|
||||
static inline void delayacct_clear_flag(int flag)
|
||||
static inline void delayacct_clear_flag(struct task_struct *p, int flag)
|
||||
{}
|
||||
static inline void delayacct_init(void)
|
||||
{}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ enum devfreq_timer {
|
|||
|
||||
struct devfreq;
|
||||
struct devfreq_governor;
|
||||
struct thermal_cooling_device;
|
||||
|
||||
/**
|
||||
* struct devfreq_dev_status - Data given from devfreq user device to
|
||||
|
|
@ -98,11 +99,15 @@ struct devfreq_dev_status {
|
|||
* @freq_table: Optional list of frequencies to support statistics
|
||||
* and freq_table must be generated in ascending order.
|
||||
* @max_state: The size of freq_table.
|
||||
*
|
||||
* @is_cooling_device: A self-explanatory boolean giving the device a
|
||||
* cooling effect property.
|
||||
*/
|
||||
struct devfreq_dev_profile {
|
||||
unsigned long initial_freq;
|
||||
unsigned int polling_ms;
|
||||
enum devfreq_timer timer;
|
||||
bool is_cooling_device;
|
||||
|
||||
int (*target)(struct device *dev, unsigned long *freq, u32 flags);
|
||||
int (*get_dev_status)(struct device *dev,
|
||||
|
|
@ -156,6 +161,7 @@ struct devfreq_stats {
|
|||
* @suspend_count: suspend requests counter for a device.
|
||||
* @stats: Statistics of devfreq device behavior
|
||||
* @transition_notifier_list: list head of DEVFREQ_TRANSITION_NOTIFIER notifier
|
||||
* @cdev: Cooling device pointer if the devfreq has cooling property
|
||||
* @nb_min: Notifier block for DEV_PM_QOS_MIN_FREQUENCY
|
||||
* @nb_max: Notifier block for DEV_PM_QOS_MAX_FREQUENCY
|
||||
*
|
||||
|
|
@ -198,6 +204,9 @@ struct devfreq {
|
|||
|
||||
struct srcu_notifier_head transition_notifier_list;
|
||||
|
||||
/* Pointer to the cooling device if used for thermal mitigation */
|
||||
struct thermal_cooling_device *cdev;
|
||||
|
||||
struct notifier_block nb_min;
|
||||
struct notifier_block nb_max;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -253,7 +253,11 @@ struct target_type {
|
|||
#define dm_target_passes_integrity(type) ((type)->features & DM_TARGET_PASSES_INTEGRITY)
|
||||
|
||||
/*
|
||||
* Indicates that a target supports host-managed zoned block devices.
|
||||
* Indicates support for zoned block devices:
|
||||
* - DM_TARGET_ZONED_HM: the target also supports host-managed zoned
|
||||
* block devices but does not support combining different zoned models.
|
||||
* - DM_TARGET_MIXED_ZONED_MODEL: the target supports combining multiple
|
||||
* devices with different zoned models.
|
||||
*/
|
||||
#ifdef CONFIG_BLK_DEV_ZONED
|
||||
#define DM_TARGET_ZONED_HM 0x00000040
|
||||
|
|
@ -275,6 +279,15 @@ struct target_type {
|
|||
#define DM_TARGET_PASSES_CRYPTO 0x00000100
|
||||
#define dm_target_passes_crypto(type) ((type)->features & DM_TARGET_PASSES_CRYPTO)
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_ZONED
|
||||
#define DM_TARGET_MIXED_ZONED_MODEL 0x00000200
|
||||
#define dm_target_supports_mixed_zoned_model(type) \
|
||||
((type)->features & DM_TARGET_MIXED_ZONED_MODEL)
|
||||
#else
|
||||
#define DM_TARGET_MIXED_ZONED_MODEL 0x00000000
|
||||
#define dm_target_supports_mixed_zoned_model(type) (false)
|
||||
#endif
|
||||
|
||||
struct dm_target {
|
||||
struct dm_table *table;
|
||||
struct target_type *type;
|
||||
|
|
@ -561,11 +574,6 @@ struct dm_table *dm_swap_table(struct mapped_device *md,
|
|||
*/
|
||||
void dm_destroy_keyslot_manager(struct blk_keyslot_manager *ksm);
|
||||
|
||||
/*
|
||||
* A wrapper around vmalloc.
|
||||
*/
|
||||
void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);
|
||||
|
||||
/*-----------------------------------------------------------------
|
||||
* Macros.
|
||||
*---------------------------------------------------------------*/
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ struct dev_iommu;
|
|||
/**
|
||||
* struct subsys_interface - interfaces to device functions
|
||||
* @name: name of the device function
|
||||
* @subsys: subsytem of the devices to attach to
|
||||
* @subsys: subsystem of the devices to attach to
|
||||
* @node: the list of functions registered at the subsystem
|
||||
* @add_dev: device hookup to device function handler
|
||||
* @remove_dev: device hookup to device function handler
|
||||
|
|
@ -439,6 +439,9 @@ struct dev_links_info {
|
|||
* @state_synced: The hardware state of this device has been synced to match
|
||||
* the software state of this device by calling the driver/bus
|
||||
* sync_state() callback.
|
||||
* @can_match: The device has matched with a driver at least once or it is in
|
||||
* a bus (like AMBA) which can't check for matching drivers until
|
||||
* other devices probe successfully.
|
||||
* @dma_coherent: this particular device is dma coherent, even if the
|
||||
* architecture supports non-coherent devices.
|
||||
* @dma_ops_bypass: If set to %true then the dma_ops are bypassed for the
|
||||
|
|
@ -545,6 +548,7 @@ struct device {
|
|||
bool offline:1;
|
||||
bool of_node_reused:1;
|
||||
bool state_synced:1;
|
||||
bool can_match:1;
|
||||
#if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \
|
||||
defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU) || \
|
||||
defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
|
||||
|
|
|
|||
54
include/linux/devm-helpers.h
Normal file
54
include/linux/devm-helpers.h
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef __LINUX_DEVM_HELPERS_H
|
||||
#define __LINUX_DEVM_HELPERS_H
|
||||
|
||||
/*
|
||||
* Functions which do automatically cancel operations or release resources upon
|
||||
* driver detach.
|
||||
*
|
||||
* These should be helpful to avoid mixing the manual and devm-based resource
|
||||
* management which can be source of annoying, rarely occurring,
|
||||
* hard-to-reproduce bugs.
|
||||
*
|
||||
* Please take into account that devm based cancellation may be performed some
|
||||
* time after the remove() is ran.
|
||||
*
|
||||
* Thus mixing devm and manual resource management can easily cause problems
|
||||
* when unwinding operations with dependencies. IRQ scheduling a work in a queue
|
||||
* is typical example where IRQs are often devm-managed and WQs are manually
|
||||
* cleaned at remove(). If IRQs are not manually freed at remove() (and this is
|
||||
* often the case when we use devm for IRQs) we have a period of time after
|
||||
* remove() - and before devm managed IRQs are freed - where new IRQ may fire
|
||||
* and schedule a work item which won't be cancelled because remove() was
|
||||
* already ran.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
static inline void devm_delayed_work_drop(void *res)
|
||||
{
|
||||
cancel_delayed_work_sync(res);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_delayed_work_autocancel - Resource-managed delayed work allocation
|
||||
* @dev: Device which lifetime work is bound to
|
||||
* @w: Work item to be queued
|
||||
* @worker: Worker function
|
||||
*
|
||||
* Initialize delayed work which is automatically cancelled when driver is
|
||||
* detached. A few drivers need delayed work which must be cancelled before
|
||||
* driver is detached to avoid accessing removed resources.
|
||||
* devm_delayed_work_autocancel() can be used to omit the explicit
|
||||
* cancelleation when driver is detached.
|
||||
*/
|
||||
static inline int devm_delayed_work_autocancel(struct device *dev,
|
||||
struct delayed_work *w,
|
||||
work_func_t worker)
|
||||
{
|
||||
INIT_DELAYED_WORK(w, worker);
|
||||
return devm_add_action(dev, devm_delayed_work_drop, w);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -587,6 +587,7 @@ static inline signed long dma_fence_wait(struct dma_fence *fence, bool intr)
|
|||
}
|
||||
|
||||
struct dma_fence *dma_fence_get_stub(void);
|
||||
struct dma_fence *dma_fence_allocate_private_stub(void);
|
||||
u64 dma_fence_context_alloc(unsigned num);
|
||||
|
||||
#define DMA_FENCE_TRACE(f, fmt, args...) \
|
||||
|
|
|
|||
|
|
@ -50,6 +50,15 @@ struct dma_heap_export_info {
|
|||
*/
|
||||
void *dma_heap_get_drvdata(struct dma_heap *heap);
|
||||
|
||||
/**
|
||||
* dma_heap_get_name() - get heap name
|
||||
* @heap: DMA-Heap to retrieve private data for
|
||||
*
|
||||
* Returns:
|
||||
* The char* for the heap name.
|
||||
*/
|
||||
const char *dma_heap_get_name(struct dma_heap *heap);
|
||||
|
||||
/**
|
||||
* dma_heap_add - adds a heap to dmabuf heaps
|
||||
* @exp_info: information needed to register this heap
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@ void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list);
|
|||
void iommu_dma_free_cpu_cached_iovas(unsigned int cpu,
|
||||
struct iommu_domain *domain);
|
||||
|
||||
extern bool iommu_dma_forcedac;
|
||||
|
||||
#else /* CONFIG_IOMMU_DMA */
|
||||
|
||||
struct iommu_domain;
|
||||
|
|
@ -81,10 +83,5 @@ static inline void iommu_dma_get_resv_regions(struct device *dev, struct list_he
|
|||
{
|
||||
}
|
||||
|
||||
static inline void iommu_dma_free_cpu_cached_iovas(unsigned int cpu,
|
||||
struct iommu_domain *domain)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_IOMMU_DMA */
|
||||
#endif /* __DMA_IOMMU_H */
|
||||
|
|
|
|||
|
|
@ -22,6 +22,11 @@ struct dma_map_ops {
|
|||
gfp_t gfp);
|
||||
void (*free_pages)(struct device *dev, size_t size, struct page *vaddr,
|
||||
dma_addr_t dma_handle, enum dma_data_direction dir);
|
||||
struct sg_table *(*alloc_noncontiguous)(struct device *dev, size_t size,
|
||||
enum dma_data_direction dir, gfp_t gfp,
|
||||
unsigned long attrs);
|
||||
void (*free_noncontiguous)(struct device *dev, size_t size,
|
||||
struct sg_table *sgt, enum dma_data_direction dir);
|
||||
int (*mmap)(struct device *, struct vm_area_struct *,
|
||||
void *, dma_addr_t, size_t, unsigned long attrs);
|
||||
|
||||
|
|
@ -198,6 +203,20 @@ static inline int dma_mmap_from_global_coherent(struct vm_area_struct *vma,
|
|||
}
|
||||
#endif /* CONFIG_DMA_DECLARE_COHERENT */
|
||||
|
||||
/*
|
||||
* This is the actual return value from the ->alloc_noncontiguous method.
|
||||
* The users of the DMA API should only care about the sg_table, but to make
|
||||
* the DMA-API internal vmaping and freeing easier we stash away the page
|
||||
* array as well (except for the fallback case). This can go away any time,
|
||||
* e.g. when a vmap-variant that takes a scatterlist comes along.
|
||||
*/
|
||||
struct dma_sgt_handle {
|
||||
struct sg_table sgt;
|
||||
struct page **pages;
|
||||
};
|
||||
#define sgt_handle(sgt) \
|
||||
container_of((sgt), struct dma_sgt_handle, sgt)
|
||||
|
||||
int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr, size_t size,
|
||||
unsigned long attrs);
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
|||
{
|
||||
debug_dma_mapping_error(dev, dma_addr);
|
||||
|
||||
if (dma_addr == DMA_MAPPING_ERROR)
|
||||
if (unlikely(dma_addr == DMA_MAPPING_ERROR))
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -144,6 +144,15 @@ u64 dma_get_required_mask(struct device *dev);
|
|||
size_t dma_max_mapping_size(struct device *dev);
|
||||
bool dma_need_sync(struct device *dev, dma_addr_t dma_addr);
|
||||
unsigned long dma_get_merge_boundary(struct device *dev);
|
||||
struct sg_table *dma_alloc_noncontiguous(struct device *dev, size_t size,
|
||||
enum dma_data_direction dir, gfp_t gfp, unsigned long attrs);
|
||||
void dma_free_noncontiguous(struct device *dev, size_t size,
|
||||
struct sg_table *sgt, enum dma_data_direction dir);
|
||||
void *dma_vmap_noncontiguous(struct device *dev, size_t size,
|
||||
struct sg_table *sgt);
|
||||
void dma_vunmap_noncontiguous(struct device *dev, void *vaddr);
|
||||
int dma_mmap_noncontiguous(struct device *dev, struct vm_area_struct *vma,
|
||||
size_t size, struct sg_table *sgt);
|
||||
#else /* CONFIG_HAS_DMA */
|
||||
static inline dma_addr_t dma_map_page_attrs(struct device *dev,
|
||||
struct page *page, size_t offset, size_t size,
|
||||
|
|
@ -257,12 +266,37 @@ static inline unsigned long dma_get_merge_boundary(struct device *dev)
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
static inline struct sg_table *dma_alloc_noncontiguous(struct device *dev,
|
||||
size_t size, enum dma_data_direction dir, gfp_t gfp,
|
||||
unsigned long attrs)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void dma_free_noncontiguous(struct device *dev, size_t size,
|
||||
struct sg_table *sgt, enum dma_data_direction dir)
|
||||
{
|
||||
}
|
||||
static inline void *dma_vmap_noncontiguous(struct device *dev, size_t size,
|
||||
struct sg_table *sgt)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void dma_vunmap_noncontiguous(struct device *dev, void *vaddr)
|
||||
{
|
||||
}
|
||||
static inline int dma_mmap_noncontiguous(struct device *dev,
|
||||
struct vm_area_struct *vma, size_t size, struct sg_table *sgt)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif /* CONFIG_HAS_DMA */
|
||||
|
||||
struct page *dma_alloc_pages(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, enum dma_data_direction dir, gfp_t gfp);
|
||||
void dma_free_pages(struct device *dev, size_t size, struct page *page,
|
||||
dma_addr_t dma_handle, enum dma_data_direction dir);
|
||||
int dma_mmap_pages(struct device *dev, struct vm_area_struct *vma,
|
||||
size_t size, struct page *page);
|
||||
|
||||
static inline void *dma_alloc_noncoherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, enum dma_data_direction dir, gfp_t gfp)
|
||||
|
|
@ -401,7 +435,6 @@ static inline void dma_sync_sgtable_for_device(struct device *dev,
|
|||
static inline void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t gfp)
|
||||
{
|
||||
|
||||
return dma_alloc_attrs(dev, size, dma_handle, gfp,
|
||||
(gfp & __GFP_NOWARN) ? DMA_ATTR_NO_WARN : 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -160,11 +160,6 @@ static inline void ocelot_xfh_get_src_port(void *extraction, u64 *src_port)
|
|||
packing(extraction, src_port, 46, 43, OCELOT_TAG_LEN, UNPACK, 0);
|
||||
}
|
||||
|
||||
static inline void ocelot_xfh_get_cpuq(void *extraction, u64 *cpuq)
|
||||
{
|
||||
packing(extraction, cpuq, 28, 20, OCELOT_TAG_LEN, UNPACK, 0);
|
||||
}
|
||||
|
||||
static inline void ocelot_xfh_get_qos_class(void *extraction, u64 *qos_class)
|
||||
{
|
||||
packing(extraction, qos_class, 19, 17, OCELOT_TAG_LEN, UNPACK, 0);
|
||||
|
|
|
|||
|
|
@ -47,11 +47,12 @@ struct sja1105_tagger_data {
|
|||
};
|
||||
|
||||
struct sja1105_skb_cb {
|
||||
struct sk_buff *clone;
|
||||
u32 meta_tstamp;
|
||||
};
|
||||
|
||||
#define SJA1105_SKB_CB(skb) \
|
||||
((struct sja1105_skb_cb *)DSA_SKB_CB_PRIV(skb))
|
||||
((struct sja1105_skb_cb *)((skb)->cb))
|
||||
|
||||
struct sja1105_port {
|
||||
u16 subvlan_map[DSA_8021Q_N_SUBVLAN];
|
||||
|
|
|
|||
|
|
@ -72,8 +72,10 @@ typedef void *efi_handle_t;
|
|||
*/
|
||||
typedef guid_t efi_guid_t __aligned(__alignof__(u32));
|
||||
|
||||
#define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
|
||||
GUID_INIT(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)
|
||||
#define EFI_GUID(a, b, c, d...) (efi_guid_t){ { \
|
||||
(a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
|
||||
(b) & 0xff, ((b) >> 8) & 0xff, \
|
||||
(c) & 0xff, ((c) >> 8) & 0xff, d } }
|
||||
|
||||
/*
|
||||
* Generic EFI table header
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ struct elevator_mq_ops {
|
|||
void (*depth_updated)(struct blk_mq_hw_ctx *);
|
||||
|
||||
bool (*allow_merge)(struct request_queue *, struct request *, struct bio *);
|
||||
bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *, unsigned int);
|
||||
bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int);
|
||||
int (*request_merge)(struct request_queue *q, struct request **, struct bio *);
|
||||
void (*request_merged)(struct request_queue *, struct request *, enum elv_merge);
|
||||
void (*requests_merged)(struct request_queue *, struct request *, struct request *);
|
||||
|
|
|
|||
14
include/linux/elfnote-lto.h
Normal file
14
include/linux/elfnote-lto.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef __ELFNOTE_LTO_H
|
||||
#define __ELFNOTE_LTO_H
|
||||
|
||||
#include <linux/elfnote.h>
|
||||
|
||||
#define LINUX_ELFNOTE_LTO_INFO 0x101
|
||||
|
||||
#ifdef CONFIG_LTO
|
||||
#define BUILD_LTO_INFO ELFNOTE32("Linux", LINUX_ELFNOTE_LTO_INFO, 1)
|
||||
#else
|
||||
#define BUILD_LTO_INFO ELFNOTE32("Linux", LINUX_ELFNOTE_LTO_INFO, 0)
|
||||
#endif
|
||||
|
||||
#endif /* __ELFNOTE_LTO_H */
|
||||
|
|
@ -360,7 +360,7 @@ void syscall_exit_to_user_mode_work(struct pt_regs *regs);
|
|||
*
|
||||
* This is a combination of syscall_exit_to_user_mode_work() (1,2) and
|
||||
* exit_to_user_mode(). This function is preferred unless there is a
|
||||
* compelling architectural reason to use the seperate functions.
|
||||
* compelling architectural reason to use the separate functions.
|
||||
*/
|
||||
void syscall_exit_to_user_mode(struct pt_regs *regs);
|
||||
|
||||
|
|
@ -381,7 +381,7 @@ void irqentry_enter_from_user_mode(struct pt_regs *regs);
|
|||
* irqentry_exit_to_user_mode - Interrupt exit work
|
||||
* @regs: Pointer to current's pt_regs
|
||||
*
|
||||
* Invoked with interrupts disbled and fully valid regs. Returns with all
|
||||
* Invoked with interrupts disabled and fully valid regs. Returns with all
|
||||
* work handled, interrupts disabled such that the caller can immediately
|
||||
* switch to user mode. Called from architecture specific interrupt
|
||||
* handling code.
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
* Authors: Ross Biro
|
||||
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
|
||||
*
|
||||
* Relocated to include/linux where it belongs by Alan Cox
|
||||
* Relocated to include/linux where it belongs by Alan Cox
|
||||
* <gw4pts@gw4pts.ampr.org>
|
||||
*/
|
||||
#ifndef _LINUX_ETHERDEVICE_H
|
||||
|
|
@ -29,7 +29,7 @@ struct device;
|
|||
int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr);
|
||||
unsigned char *arch_get_platform_mac_address(void);
|
||||
int nvmem_get_mac_address(struct device *dev, void *addrbuf);
|
||||
u32 eth_get_headlen(const struct net_device *dev, void *data, unsigned int len);
|
||||
u32 eth_get_headlen(const struct net_device *dev, const void *data, u32 len);
|
||||
__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev);
|
||||
extern const struct header_ops eth_header_ops;
|
||||
|
||||
|
|
|
|||
|
|
@ -81,15 +81,14 @@ enum {
|
|||
#define ETH_RSS_HASH_NO_CHANGE 0
|
||||
|
||||
struct net_device;
|
||||
struct netlink_ext_ack;
|
||||
|
||||
/* Some generic methods drivers may use in their ethtool_ops */
|
||||
u32 ethtool_op_get_link(struct net_device *dev);
|
||||
int ethtool_op_get_ts_info(struct net_device *dev, struct ethtool_ts_info *eti);
|
||||
|
||||
|
||||
/**
|
||||
* struct ethtool_link_ext_state_info - link extended state and substate.
|
||||
*/
|
||||
/* Link extended state and substate. */
|
||||
struct ethtool_link_ext_state_info {
|
||||
enum ethtool_link_ext_state link_ext_state;
|
||||
union {
|
||||
|
|
@ -129,7 +128,6 @@ struct ethtool_link_ksettings {
|
|||
__ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising);
|
||||
} link_modes;
|
||||
u32 lanes;
|
||||
enum ethtool_link_mode_bit_indices link_mode;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -246,6 +244,56 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
|||
|
||||
#define ETHTOOL_STAT_NOT_SET (~0ULL)
|
||||
|
||||
static inline void ethtool_stats_init(u64 *stats, unsigned int n)
|
||||
{
|
||||
while (n--)
|
||||
stats[n] = ETHTOOL_STAT_NOT_SET;
|
||||
}
|
||||
|
||||
/* Basic IEEE 802.3 MAC statistics (30.3.1.1.*), not otherwise exposed
|
||||
* via a more targeted API.
|
||||
*/
|
||||
struct ethtool_eth_mac_stats {
|
||||
u64 FramesTransmittedOK;
|
||||
u64 SingleCollisionFrames;
|
||||
u64 MultipleCollisionFrames;
|
||||
u64 FramesReceivedOK;
|
||||
u64 FrameCheckSequenceErrors;
|
||||
u64 AlignmentErrors;
|
||||
u64 OctetsTransmittedOK;
|
||||
u64 FramesWithDeferredXmissions;
|
||||
u64 LateCollisions;
|
||||
u64 FramesAbortedDueToXSColls;
|
||||
u64 FramesLostDueToIntMACXmitError;
|
||||
u64 CarrierSenseErrors;
|
||||
u64 OctetsReceivedOK;
|
||||
u64 FramesLostDueToIntMACRcvError;
|
||||
u64 MulticastFramesXmittedOK;
|
||||
u64 BroadcastFramesXmittedOK;
|
||||
u64 FramesWithExcessiveDeferral;
|
||||
u64 MulticastFramesReceivedOK;
|
||||
u64 BroadcastFramesReceivedOK;
|
||||
u64 InRangeLengthErrors;
|
||||
u64 OutOfRangeLengthField;
|
||||
u64 FrameTooLongErrors;
|
||||
};
|
||||
|
||||
/* Basic IEEE 802.3 PHY statistics (30.3.2.1.*), not otherwise exposed
|
||||
* via a more targeted API.
|
||||
*/
|
||||
struct ethtool_eth_phy_stats {
|
||||
u64 SymbolErrorDuringCarrier;
|
||||
};
|
||||
|
||||
/* Basic IEEE 802.3 MAC Ctrl statistics (30.3.3.*), not otherwise exposed
|
||||
* via a more targeted API.
|
||||
*/
|
||||
struct ethtool_eth_ctrl_stats {
|
||||
u64 MACControlFramesTransmitted;
|
||||
u64 MACControlFramesReceived;
|
||||
u64 UnsupportedOpcodesReceived;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ethtool_pause_stats - statistics for IEEE 802.3x pause frames
|
||||
* @tx_pause_frames: transmitted pause frame count. Reported to user space
|
||||
|
|
@ -265,6 +313,102 @@ struct ethtool_pause_stats {
|
|||
u64 rx_pause_frames;
|
||||
};
|
||||
|
||||
#define ETHTOOL_MAX_LANES 8
|
||||
|
||||
/**
|
||||
* struct ethtool_fec_stats - statistics for IEEE 802.3 FEC
|
||||
* @corrected_blocks: number of received blocks corrected by FEC
|
||||
* Reported to user space as %ETHTOOL_A_FEC_STAT_CORRECTED.
|
||||
*
|
||||
* Equivalent to `30.5.1.1.17 aFECCorrectedBlocks` from the standard.
|
||||
*
|
||||
* @uncorrectable_blocks: number of received blocks FEC was not able to correct
|
||||
* Reported to user space as %ETHTOOL_A_FEC_STAT_UNCORR.
|
||||
*
|
||||
* Equivalent to `30.5.1.1.18 aFECUncorrectableBlocks` from the standard.
|
||||
*
|
||||
* @corrected_bits: number of bits corrected by FEC
|
||||
* Similar to @corrected_blocks but counts individual bit changes,
|
||||
* not entire FEC data blocks. This is a non-standard statistic.
|
||||
* Reported to user space as %ETHTOOL_A_FEC_STAT_CORR_BITS.
|
||||
*
|
||||
* @lane: per-lane/PCS-instance counts as defined by the standard
|
||||
* @total: error counts for the entire port, for drivers incapable of reporting
|
||||
* per-lane stats
|
||||
*
|
||||
* Drivers should fill in either only total or per-lane statistics, core
|
||||
* will take care of adding lane values up to produce the total.
|
||||
*/
|
||||
struct ethtool_fec_stats {
|
||||
struct ethtool_fec_stat {
|
||||
u64 total;
|
||||
u64 lanes[ETHTOOL_MAX_LANES];
|
||||
} corrected_blocks, uncorrectable_blocks, corrected_bits;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ethtool_rmon_hist_range - byte range for histogram statistics
|
||||
* @low: low bound of the bucket (inclusive)
|
||||
* @high: high bound of the bucket (inclusive)
|
||||
*/
|
||||
struct ethtool_rmon_hist_range {
|
||||
u16 low;
|
||||
u16 high;
|
||||
};
|
||||
|
||||
#define ETHTOOL_RMON_HIST_MAX 10
|
||||
|
||||
/**
|
||||
* struct ethtool_rmon_stats - selected RMON (RFC 2819) statistics
|
||||
* @undersize_pkts: Equivalent to `etherStatsUndersizePkts` from the RFC.
|
||||
* @oversize_pkts: Equivalent to `etherStatsOversizePkts` from the RFC.
|
||||
* @fragments: Equivalent to `etherStatsFragments` from the RFC.
|
||||
* @jabbers: Equivalent to `etherStatsJabbers` from the RFC.
|
||||
* @hist: Packet counter for packet length buckets (e.g.
|
||||
* `etherStatsPkts128to255Octets` from the RFC).
|
||||
* @hist_tx: Tx counters in similar form to @hist, not defined in the RFC.
|
||||
*
|
||||
* Selection of RMON (RFC 2819) statistics which are not exposed via different
|
||||
* APIs, primarily the packet-length-based counters.
|
||||
* Unfortunately different designs choose different buckets beyond
|
||||
* the 1024B mark (jumbo frame teritory), so the definition of the bucket
|
||||
* ranges is left to the driver.
|
||||
*/
|
||||
struct ethtool_rmon_stats {
|
||||
u64 undersize_pkts;
|
||||
u64 oversize_pkts;
|
||||
u64 fragments;
|
||||
u64 jabbers;
|
||||
|
||||
u64 hist[ETHTOOL_RMON_HIST_MAX];
|
||||
u64 hist_tx[ETHTOOL_RMON_HIST_MAX];
|
||||
};
|
||||
|
||||
#define ETH_MODULE_EEPROM_PAGE_LEN 128
|
||||
#define ETH_MODULE_MAX_I2C_ADDRESS 0x7f
|
||||
|
||||
/**
|
||||
* struct ethtool_module_eeprom - EEPROM dump from specified page
|
||||
* @offset: Offset within the specified EEPROM page to begin read, in bytes.
|
||||
* @length: Number of bytes to read.
|
||||
* @page: Page number to read from.
|
||||
* @bank: Page bank number to read from, if applicable by EEPROM spec.
|
||||
* @i2c_address: I2C address of a page. Value less than 0x7f expected. Most
|
||||
* EEPROMs use 0x50 or 0x51.
|
||||
* @data: Pointer to buffer with EEPROM data of @length size.
|
||||
*
|
||||
* This can be used to manage pages during EEPROM dump in ethtool and pass
|
||||
* required information to the driver.
|
||||
*/
|
||||
struct ethtool_module_eeprom {
|
||||
__u32 offset;
|
||||
__u32 length;
|
||||
__u8 page;
|
||||
__u8 bank;
|
||||
__u8 i2c_address;
|
||||
__u8 *data;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ethtool_ops - optional netdev operations
|
||||
* @cap_link_lanes_supported: indicates if the driver supports lanes
|
||||
|
|
@ -292,6 +436,9 @@ struct ethtool_pause_stats {
|
|||
* do not attach ext_substate attribute to netlink message). If link_ext_state
|
||||
* and link_ext_substate are unknown, return -ENODATA. If not implemented,
|
||||
* link_ext_state and link_ext_substate will not be sent to userspace.
|
||||
* @get_eeprom_len: Read range of EEPROM addresses for validation of
|
||||
* @get_eeprom and @set_eeprom requests.
|
||||
* Returns 0 if device does not support EEPROM access.
|
||||
* @get_eeprom: Read data from the device EEPROM.
|
||||
* Should fill in the magic field. Don't need to check len for zero
|
||||
* or wraparound. Fill in the data argument with the eeprom values
|
||||
|
|
@ -384,6 +531,8 @@ struct ethtool_pause_stats {
|
|||
* @get_module_eeprom: Get the eeprom information from the plug-in module
|
||||
* @get_eee: Get Energy-Efficient (EEE) supported and status.
|
||||
* @set_eee: Set EEE status (enable/disable) as well as LPI timers.
|
||||
* @get_tunable: Read the value of a driver / device tunable.
|
||||
* @set_tunable: Set the value of a driver / device tunable.
|
||||
* @get_per_queue_coalesce: Get interrupt coalescing parameters per queue.
|
||||
* It must check that the given queue number is valid. If neither a RX nor
|
||||
* a TX queue has this number, return -EINVAL. If only a RX queue or a TX
|
||||
|
|
@ -405,11 +554,26 @@ struct ethtool_pause_stats {
|
|||
* ignored (use %__ETHTOOL_LINK_MODE_MASK_NBITS instead of the latter),
|
||||
* any change to them will be overwritten by kernel. Returns a negative
|
||||
* error code or zero.
|
||||
* @get_fec_stats: Report FEC statistics.
|
||||
* Core will sum up per-lane stats to get the total.
|
||||
* Drivers must not zero statistics which they don't report. The stats
|
||||
* structure is initialized to ETHTOOL_STAT_NOT_SET indicating driver does
|
||||
* not report statistics.
|
||||
* @get_fecparam: Get the network device Forward Error Correction parameters.
|
||||
* @set_fecparam: Set the network device Forward Error Correction parameters.
|
||||
* @get_ethtool_phy_stats: Return extended statistics about the PHY device.
|
||||
* This is only useful if the device maintains PHY statistics and
|
||||
* cannot use the standard PHY library helpers.
|
||||
* @get_phy_tunable: Read the value of a PHY tunable.
|
||||
* @set_phy_tunable: Set the value of a PHY tunable.
|
||||
* @get_module_eeprom_by_page: Get a region of plug-in module EEPROM data from
|
||||
* specified page. Returns a negative error code or the amount of bytes
|
||||
* read.
|
||||
* @get_eth_phy_stats: Query some of the IEEE 802.3 PHY statistics.
|
||||
* @get_eth_mac_stats: Query some of the IEEE 802.3 MAC statistics.
|
||||
* @get_eth_ctrl_stats: Query some of the IEEE 802.3 MAC Ctrl statistics.
|
||||
* @get_rmon_stats: Query some of the RMON (RFC 2819) statistics.
|
||||
* Set %ranges to a pointer to zero-terminated array of byte ranges.
|
||||
*
|
||||
* All operations are optional (i.e. the function pointer may be set
|
||||
* to %NULL) and callers must take this into account. Callers must
|
||||
|
|
@ -505,6 +669,8 @@ struct ethtool_ops {
|
|||
struct ethtool_link_ksettings *);
|
||||
int (*set_link_ksettings)(struct net_device *,
|
||||
const struct ethtool_link_ksettings *);
|
||||
void (*get_fec_stats)(struct net_device *dev,
|
||||
struct ethtool_fec_stats *fec_stats);
|
||||
int (*get_fecparam)(struct net_device *,
|
||||
struct ethtool_fecparam *);
|
||||
int (*set_fecparam)(struct net_device *,
|
||||
|
|
@ -515,6 +681,18 @@ struct ethtool_ops {
|
|||
const struct ethtool_tunable *, void *);
|
||||
int (*set_phy_tunable)(struct net_device *,
|
||||
const struct ethtool_tunable *, const void *);
|
||||
int (*get_module_eeprom_by_page)(struct net_device *dev,
|
||||
const struct ethtool_module_eeprom *page,
|
||||
struct netlink_ext_ack *extack);
|
||||
void (*get_eth_phy_stats)(struct net_device *dev,
|
||||
struct ethtool_eth_phy_stats *phy_stats);
|
||||
void (*get_eth_mac_stats)(struct net_device *dev,
|
||||
struct ethtool_eth_mac_stats *mac_stats);
|
||||
void (*get_eth_ctrl_stats)(struct net_device *dev,
|
||||
struct ethtool_eth_ctrl_stats *ctrl_stats);
|
||||
void (*get_rmon_stats)(struct net_device *dev,
|
||||
struct ethtool_rmon_stats *rmon_stats,
|
||||
const struct ethtool_rmon_hist_range **ranges);
|
||||
};
|
||||
|
||||
int ethtool_check_ops(const struct ethtool_ops *ops);
|
||||
|
|
@ -538,7 +716,6 @@ int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
|
|||
const struct ethtool_link_ksettings *cmd,
|
||||
u32 *dev_speed, u8 *dev_duplex);
|
||||
|
||||
struct netlink_ext_ack;
|
||||
struct phy_device;
|
||||
struct phy_tdr_config;
|
||||
|
||||
|
|
@ -547,8 +724,8 @@ struct phy_tdr_config;
|
|||
* @get_sset_count: Get number of strings that @get_strings will write.
|
||||
* @get_strings: Return a set of strings that describe the requested objects
|
||||
* @get_stats: Return extended statistics about the PHY device.
|
||||
* @start_cable_test - Start a cable test
|
||||
* @start_cable_test_tdr - Start a Time Domain Reflectometry cable test
|
||||
* @start_cable_test: Start a cable test
|
||||
* @start_cable_test_tdr: Start a Time Domain Reflectometry cable test
|
||||
*
|
||||
* All operations are optional (i.e. the function pointer may be set to %NULL)
|
||||
* and callers must take this into account. Callers must hold the RTNL lock.
|
||||
|
|
@ -571,4 +748,22 @@ struct ethtool_phy_ops {
|
|||
*/
|
||||
void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops);
|
||||
|
||||
/**
|
||||
* ethtool_params_from_link_mode - Derive link parameters from a given link mode
|
||||
* @link_ksettings: Link parameters to be derived from the link mode
|
||||
* @link_mode: Link mode
|
||||
*/
|
||||
void
|
||||
ethtool_params_from_link_mode(struct ethtool_link_ksettings *link_ksettings,
|
||||
enum ethtool_link_mode_bit_indices link_mode);
|
||||
|
||||
/**
|
||||
* ethtool_sprintf - Write formatted string to ethtool string data
|
||||
* @data: Pointer to start of string to update
|
||||
* @fmt: Format of string to write
|
||||
*
|
||||
* Write formatted string to data. Update data to point at start of
|
||||
* next string.
|
||||
*/
|
||||
extern __printf(2, 3) void ethtool_sprintf(u8 **data, const char *fmt, ...);
|
||||
#endif /* _LINUX_ETHTOOL_H */
|
||||
|
|
|
|||
|
|
@ -271,6 +271,29 @@ static inline void devm_extcon_unregister_notifier(struct device *dev,
|
|||
struct extcon_dev *edev, unsigned int id,
|
||||
struct notifier_block *nb) { }
|
||||
|
||||
static inline int extcon_register_notifier_all(struct extcon_dev *edev,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int extcon_unregister_notifier_all(struct extcon_dev *edev,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int devm_extcon_register_notifier_all(struct device *dev,
|
||||
struct extcon_dev *edev,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void devm_extcon_unregister_notifier_all(struct device *dev,
|
||||
struct extcon_dev *edev,
|
||||
struct notifier_block *nb) { }
|
||||
|
||||
static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ struct f2fs_checkpoint {
|
|||
unsigned char alloc_type[MAX_ACTIVE_LOGS];
|
||||
|
||||
/* SIT and NAT version bitmap */
|
||||
unsigned char sit_nat_version_bitmap[1];
|
||||
unsigned char sit_nat_version_bitmap[];
|
||||
} __packed;
|
||||
|
||||
#define CP_CHKSUM_OFFSET 4092 /* default chksum offset in checkpoint */
|
||||
|
|
|
|||
|
|
@ -2,8 +2,11 @@
|
|||
#ifndef _LINUX_FANOTIFY_H
|
||||
#define _LINUX_FANOTIFY_H
|
||||
|
||||
#include <linux/sysctl.h>
|
||||
#include <uapi/linux/fanotify.h>
|
||||
|
||||
extern struct ctl_table fanotify_table[]; /* for sysctl */
|
||||
|
||||
#define FAN_GROUP_FLAG(group, flag) \
|
||||
((group)->fanotify_data.flags & (flag))
|
||||
|
||||
|
|
@ -15,15 +18,38 @@
|
|||
* these constant, the programs may break if re-compiled with new uapi headers
|
||||
* and then run on an old kernel.
|
||||
*/
|
||||
#define FANOTIFY_CLASS_BITS (FAN_CLASS_NOTIF | FAN_CLASS_CONTENT | \
|
||||
|
||||
/* Group classes where permission events are allowed */
|
||||
#define FANOTIFY_PERM_CLASSES (FAN_CLASS_CONTENT | \
|
||||
FAN_CLASS_PRE_CONTENT)
|
||||
|
||||
#define FANOTIFY_CLASS_BITS (FAN_CLASS_NOTIF | FANOTIFY_PERM_CLASSES)
|
||||
|
||||
#define FANOTIFY_FID_BITS (FAN_REPORT_FID | FAN_REPORT_DFID_NAME)
|
||||
|
||||
#define FANOTIFY_INIT_FLAGS (FANOTIFY_CLASS_BITS | FANOTIFY_FID_BITS | \
|
||||
FAN_REPORT_TID | \
|
||||
FAN_CLOEXEC | FAN_NONBLOCK | \
|
||||
FAN_UNLIMITED_QUEUE | FAN_UNLIMITED_MARKS)
|
||||
/*
|
||||
* fanotify_init() flags that require CAP_SYS_ADMIN.
|
||||
* We do not allow unprivileged groups to request permission events.
|
||||
* We do not allow unprivileged groups to get other process pid in events.
|
||||
* We do not allow unprivileged groups to use unlimited resources.
|
||||
*/
|
||||
#define FANOTIFY_ADMIN_INIT_FLAGS (FANOTIFY_PERM_CLASSES | \
|
||||
FAN_REPORT_TID | \
|
||||
FAN_UNLIMITED_QUEUE | \
|
||||
FAN_UNLIMITED_MARKS)
|
||||
|
||||
/*
|
||||
* fanotify_init() flags that are allowed for user without CAP_SYS_ADMIN.
|
||||
* FAN_CLASS_NOTIF is the only class we allow for unprivileged group.
|
||||
* We do not allow unprivileged groups to get file descriptors in events,
|
||||
* so one of the flags for reporting file handles is required.
|
||||
*/
|
||||
#define FANOTIFY_USER_INIT_FLAGS (FAN_CLASS_NOTIF | \
|
||||
FANOTIFY_FID_BITS | \
|
||||
FAN_CLOEXEC | FAN_NONBLOCK)
|
||||
|
||||
#define FANOTIFY_INIT_FLAGS (FANOTIFY_ADMIN_INIT_FLAGS | \
|
||||
FANOTIFY_USER_INIT_FLAGS)
|
||||
|
||||
#define FANOTIFY_MARK_TYPE_BITS (FAN_MARK_INODE | FAN_MARK_MOUNT | \
|
||||
FAN_MARK_FILESYSTEM)
|
||||
|
|
|
|||
|
|
@ -659,9 +659,6 @@ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch,
|
|||
/* drivers/video/fb_defio.c */
|
||||
int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma);
|
||||
extern void fb_deferred_io_init(struct fb_info *info);
|
||||
extern void fb_deferred_io_open(struct fb_info *info,
|
||||
struct inode *inode,
|
||||
struct file *file);
|
||||
extern void fb_deferred_io_cleanup(struct fb_info *info);
|
||||
extern int fb_deferred_io_fsync(struct file *file, loff_t start,
|
||||
loff_t end, int datasync);
|
||||
|
|
|
|||
|
|
@ -92,23 +92,20 @@ extern void put_unused_fd(unsigned int fd);
|
|||
|
||||
extern void fd_install(unsigned int fd, struct file *file);
|
||||
|
||||
extern int __receive_fd(int fd, struct file *file, int __user *ufd,
|
||||
extern int __receive_fd(struct file *file, int __user *ufd,
|
||||
unsigned int o_flags);
|
||||
static inline int receive_fd_user(struct file *file, int __user *ufd,
|
||||
unsigned int o_flags)
|
||||
{
|
||||
if (ufd == NULL)
|
||||
return -EFAULT;
|
||||
return __receive_fd(-1, file, ufd, o_flags);
|
||||
return __receive_fd(file, ufd, o_flags);
|
||||
}
|
||||
static inline int receive_fd(struct file *file, unsigned int o_flags)
|
||||
{
|
||||
return __receive_fd(-1, file, NULL, o_flags);
|
||||
}
|
||||
static inline int receive_fd_replace(int fd, struct file *file, unsigned int o_flags)
|
||||
{
|
||||
return __receive_fd(fd, file, NULL, o_flags);
|
||||
return __receive_fd(file, NULL, o_flags);
|
||||
}
|
||||
int receive_fd_replace(int new_fd, struct file *file, unsigned int o_flags);
|
||||
|
||||
extern void flush_delayed_fput(void);
|
||||
extern void __fput_sync(struct file *);
|
||||
|
|
|
|||
59
include/linux/fileattr.h
Normal file
59
include/linux/fileattr.h
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef _LINUX_FILEATTR_H
|
||||
#define _LINUX_FILEATTR_H
|
||||
|
||||
/* Flags shared betwen flags/xflags */
|
||||
#define FS_COMMON_FL \
|
||||
(FS_SYNC_FL | FS_IMMUTABLE_FL | FS_APPEND_FL | \
|
||||
FS_NODUMP_FL | FS_NOATIME_FL | FS_DAX_FL | \
|
||||
FS_PROJINHERIT_FL)
|
||||
|
||||
#define FS_XFLAG_COMMON \
|
||||
(FS_XFLAG_SYNC | FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND | \
|
||||
FS_XFLAG_NODUMP | FS_XFLAG_NOATIME | FS_XFLAG_DAX | \
|
||||
FS_XFLAG_PROJINHERIT)
|
||||
|
||||
/*
|
||||
* Merged interface for miscellaneous file attributes. 'flags' originates from
|
||||
* ext* and 'fsx_flags' from xfs. There's some overlap between the two, which
|
||||
* is handled by the VFS helpers, so filesystems are free to implement just one
|
||||
* or both of these sub-interfaces.
|
||||
*/
|
||||
struct fileattr {
|
||||
u32 flags; /* flags (FS_IOC_GETFLAGS/FS_IOC_SETFLAGS) */
|
||||
/* struct fsxattr: */
|
||||
u32 fsx_xflags; /* xflags field value (get/set) */
|
||||
u32 fsx_extsize; /* extsize field value (get/set)*/
|
||||
u32 fsx_nextents; /* nextents field value (get) */
|
||||
u32 fsx_projid; /* project identifier (get/set) */
|
||||
u32 fsx_cowextsize; /* CoW extsize field value (get/set)*/
|
||||
/* selectors: */
|
||||
bool flags_valid:1;
|
||||
bool fsx_valid:1;
|
||||
};
|
||||
|
||||
int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user *ufa);
|
||||
|
||||
void fileattr_fill_xflags(struct fileattr *fa, u32 xflags);
|
||||
void fileattr_fill_flags(struct fileattr *fa, u32 flags);
|
||||
|
||||
/**
|
||||
* fileattr_has_fsx - check for extended flags/attributes
|
||||
* @fa: fileattr pointer
|
||||
*
|
||||
* Return: true if any attributes are present that are not represented in
|
||||
* ->flags.
|
||||
*/
|
||||
static inline bool fileattr_has_fsx(const struct fileattr *fa)
|
||||
{
|
||||
return fa->fsx_valid &&
|
||||
((fa->fsx_xflags & ~FS_XFLAG_COMMON) || fa->fsx_extsize != 0 ||
|
||||
fa->fsx_projid != 0 || fa->fsx_cowextsize != 0);
|
||||
}
|
||||
|
||||
int vfs_fileattr_get(struct dentry *dentry, struct fileattr *fa);
|
||||
int vfs_fileattr_set(struct user_namespace *mnt_userns, struct dentry *dentry,
|
||||
struct fileattr *fa);
|
||||
|
||||
#endif /* _LINUX_FILEATTR_H */
|
||||
|
|
@ -646,7 +646,8 @@ struct bpf_redirect_info {
|
|||
u32 flags;
|
||||
u32 tgt_index;
|
||||
void *tgt_value;
|
||||
struct bpf_map *map;
|
||||
u32 map_id;
|
||||
enum bpf_map_type map_type;
|
||||
u32 kern_flags;
|
||||
struct bpf_nh_params nh;
|
||||
};
|
||||
|
|
@ -876,8 +877,7 @@ void bpf_prog_free_linfo(struct bpf_prog *prog);
|
|||
void bpf_prog_fill_jited_linfo(struct bpf_prog *prog,
|
||||
const u32 *insn_to_jit_off);
|
||||
int bpf_prog_alloc_jited_linfo(struct bpf_prog *prog);
|
||||
void bpf_prog_free_jited_linfo(struct bpf_prog *prog);
|
||||
void bpf_prog_free_unused_jited_linfo(struct bpf_prog *prog);
|
||||
void bpf_prog_jit_attempt_done(struct bpf_prog *prog);
|
||||
|
||||
struct bpf_prog *bpf_prog_alloc(unsigned int size, gfp_t gfp_extra_flags);
|
||||
struct bpf_prog *bpf_prog_alloc_no_stats(unsigned int size, gfp_t gfp_extra_flags);
|
||||
|
|
@ -918,6 +918,7 @@ u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
|
|||
struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog);
|
||||
void bpf_jit_compile(struct bpf_prog *prog);
|
||||
bool bpf_jit_needs_zext(void);
|
||||
bool bpf_jit_supports_kfunc_call(void);
|
||||
bool bpf_helper_changes_pkt_data(void *func);
|
||||
|
||||
static inline bool bpf_dump_raw_ok(const struct cred *cred)
|
||||
|
|
@ -1245,15 +1246,6 @@ static inline u16 bpf_anc_helper(const struct sock_filter *ftest)
|
|||
void *bpf_internal_load_pointer_neg_helper(const struct sk_buff *skb,
|
||||
int k, unsigned int size);
|
||||
|
||||
static inline void *bpf_load_pointer(const struct sk_buff *skb, int k,
|
||||
unsigned int size, void *buffer)
|
||||
{
|
||||
if (k >= 0)
|
||||
return skb_header_pointer(skb, k, size, buffer);
|
||||
|
||||
return bpf_internal_load_pointer_neg_helper(skb, k, size);
|
||||
}
|
||||
|
||||
static inline int bpf_tell_extensions(void)
|
||||
{
|
||||
return SKF_AD_MAX;
|
||||
|
|
@ -1472,4 +1464,32 @@ static inline bool bpf_sk_lookup_run_v6(struct net *net, int protocol,
|
|||
}
|
||||
#endif /* IS_ENABLED(CONFIG_IPV6) */
|
||||
|
||||
static __always_inline int __bpf_xdp_redirect_map(struct bpf_map *map, u32 ifindex, u64 flags,
|
||||
void *lookup_elem(struct bpf_map *map, u32 key))
|
||||
{
|
||||
struct bpf_redirect_info *ri = this_cpu_ptr(&bpf_redirect_info);
|
||||
|
||||
/* Lower bits of the flags are used as return code on lookup failure */
|
||||
if (unlikely(flags > XDP_TX))
|
||||
return XDP_ABORTED;
|
||||
|
||||
ri->tgt_value = lookup_elem(map, ifindex);
|
||||
if (unlikely(!ri->tgt_value)) {
|
||||
/* If the lookup fails we want to clear out the state in the
|
||||
* redirect_info struct completely, so that if an eBPF program
|
||||
* performs multiple lookups, the last one always takes
|
||||
* precedence.
|
||||
*/
|
||||
ri->map_id = INT_MAX; /* Valid map id idr range: [1,INT_MAX[ */
|
||||
ri->map_type = BPF_MAP_TYPE_UNSPEC;
|
||||
return flags;
|
||||
}
|
||||
|
||||
ri->tgt_index = ifindex;
|
||||
ri->map_id = map->id;
|
||||
ri->map_type = map->map_type;
|
||||
|
||||
return XDP_REDIRECT;
|
||||
}
|
||||
|
||||
#endif /* __LINUX_FILTER_H__ */
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
* COMMAND_RECONFIG_FLAG_PARTIAL:
|
||||
* Set to FPGA configuration type (full or partial).
|
||||
*/
|
||||
#define COMMAND_RECONFIG_FLAG_PARTIAL 1
|
||||
#define COMMAND_RECONFIG_FLAG_PARTIAL 0
|
||||
|
||||
/*
|
||||
* Timeout settings for service clients:
|
||||
|
|
|
|||
|
|
@ -72,6 +72,12 @@ enum pm_api_id {
|
|||
PM_FPGA_LOAD = 22,
|
||||
PM_FPGA_GET_STATUS = 23,
|
||||
PM_GET_CHIPID = 24,
|
||||
PM_PINCTRL_REQUEST = 28,
|
||||
PM_PINCTRL_RELEASE = 29,
|
||||
PM_PINCTRL_GET_FUNCTION = 30,
|
||||
PM_PINCTRL_SET_FUNCTION = 31,
|
||||
PM_PINCTRL_CONFIG_PARAM_GET = 32,
|
||||
PM_PINCTRL_CONFIG_PARAM_SET = 33,
|
||||
PM_IOCTL = 34,
|
||||
PM_QUERY_DATA = 35,
|
||||
PM_CLOCK_ENABLE = 36,
|
||||
|
|
@ -122,6 +128,12 @@ enum pm_query_id {
|
|||
PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS = 3,
|
||||
PM_QID_CLOCK_GET_PARENTS = 4,
|
||||
PM_QID_CLOCK_GET_ATTRIBUTES = 5,
|
||||
PM_QID_PINCTRL_GET_NUM_PINS = 6,
|
||||
PM_QID_PINCTRL_GET_NUM_FUNCTIONS = 7,
|
||||
PM_QID_PINCTRL_GET_NUM_FUNCTION_GROUPS = 8,
|
||||
PM_QID_PINCTRL_GET_FUNCTION_NAME = 9,
|
||||
PM_QID_PINCTRL_GET_FUNCTION_GROUPS = 10,
|
||||
PM_QID_PINCTRL_GET_PIN_GROUPS = 11,
|
||||
PM_QID_CLOCK_GET_NUM_CLOCKS = 12,
|
||||
PM_QID_CLOCK_GET_MAX_DIVISOR = 13,
|
||||
};
|
||||
|
|
@ -285,6 +297,44 @@ enum dll_reset_type {
|
|||
PM_DLL_RESET_PULSE = 2,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_config_param {
|
||||
PM_PINCTRL_CONFIG_SLEW_RATE = 0,
|
||||
PM_PINCTRL_CONFIG_BIAS_STATUS = 1,
|
||||
PM_PINCTRL_CONFIG_PULL_CTRL = 2,
|
||||
PM_PINCTRL_CONFIG_SCHMITT_CMOS = 3,
|
||||
PM_PINCTRL_CONFIG_DRIVE_STRENGTH = 4,
|
||||
PM_PINCTRL_CONFIG_VOLTAGE_STATUS = 5,
|
||||
PM_PINCTRL_CONFIG_TRI_STATE = 6,
|
||||
PM_PINCTRL_CONFIG_MAX = 7,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_slew_rate {
|
||||
PM_PINCTRL_SLEW_RATE_FAST = 0,
|
||||
PM_PINCTRL_SLEW_RATE_SLOW = 1,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_bias_status {
|
||||
PM_PINCTRL_BIAS_DISABLE = 0,
|
||||
PM_PINCTRL_BIAS_ENABLE = 1,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_pull_ctrl {
|
||||
PM_PINCTRL_BIAS_PULL_DOWN = 0,
|
||||
PM_PINCTRL_BIAS_PULL_UP = 1,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_schmitt_cmos {
|
||||
PM_PINCTRL_INPUT_TYPE_CMOS = 0,
|
||||
PM_PINCTRL_INPUT_TYPE_SCHMITT = 1,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_drive_strength {
|
||||
PM_PINCTRL_DRIVE_STRENGTH_2MA = 0,
|
||||
PM_PINCTRL_DRIVE_STRENGTH_4MA = 1,
|
||||
PM_PINCTRL_DRIVE_STRENGTH_8MA = 2,
|
||||
PM_PINCTRL_DRIVE_STRENGTH_12MA = 3,
|
||||
};
|
||||
|
||||
enum zynqmp_pm_shutdown_type {
|
||||
ZYNQMP_PM_SHUTDOWN_TYPE_SHUTDOWN = 0,
|
||||
ZYNQMP_PM_SHUTDOWN_TYPE_RESET = 1,
|
||||
|
|
@ -353,12 +403,15 @@ int zynqmp_pm_write_pggs(u32 index, u32 value);
|
|||
int zynqmp_pm_read_pggs(u32 index, u32 *value);
|
||||
int zynqmp_pm_system_shutdown(const u32 type, const u32 subtype);
|
||||
int zynqmp_pm_set_boot_health_status(u32 value);
|
||||
int zynqmp_pm_pinctrl_request(const u32 pin);
|
||||
int zynqmp_pm_pinctrl_release(const u32 pin);
|
||||
int zynqmp_pm_pinctrl_get_function(const u32 pin, u32 *id);
|
||||
int zynqmp_pm_pinctrl_set_function(const u32 pin, const u32 id);
|
||||
int zynqmp_pm_pinctrl_get_config(const u32 pin, const u32 param,
|
||||
u32 *value);
|
||||
int zynqmp_pm_pinctrl_set_config(const u32 pin, const u32 param,
|
||||
u32 value);
|
||||
#else
|
||||
static inline struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_api_version(u32 *version)
|
||||
{
|
||||
return -ENODEV;
|
||||
|
|
@ -537,6 +590,38 @@ static inline int zynqmp_pm_set_boot_health_status(u32 value)
|
|||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_request(const u32 pin)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_release(const u32 pin)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_get_function(const u32 pin, u32 *id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_set_function(const u32 pin, const u32 id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_get_config(const u32 pin, const u32 param,
|
||||
u32 *value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_set_config(const u32 pin, const u32 param,
|
||||
u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __FIRMWARE_ZYNQMP_H__ */
|
||||
|
|
|
|||
|
|
@ -279,7 +279,6 @@ static inline int freeze_kernel_threads(void) { return -ENOSYS; }
|
|||
static inline void thaw_processes(void) {}
|
||||
static inline void thaw_kernel_threads(void) {}
|
||||
|
||||
static inline bool try_to_freeze_nowarn(void) { return false; }
|
||||
static inline bool try_to_freeze(void) { return false; }
|
||||
|
||||
static inline void freezer_do_not_count(void) {}
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ struct fsverity_info;
|
|||
struct fsverity_operations;
|
||||
struct fs_context;
|
||||
struct fs_parameter_spec;
|
||||
struct fileattr;
|
||||
|
||||
extern void __init inode_init(void);
|
||||
extern void __init inode_init_early(void);
|
||||
|
|
@ -144,7 +145,7 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
|
|||
/* Expect random access pattern */
|
||||
#define FMODE_RANDOM ((__force fmode_t)0x1000)
|
||||
|
||||
/* File is huge (eg. /dev/kmem): treat loff_t as unsigned */
|
||||
/* File is huge (eg. /dev/mem): treat loff_t as unsigned */
|
||||
#define FMODE_UNSIGNED_OFFSET ((__force fmode_t)0x2000)
|
||||
|
||||
/* File is opened with O_PATH; almost nothing can be done with it */
|
||||
|
|
@ -441,7 +442,6 @@ int pagecache_write_end(struct file *, struct address_space *mapping,
|
|||
* @i_mmap: Tree of private and shared mappings.
|
||||
* @i_mmap_rwsem: Protects @i_mmap and @i_mmap_writable.
|
||||
* @nrpages: Number of page entries, protected by the i_pages lock.
|
||||
* @nrexceptional: Shadow or DAX entries, protected by the i_pages lock.
|
||||
* @writeback_index: Writeback starts here.
|
||||
* @a_ops: Methods.
|
||||
* @flags: Error bits and flags (AS_*).
|
||||
|
|
@ -462,7 +462,6 @@ struct address_space {
|
|||
struct rb_root_cached i_mmap;
|
||||
struct rw_semaphore i_mmap_rwsem;
|
||||
unsigned long nrpages;
|
||||
unsigned long nrexceptional;
|
||||
pgoff_t writeback_index;
|
||||
const struct address_space_operations *a_ops;
|
||||
unsigned long flags;
|
||||
|
|
@ -891,18 +890,22 @@ struct fown_struct {
|
|||
int signum; /* posix.1b rt signal to be delivered on IO */
|
||||
};
|
||||
|
||||
/*
|
||||
* Track a single file's readahead state
|
||||
/**
|
||||
* struct file_ra_state - Track a file's readahead state.
|
||||
* @start: Where the most recent readahead started.
|
||||
* @size: Number of pages read in the most recent readahead.
|
||||
* @async_size: Start next readahead when this many pages are left.
|
||||
* @ra_pages: Maximum size of a readahead request.
|
||||
* @mmap_miss: How many mmap accesses missed in the page cache.
|
||||
* @prev_pos: The last byte in the most recent read request.
|
||||
*/
|
||||
struct file_ra_state {
|
||||
pgoff_t start; /* where readahead started */
|
||||
unsigned int size; /* # of readahead pages */
|
||||
unsigned int async_size; /* do asynchronous readahead when
|
||||
there are only # of pages ahead */
|
||||
|
||||
unsigned int ra_pages; /* Maximum readahead window */
|
||||
unsigned int mmap_miss; /* Cache miss stat for mmap accesses */
|
||||
loff_t prev_pos; /* Cache last read() position */
|
||||
pgoff_t start;
|
||||
unsigned int size;
|
||||
unsigned int async_size;
|
||||
unsigned int ra_pages;
|
||||
unsigned int mmap_miss;
|
||||
loff_t prev_pos;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -1574,52 +1577,172 @@ static inline void i_gid_write(struct inode *inode, gid_t gid)
|
|||
inode->i_gid = make_kgid(inode->i_sb->s_user_ns, gid);
|
||||
}
|
||||
|
||||
/**
|
||||
* kuid_into_mnt - map a kuid down into a mnt_userns
|
||||
* @mnt_userns: user namespace of the relevant mount
|
||||
* @kuid: kuid to be mapped
|
||||
*
|
||||
* Return: @kuid mapped according to @mnt_userns.
|
||||
* If @kuid has no mapping INVALID_UID is returned.
|
||||
*/
|
||||
static inline kuid_t kuid_into_mnt(struct user_namespace *mnt_userns,
|
||||
kuid_t kuid)
|
||||
{
|
||||
return make_kuid(mnt_userns, __kuid_val(kuid));
|
||||
}
|
||||
|
||||
/**
|
||||
* kgid_into_mnt - map a kgid down into a mnt_userns
|
||||
* @mnt_userns: user namespace of the relevant mount
|
||||
* @kgid: kgid to be mapped
|
||||
*
|
||||
* Return: @kgid mapped according to @mnt_userns.
|
||||
* If @kgid has no mapping INVALID_GID is returned.
|
||||
*/
|
||||
static inline kgid_t kgid_into_mnt(struct user_namespace *mnt_userns,
|
||||
kgid_t kgid)
|
||||
{
|
||||
return make_kgid(mnt_userns, __kgid_val(kgid));
|
||||
}
|
||||
|
||||
/**
|
||||
* i_uid_into_mnt - map an inode's i_uid down into a mnt_userns
|
||||
* @mnt_userns: user namespace of the mount the inode was found from
|
||||
* @inode: inode to map
|
||||
*
|
||||
* Return: the inode's i_uid mapped down according to @mnt_userns.
|
||||
* If the inode's i_uid has no mapping INVALID_UID is returned.
|
||||
*/
|
||||
static inline kuid_t i_uid_into_mnt(struct user_namespace *mnt_userns,
|
||||
const struct inode *inode)
|
||||
{
|
||||
return kuid_into_mnt(mnt_userns, inode->i_uid);
|
||||
}
|
||||
|
||||
/**
|
||||
* i_gid_into_mnt - map an inode's i_gid down into a mnt_userns
|
||||
* @mnt_userns: user namespace of the mount the inode was found from
|
||||
* @inode: inode to map
|
||||
*
|
||||
* Return: the inode's i_gid mapped down according to @mnt_userns.
|
||||
* If the inode's i_gid has no mapping INVALID_GID is returned.
|
||||
*/
|
||||
static inline kgid_t i_gid_into_mnt(struct user_namespace *mnt_userns,
|
||||
const struct inode *inode)
|
||||
{
|
||||
return kgid_into_mnt(mnt_userns, inode->i_gid);
|
||||
}
|
||||
|
||||
/**
|
||||
* kuid_from_mnt - map a kuid up into a mnt_userns
|
||||
* @mnt_userns: user namespace of the relevant mount
|
||||
* @kuid: kuid to be mapped
|
||||
*
|
||||
* Return: @kuid mapped up according to @mnt_userns.
|
||||
* If @kuid has no mapping INVALID_UID is returned.
|
||||
*/
|
||||
static inline kuid_t kuid_from_mnt(struct user_namespace *mnt_userns,
|
||||
kuid_t kuid)
|
||||
{
|
||||
return KUIDT_INIT(from_kuid(mnt_userns, kuid));
|
||||
}
|
||||
|
||||
/**
|
||||
* kgid_from_mnt - map a kgid up into a mnt_userns
|
||||
* @mnt_userns: user namespace of the relevant mount
|
||||
* @kgid: kgid to be mapped
|
||||
*
|
||||
* Return: @kgid mapped up according to @mnt_userns.
|
||||
* If @kgid has no mapping INVALID_GID is returned.
|
||||
*/
|
||||
static inline kgid_t kgid_from_mnt(struct user_namespace *mnt_userns,
|
||||
kgid_t kgid)
|
||||
{
|
||||
return KGIDT_INIT(from_kgid(mnt_userns, kgid));
|
||||
}
|
||||
|
||||
static inline kuid_t fsuid_into_mnt(struct user_namespace *mnt_userns)
|
||||
/**
|
||||
* mapped_fsuid - return caller's fsuid mapped up into a mnt_userns
|
||||
* @mnt_userns: user namespace of the relevant mount
|
||||
*
|
||||
* Use this helper to initialize a new vfs or filesystem object based on
|
||||
* the caller's fsuid. A common example is initializing the i_uid field of
|
||||
* a newly allocated inode triggered by a creation event such as mkdir or
|
||||
* O_CREAT. Other examples include the allocation of quotas for a specific
|
||||
* user.
|
||||
*
|
||||
* Return: the caller's current fsuid mapped up according to @mnt_userns.
|
||||
*/
|
||||
static inline kuid_t mapped_fsuid(struct user_namespace *mnt_userns)
|
||||
{
|
||||
return kuid_from_mnt(mnt_userns, current_fsuid());
|
||||
}
|
||||
|
||||
static inline kgid_t fsgid_into_mnt(struct user_namespace *mnt_userns)
|
||||
/**
|
||||
* mapped_fsgid - return caller's fsgid mapped up into a mnt_userns
|
||||
* @mnt_userns: user namespace of the relevant mount
|
||||
*
|
||||
* Use this helper to initialize a new vfs or filesystem object based on
|
||||
* the caller's fsgid. A common example is initializing the i_gid field of
|
||||
* a newly allocated inode triggered by a creation event such as mkdir or
|
||||
* O_CREAT. Other examples include the allocation of quotas for a specific
|
||||
* user.
|
||||
*
|
||||
* Return: the caller's current fsgid mapped up according to @mnt_userns.
|
||||
*/
|
||||
static inline kgid_t mapped_fsgid(struct user_namespace *mnt_userns)
|
||||
{
|
||||
return kgid_from_mnt(mnt_userns, current_fsgid());
|
||||
}
|
||||
|
||||
/**
|
||||
* inode_fsuid_set - initialize inode's i_uid field with callers fsuid
|
||||
* @inode: inode to initialize
|
||||
* @mnt_userns: user namespace of the mount the inode was found from
|
||||
*
|
||||
* Initialize the i_uid field of @inode. If the inode was found/created via
|
||||
* an idmapped mount map the caller's fsuid according to @mnt_users.
|
||||
*/
|
||||
static inline void inode_fsuid_set(struct inode *inode,
|
||||
struct user_namespace *mnt_userns)
|
||||
{
|
||||
inode->i_uid = mapped_fsuid(mnt_userns);
|
||||
}
|
||||
|
||||
/**
|
||||
* inode_fsgid_set - initialize inode's i_gid field with callers fsgid
|
||||
* @inode: inode to initialize
|
||||
* @mnt_userns: user namespace of the mount the inode was found from
|
||||
*
|
||||
* Initialize the i_gid field of @inode. If the inode was found/created via
|
||||
* an idmapped mount map the caller's fsgid according to @mnt_users.
|
||||
*/
|
||||
static inline void inode_fsgid_set(struct inode *inode,
|
||||
struct user_namespace *mnt_userns)
|
||||
{
|
||||
inode->i_gid = mapped_fsgid(mnt_userns);
|
||||
}
|
||||
|
||||
/**
|
||||
* fsuidgid_has_mapping() - check whether caller's fsuid/fsgid is mapped
|
||||
* @sb: the superblock we want a mapping in
|
||||
* @mnt_userns: user namespace of the relevant mount
|
||||
*
|
||||
* Check whether the caller's fsuid and fsgid have a valid mapping in the
|
||||
* s_user_ns of the superblock @sb. If the caller is on an idmapped mount map
|
||||
* the caller's fsuid and fsgid according to the @mnt_userns first.
|
||||
*
|
||||
* Return: true if fsuid and fsgid is mapped, false if not.
|
||||
*/
|
||||
static inline bool fsuidgid_has_mapping(struct super_block *sb,
|
||||
struct user_namespace *mnt_userns)
|
||||
{
|
||||
struct user_namespace *s_user_ns = sb->s_user_ns;
|
||||
|
||||
return kuid_has_mapping(s_user_ns, mapped_fsuid(mnt_userns)) &&
|
||||
kgid_has_mapping(s_user_ns, mapped_fsgid(mnt_userns));
|
||||
}
|
||||
|
||||
extern struct timespec64 current_time(struct inode *inode);
|
||||
|
||||
/*
|
||||
|
|
@ -1739,7 +1862,7 @@ static inline void sb_start_pagefault(struct super_block *sb)
|
|||
__sb_start_write(sb, SB_FREEZE_PAGEFAULT);
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* sb_start_intwrite - get write access to a superblock for internal fs purposes
|
||||
* @sb: the super we write to
|
||||
*
|
||||
|
|
@ -1782,6 +1905,17 @@ int vfs_rmdir(struct user_namespace *, struct inode *, struct dentry *);
|
|||
int vfs_unlink(struct user_namespace *, struct inode *, struct dentry *,
|
||||
struct inode **);
|
||||
|
||||
/**
|
||||
* struct renamedata - contains all information required for renaming
|
||||
* @old_mnt_userns: old user namespace of the mount the inode was found from
|
||||
* @old_dir: parent of source
|
||||
* @old_dentry: source
|
||||
* @new_mnt_userns: new user namespace of the mount the inode was found from
|
||||
* @new_dir: parent of destination
|
||||
* @new_dentry: destination
|
||||
* @delegated_inode: returns an inode needing a delegation break
|
||||
* @flags: rename flags
|
||||
*/
|
||||
struct renamedata {
|
||||
struct user_namespace *old_mnt_userns;
|
||||
struct inode *old_dir;
|
||||
|
|
@ -1963,6 +2097,9 @@ struct inode_operations {
|
|||
struct dentry *, umode_t);
|
||||
int (*set_acl)(struct user_namespace *, struct inode *,
|
||||
struct posix_acl *, int);
|
||||
int (*fileattr_set)(struct user_namespace *mnt_userns,
|
||||
struct dentry *dentry, struct fileattr *fa);
|
||||
int (*fileattr_get)(struct dentry *dentry, struct fileattr *fa);
|
||||
} ____cacheline_aligned;
|
||||
|
||||
static inline ssize_t call_read_iter(struct file *file, struct kiocb *kio,
|
||||
|
|
@ -2739,6 +2876,8 @@ static inline int filemap_fdatawait(struct address_space *mapping)
|
|||
|
||||
extern bool filemap_range_has_page(struct address_space *, loff_t lstart,
|
||||
loff_t lend);
|
||||
extern bool filemap_range_needs_writeback(struct address_space *,
|
||||
loff_t lstart, loff_t lend);
|
||||
extern int filemap_write_and_wait_range(struct address_space *mapping,
|
||||
loff_t lstart, loff_t lend);
|
||||
extern int __filemap_fdatawrite_range(struct address_space *mapping,
|
||||
|
|
@ -2884,6 +3023,11 @@ static inline bool execute_ok(struct inode *inode)
|
|||
return (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode);
|
||||
}
|
||||
|
||||
static inline bool inode_wrong_type(const struct inode *inode, umode_t mode)
|
||||
{
|
||||
return (inode->i_mode ^ mode) & S_IFMT;
|
||||
}
|
||||
|
||||
static inline void file_start_write(struct file *file)
|
||||
{
|
||||
if (!S_ISREG(file_inode(file)->i_mode))
|
||||
|
|
@ -3161,7 +3305,7 @@ static inline ssize_t blockdev_direct_IO(struct kiocb *iocb,
|
|||
|
||||
void inode_dio_wait(struct inode *inode);
|
||||
|
||||
/*
|
||||
/**
|
||||
* inode_dio_begin - signal start of a direct I/O requests
|
||||
* @inode: inode the direct I/O happens on
|
||||
*
|
||||
|
|
@ -3173,7 +3317,7 @@ static inline void inode_dio_begin(struct inode *inode)
|
|||
atomic_inc(&inode->i_dio_count);
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* inode_dio_end - signal finish of a direct I/O requests
|
||||
* @inode: inode the direct I/O happens on
|
||||
*
|
||||
|
|
@ -3567,18 +3711,6 @@ extern int vfs_fadvise(struct file *file, loff_t offset, loff_t len,
|
|||
extern int generic_fadvise(struct file *file, loff_t offset, loff_t len,
|
||||
int advice);
|
||||
|
||||
int vfs_ioc_setflags_prepare(struct inode *inode, unsigned int oldflags,
|
||||
unsigned int flags);
|
||||
|
||||
int vfs_ioc_fssetxattr_check(struct inode *inode, const struct fsxattr *old_fa,
|
||||
struct fsxattr *fa);
|
||||
|
||||
static inline void simple_fill_fsxattr(struct fsxattr *fa, __u32 xflags)
|
||||
{
|
||||
memset(fa, 0, sizeof(*fa));
|
||||
fa->fsx_xflags = xflags;
|
||||
}
|
||||
|
||||
/*
|
||||
* Flush file data before changing attributes. Caller must hold any locks
|
||||
* required to prevent further writes to this file until we're done setting
|
||||
|
|
|
|||
|
|
@ -304,6 +304,10 @@ struct fscache_cache_ops {
|
|||
|
||||
/* dissociate a cache from all the pages it was backing */
|
||||
void (*dissociate_pages)(struct fscache_cache *cache);
|
||||
|
||||
/* Begin a read operation for the netfs lib */
|
||||
int (*begin_read_operation)(struct netfs_read_request *rreq,
|
||||
struct fscache_retrieval *op);
|
||||
};
|
||||
|
||||
extern struct fscache_cookie fscache_fsdef_index;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/pagemap.h>
|
||||
#include <linux/pagevec.h>
|
||||
#include <linux/list_bl.h>
|
||||
#include <linux/netfs.h>
|
||||
|
||||
#if defined(CONFIG_FSCACHE) || defined(CONFIG_FSCACHE_MODULE)
|
||||
#define fscache_available() (1)
|
||||
|
|
@ -29,16 +30,6 @@
|
|||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* overload PG_private_2 to give us PG_fscache - this is used to indicate that
|
||||
* a page is currently backed by a local disk cache
|
||||
*/
|
||||
#define PageFsCache(page) PagePrivate2((page))
|
||||
#define SetPageFsCache(page) SetPagePrivate2((page))
|
||||
#define ClearPageFsCache(page) ClearPagePrivate2((page))
|
||||
#define TestSetPageFsCache(page) TestSetPagePrivate2((page))
|
||||
#define TestClearPageFsCache(page) TestClearPagePrivate2((page))
|
||||
|
||||
/* pattern used to fill dead space in an index entry */
|
||||
#define FSCACHE_INDEX_DEADFILL_PATTERN 0x79
|
||||
|
||||
|
|
@ -46,6 +37,7 @@ struct pagevec;
|
|||
struct fscache_cache_tag;
|
||||
struct fscache_cookie;
|
||||
struct fscache_netfs;
|
||||
struct netfs_read_request;
|
||||
|
||||
typedef void (*fscache_rw_complete_t)(struct page *page,
|
||||
void *context,
|
||||
|
|
@ -200,6 +192,10 @@ extern void __fscache_update_cookie(struct fscache_cookie *, const void *);
|
|||
extern int __fscache_attr_changed(struct fscache_cookie *);
|
||||
extern void __fscache_invalidate(struct fscache_cookie *);
|
||||
extern void __fscache_wait_on_invalidate(struct fscache_cookie *);
|
||||
|
||||
#ifdef FSCACHE_USE_NEW_IO_API
|
||||
extern int __fscache_begin_read_operation(struct netfs_read_request *, struct fscache_cookie *);
|
||||
#else
|
||||
extern int __fscache_read_or_alloc_page(struct fscache_cookie *,
|
||||
struct page *,
|
||||
fscache_rw_complete_t,
|
||||
|
|
@ -223,6 +219,8 @@ extern void __fscache_uncache_all_inode_pages(struct fscache_cookie *,
|
|||
struct inode *);
|
||||
extern void __fscache_readpages_cancel(struct fscache_cookie *cookie,
|
||||
struct list_head *pages);
|
||||
#endif /* FSCACHE_USE_NEW_IO_API */
|
||||
|
||||
extern void __fscache_disable_cookie(struct fscache_cookie *, const void *, bool);
|
||||
extern void __fscache_enable_cookie(struct fscache_cookie *, const void *, loff_t,
|
||||
bool (*)(void *), void *);
|
||||
|
|
@ -507,6 +505,36 @@ int fscache_reserve_space(struct fscache_cookie *cookie, loff_t size)
|
|||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
#ifdef FSCACHE_USE_NEW_IO_API
|
||||
|
||||
/**
|
||||
* fscache_begin_read_operation - Begin a read operation for the netfs lib
|
||||
* @rreq: The read request being undertaken
|
||||
* @cookie: The cookie representing the cache object
|
||||
*
|
||||
* Begin a read operation on behalf of the netfs helper library. @rreq
|
||||
* indicates the read request to which the operation state should be attached;
|
||||
* @cookie indicates the cache object that will be accessed.
|
||||
*
|
||||
* This is intended to be called from the ->begin_cache_operation() netfs lib
|
||||
* operation as implemented by the network filesystem.
|
||||
*
|
||||
* Returns:
|
||||
* * 0 - Success
|
||||
* * -ENOBUFS - No caching available
|
||||
* * Other error code from the cache, such as -ENOMEM.
|
||||
*/
|
||||
static inline
|
||||
int fscache_begin_read_operation(struct netfs_read_request *rreq,
|
||||
struct fscache_cookie *cookie)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
return __fscache_begin_read_operation(rreq, cookie);
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
#else /* FSCACHE_USE_NEW_IO_API */
|
||||
|
||||
/**
|
||||
* fscache_read_or_alloc_page - Read a page from the cache or allocate a block
|
||||
* in which to store it
|
||||
|
|
@ -786,6 +814,8 @@ void fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
|
|||
__fscache_uncache_all_inode_pages(cookie, inode);
|
||||
}
|
||||
|
||||
#endif /* FSCACHE_USE_NEW_IO_API */
|
||||
|
||||
/**
|
||||
* fscache_disable_cookie - Disable a cookie
|
||||
* @cookie: The cookie representing the cache object
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/**
|
||||
/*
|
||||
* Freecale 85xx and 86xx Global Utilties register set
|
||||
*
|
||||
* Authors: Jeff Brown
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
/**
|
||||
/*
|
||||
* Global Utility Registers.
|
||||
*
|
||||
* Not all registers defined in this structure are available on all chips, so
|
||||
|
|
|
|||
|
|
@ -167,7 +167,6 @@ struct fsnotify_ops {
|
|||
*/
|
||||
struct fsnotify_event {
|
||||
struct list_head list;
|
||||
unsigned long objectid; /* identifier for queue merges */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -207,9 +206,6 @@ struct fsnotify_group {
|
|||
|
||||
/* stores all fastpath marks assoc with this group so they can be cleaned on unregister */
|
||||
struct mutex mark_mutex; /* protect marks_list */
|
||||
atomic_t num_marks; /* 1 for each mark and 1 for not being
|
||||
* past the point of no return when freeing
|
||||
* a group */
|
||||
atomic_t user_waits; /* Number of tasks waiting for user
|
||||
* response */
|
||||
struct list_head marks_list; /* all inode marks for this group */
|
||||
|
|
@ -234,13 +230,14 @@ struct fsnotify_group {
|
|||
#endif
|
||||
#ifdef CONFIG_FANOTIFY
|
||||
struct fanotify_group_private_data {
|
||||
/* Hash table of events for merge */
|
||||
struct hlist_head *merge_hash;
|
||||
/* allows a group to block waiting for a userspace response */
|
||||
struct list_head access_list;
|
||||
wait_queue_head_t access_waitq;
|
||||
int flags; /* flags from fanotify_init() */
|
||||
int f_flags; /* event_f_flags from fanotify_init() */
|
||||
unsigned int max_marks;
|
||||
struct user_struct *user;
|
||||
struct ucounts *ucounts;
|
||||
} fanotify_data;
|
||||
#endif /* CONFIG_FANOTIFY */
|
||||
};
|
||||
|
|
@ -487,15 +484,23 @@ extern void fsnotify_destroy_event(struct fsnotify_group *group,
|
|||
/* attach the event to the group notification queue */
|
||||
extern int fsnotify_add_event(struct fsnotify_group *group,
|
||||
struct fsnotify_event *event,
|
||||
int (*merge)(struct list_head *,
|
||||
struct fsnotify_event *));
|
||||
int (*merge)(struct fsnotify_group *,
|
||||
struct fsnotify_event *),
|
||||
void (*insert)(struct fsnotify_group *,
|
||||
struct fsnotify_event *));
|
||||
/* Queue overflow event to a notification group */
|
||||
static inline void fsnotify_queue_overflow(struct fsnotify_group *group)
|
||||
{
|
||||
fsnotify_add_event(group, group->overflow_event, NULL);
|
||||
fsnotify_add_event(group, group->overflow_event, NULL, NULL);
|
||||
}
|
||||
|
||||
static inline bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group)
|
||||
{
|
||||
assert_spin_locked(&group->notification_lock);
|
||||
|
||||
return list_empty(&group->notification_list);
|
||||
}
|
||||
|
||||
/* true if the group notification queue is empty */
|
||||
extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group);
|
||||
/* return, but do not dequeue the first event on the notification queue */
|
||||
extern struct fsnotify_event *fsnotify_peek_first_event(struct fsnotify_group *group);
|
||||
|
|
@ -576,11 +581,9 @@ extern void fsnotify_put_mark(struct fsnotify_mark *mark);
|
|||
extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info);
|
||||
extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info);
|
||||
|
||||
static inline void fsnotify_init_event(struct fsnotify_event *event,
|
||||
unsigned long objectid)
|
||||
static inline void fsnotify_init_event(struct fsnotify_event *event)
|
||||
{
|
||||
INIT_LIST_HEAD(&event->list);
|
||||
event->objectid = objectid;
|
||||
}
|
||||
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
/*
|
||||
* If the arch's mcount caller does not support all of ftrace's
|
||||
* features, then it must call an indirect function that
|
||||
* does. Or at least does enough to prevent any unwelcomed side effects.
|
||||
* does. Or at least does enough to prevent any unwelcome side effects.
|
||||
*/
|
||||
#if !ARCH_SUPPORTS_FTRACE_OPS
|
||||
# define FTRACE_FORCE_LIST_FUNC 1
|
||||
|
|
@ -389,7 +389,7 @@ DECLARE_PER_CPU(int, disable_stack_tracer);
|
|||
*/
|
||||
static inline void stack_tracer_disable(void)
|
||||
{
|
||||
/* Preemption or interupts must be disabled */
|
||||
/* Preemption or interrupts must be disabled */
|
||||
if (IS_ENABLED(CONFIG_DEBUG_PREEMPT))
|
||||
WARN_ON_ONCE(!preempt_count() || !irqs_disabled());
|
||||
this_cpu_inc(disable_stack_tracer);
|
||||
|
|
|
|||
|
|
@ -187,5 +187,6 @@ extern u32 fw_devlink_get_flags(void);
|
|||
extern bool fw_devlink_is_strict(void);
|
||||
int fwnode_link_add(struct fwnode_handle *con, struct fwnode_handle *sup);
|
||||
void fwnode_links_purge(struct fwnode_handle *fwnode);
|
||||
void fw_devlink_purge_absent_suppliers(struct fwnode_handle *fwnode);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -204,25 +204,6 @@ static inline dev_t disk_devt(struct gendisk *disk)
|
|||
|
||||
void disk_uevent(struct gendisk *disk, enum kobject_action action);
|
||||
|
||||
/*
|
||||
* Smarter partition iterator without context limits.
|
||||
*/
|
||||
#define DISK_PITER_INCL_EMPTY (1 << 1) /* include 0-sized parts */
|
||||
#define DISK_PITER_INCL_PART0 (1 << 2) /* include partition 0 */
|
||||
#define DISK_PITER_INCL_EMPTY_PART0 (1 << 3) /* include empty partition 0 */
|
||||
|
||||
struct disk_part_iter {
|
||||
struct gendisk *disk;
|
||||
struct block_device *part;
|
||||
unsigned long idx;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
extern void disk_part_iter_init(struct disk_part_iter *piter,
|
||||
struct gendisk *disk, unsigned int flags);
|
||||
struct block_device *disk_part_iter_next(struct disk_part_iter *piter);
|
||||
extern void disk_part_iter_exit(struct disk_part_iter *piter);
|
||||
|
||||
/* block/genhd.c */
|
||||
extern void device_add_disk(struct device *parent, struct gendisk *disk,
|
||||
const struct attribute_group **groups);
|
||||
|
|
@ -273,7 +254,7 @@ static inline sector_t get_capacity(struct gendisk *disk)
|
|||
|
||||
int bdev_disk_changed(struct block_device *bdev, bool invalidate);
|
||||
int blk_add_partitions(struct gendisk *disk, struct block_device *bdev);
|
||||
int blk_drop_partitions(struct block_device *bdev);
|
||||
void blk_drop_partitions(struct gendisk *disk);
|
||||
|
||||
extern struct gendisk *__alloc_disk_node(int minors, int node_id);
|
||||
extern void put_disk(struct gendisk *disk);
|
||||
|
|
|
|||
|
|
@ -404,4 +404,3 @@ s_fields \
|
|||
|
||||
/* }}}1 */
|
||||
#endif /* GENL_MAGIC_FUNC_H */
|
||||
/* vim: set foldmethod=marker foldlevel=1 nofoldenable : */
|
||||
|
|
|
|||
|
|
@ -283,4 +283,3 @@ enum { \
|
|||
|
||||
/* }}}1 */
|
||||
#endif /* GENL_MAGIC_STRUCT_H */
|
||||
/* vim: set foldmethod=marker nofoldenable : */
|
||||
|
|
|
|||
|
|
@ -490,7 +490,7 @@ static inline int gfp_zonelist(gfp_t flags)
|
|||
|
||||
/*
|
||||
* We get the zone list from the current node and the gfp_mask.
|
||||
* This zone list contains a maximum of MAXNODES*MAX_NR_ZONES zones.
|
||||
* This zone list contains a maximum of MAX_NUMNODES*MAX_NR_ZONES zones.
|
||||
* There are two zonelists per node, one for all zones with memory and
|
||||
* one containing just zones from the node the zonelist belongs to.
|
||||
*
|
||||
|
|
@ -515,14 +515,25 @@ static inline int arch_make_page_accessible(struct page *page)
|
|||
}
|
||||
#endif
|
||||
|
||||
struct page *
|
||||
__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid,
|
||||
nodemask_t *nodemask);
|
||||
struct page *__alloc_pages(gfp_t gfp, unsigned int order, int preferred_nid,
|
||||
nodemask_t *nodemask);
|
||||
|
||||
static inline struct page *
|
||||
__alloc_pages(gfp_t gfp_mask, unsigned int order, int preferred_nid)
|
||||
unsigned long __alloc_pages_bulk(gfp_t gfp, int preferred_nid,
|
||||
nodemask_t *nodemask, int nr_pages,
|
||||
struct list_head *page_list,
|
||||
struct page **page_array);
|
||||
|
||||
/* Bulk allocate order-0 pages */
|
||||
static inline unsigned long
|
||||
alloc_pages_bulk_list(gfp_t gfp, unsigned long nr_pages, struct list_head *list)
|
||||
{
|
||||
return __alloc_pages_nodemask(gfp_mask, order, preferred_nid, NULL);
|
||||
return __alloc_pages_bulk(gfp, numa_mem_id(), NULL, nr_pages, list, NULL);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
alloc_pages_bulk_array(gfp_t gfp, unsigned long nr_pages, struct page **page_array)
|
||||
{
|
||||
return __alloc_pages_bulk(gfp, numa_mem_id(), NULL, nr_pages, NULL, page_array);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -535,7 +546,7 @@ __alloc_pages_node(int nid, gfp_t gfp_mask, unsigned int order)
|
|||
VM_BUG_ON(nid < 0 || nid >= MAX_NUMNODES);
|
||||
VM_WARN_ON((gfp_mask & __GFP_THISNODE) && !node_online(nid));
|
||||
|
||||
return __alloc_pages(gfp_mask, order, nid);
|
||||
return __alloc_pages(gfp_mask, order, nid, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -553,13 +564,7 @@ static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,
|
|||
}
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
extern struct page *alloc_pages_current(gfp_t gfp_mask, unsigned order);
|
||||
|
||||
static inline struct page *
|
||||
alloc_pages(gfp_t gfp_mask, unsigned int order)
|
||||
{
|
||||
return alloc_pages_current(gfp_mask, order);
|
||||
}
|
||||
struct page *alloc_pages(gfp_t gfp, unsigned int order);
|
||||
extern struct page *alloc_pages_vma(gfp_t gfp_mask, int order,
|
||||
struct vm_area_struct *vma, unsigned long addr,
|
||||
int node, bool hugepage);
|
||||
|
|
@ -652,7 +657,7 @@ extern int alloc_contig_range(unsigned long start, unsigned long end,
|
|||
extern struct page *alloc_contig_pages(unsigned long nr_pages, gfp_t gfp_mask,
|
||||
int nid, nodemask_t *nodemask);
|
||||
#endif
|
||||
void free_contig_range(unsigned long pfn, unsigned int nr_pages);
|
||||
void free_contig_range(unsigned long pfn, unsigned long nr_pages);
|
||||
|
||||
#ifdef CONFIG_CMA
|
||||
/* CMA stuff */
|
||||
|
|
|
|||
|
|
@ -674,6 +674,8 @@ struct acpi_gpio_mapping {
|
|||
* get GpioIo type explicitly, this quirk may be used.
|
||||
*/
|
||||
#define ACPI_GPIO_QUIRK_ONLY_GPIOIO BIT(1)
|
||||
/* Use given pin as an absolute GPIO number in the system */
|
||||
#define ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER BIT(2)
|
||||
|
||||
unsigned int quirks;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@ struct gpio_irq_chip {
|
|||
/**
|
||||
* @valid_mask:
|
||||
*
|
||||
* If not %NULL holds bitmask of GPIOs which are valid to be included
|
||||
* If not %NULL, holds bitmask of GPIOs which are valid to be included
|
||||
* in IRQ domain of the chip.
|
||||
*/
|
||||
unsigned long *valid_mask;
|
||||
|
|
@ -346,7 +346,7 @@ struct gpio_irq_chip {
|
|||
* output.
|
||||
*
|
||||
* A gpio_chip can help platforms abstract various sources of GPIOs so
|
||||
* they can all be accessed through a common programing interface.
|
||||
* they can all be accessed through a common programming interface.
|
||||
* Example sources would be SOC controllers, FPGAs, multifunction
|
||||
* chips, dedicated GPIO expanders, and so on.
|
||||
*
|
||||
|
|
@ -435,15 +435,15 @@ struct gpio_chip {
|
|||
/**
|
||||
* @valid_mask:
|
||||
*
|
||||
* If not %NULL holds bitmask of GPIOs which are valid to be used
|
||||
* If not %NULL, holds bitmask of GPIOs which are valid to be used
|
||||
* from the chip.
|
||||
*/
|
||||
unsigned long *valid_mask;
|
||||
|
||||
#if defined(CONFIG_OF_GPIO)
|
||||
/*
|
||||
* If CONFIG_OF is enabled, then all GPIO controllers described in the
|
||||
* device tree automatically may have an OF translation
|
||||
* If CONFIG_OF_GPIO is enabled, then all GPIO controllers described in
|
||||
* the device tree automatically may have an OF translation
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
@ -508,7 +508,7 @@ extern int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
|
|||
* for GPIOs will fail rudely.
|
||||
*
|
||||
* gpiochip_add_data() must only be called after gpiolib initialization,
|
||||
* ie after core_initcall().
|
||||
* i.e. after core_initcall().
|
||||
*
|
||||
* If gc->base is negative, this requests dynamic assignment of
|
||||
* a range of valid GPIOs.
|
||||
|
|
@ -624,8 +624,17 @@ void gpiochip_irq_domain_deactivate(struct irq_domain *domain,
|
|||
bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gc,
|
||||
unsigned int offset);
|
||||
|
||||
#ifdef CONFIG_GPIOLIB_IRQCHIP
|
||||
int gpiochip_irqchip_add_domain(struct gpio_chip *gc,
|
||||
struct irq_domain *domain);
|
||||
#else
|
||||
static inline int gpiochip_irqchip_add_domain(struct gpio_chip *gc,
|
||||
struct irq_domain *domain)
|
||||
{
|
||||
WARN_ON(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
int gpiochip_generic_request(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_generic_free(struct gpio_chip *gc, unsigned int offset);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#define _LINUX_GPIO_REGMAP_H
|
||||
|
||||
struct device;
|
||||
struct fwnode_handle;
|
||||
struct gpio_regmap;
|
||||
struct irq_domain;
|
||||
struct regmap;
|
||||
|
|
@ -16,6 +17,8 @@ struct regmap;
|
|||
* @parent: The parent device
|
||||
* @regmap: The regmap used to access the registers
|
||||
* given, the name of the device is used
|
||||
* @fwnode: (Optional) The firmware node.
|
||||
* If not given, the fwnode of the parent is used.
|
||||
* @label: (Optional) Descriptive name for GPIO controller.
|
||||
* If not given, the name of the device is used.
|
||||
* @ngpio: Number of GPIOs
|
||||
|
|
@ -57,6 +60,7 @@ struct regmap;
|
|||
struct gpio_regmap_config {
|
||||
struct device *parent;
|
||||
struct regmap *regmap;
|
||||
struct fwnode_handle *fwnode;
|
||||
|
||||
const char *label;
|
||||
int ngpio;
|
||||
|
|
|
|||
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