Merge cdd86fb75f
("net/mlx5: Added cond_resched() to crdump collection") into android12-5.10-lts
Steps on the way to 5.10.227 Change-Id: I780b041f7c72ac3204110981ba8c0ce36764d971 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
6136b834d6
1
.gitignore
vendored
1
.gitignore
vendored
@ -125,7 +125,6 @@ GTAGS
|
||||
# id-utils files
|
||||
ID
|
||||
|
||||
*.orig
|
||||
*~
|
||||
\#*#
|
||||
|
||||
|
@ -25,12 +25,12 @@ chosen {
|
||||
backlight: edp-backlight {
|
||||
compatible = "pwm-backlight";
|
||||
power-supply = <&vcc_12v>;
|
||||
pwms = <&pwm0 0 740740 0>;
|
||||
pwms = <&pwm0 0 125000 0>;
|
||||
};
|
||||
|
||||
bat: battery {
|
||||
compatible = "simple-battery";
|
||||
charge-full-design-microamp-hours = <9800000>;
|
||||
charge-full-design-microamp-hours = <10000000>;
|
||||
voltage-max-design-microvolt = <4350000>;
|
||||
voltage-min-design-microvolt = <3000000>;
|
||||
};
|
||||
|
@ -1586,6 +1586,7 @@ static void pt_event_stop(struct perf_event *event, int mode)
|
||||
* see comment in intel_pt_interrupt().
|
||||
*/
|
||||
WRITE_ONCE(pt->handle_nmi, 0);
|
||||
barrier();
|
||||
|
||||
pt_config_stop(event);
|
||||
|
||||
@ -1637,11 +1638,10 @@ static long pt_event_snapshot_aux(struct perf_event *event,
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Here, handle_nmi tells us if the tracing is on
|
||||
* There is no PT interrupt in this mode, so stop the trace and it will
|
||||
* remain stopped while the buffer is copied.
|
||||
*/
|
||||
if (READ_ONCE(pt->handle_nmi))
|
||||
pt_config_stop(event);
|
||||
|
||||
pt_config_stop(event);
|
||||
pt_read_offset(buf);
|
||||
pt_update_head(pt);
|
||||
|
||||
@ -1653,11 +1653,10 @@ static long pt_event_snapshot_aux(struct perf_event *event,
|
||||
ret = perf_output_copy_aux(&pt->handle, handle, from, to);
|
||||
|
||||
/*
|
||||
* If the tracing was on when we turned up, restart it.
|
||||
* Compiler barrier not needed as we couldn't have been
|
||||
* preempted by anything that touches pt->handle_nmi.
|
||||
* Here, handle_nmi tells us if the tracing was on.
|
||||
* If the tracing was on, restart it.
|
||||
*/
|
||||
if (pt->handle_nmi)
|
||||
if (READ_ONCE(pt->handle_nmi))
|
||||
pt_config_start(event);
|
||||
|
||||
return ret;
|
||||
|
@ -263,21 +263,17 @@ static void __init probe_page_size_mask(void)
|
||||
}
|
||||
}
|
||||
|
||||
#define INTEL_MATCH(_model) { .vendor = X86_VENDOR_INTEL, \
|
||||
.family = 6, \
|
||||
.model = _model, \
|
||||
}
|
||||
/*
|
||||
* INVLPG may not properly flush Global entries
|
||||
* on these CPUs when PCIDs are enabled.
|
||||
*/
|
||||
static const struct x86_cpu_id invlpg_miss_ids[] = {
|
||||
INTEL_MATCH(INTEL_FAM6_ALDERLAKE ),
|
||||
INTEL_MATCH(INTEL_FAM6_ALDERLAKE_L ),
|
||||
INTEL_MATCH(INTEL_FAM6_ALDERLAKE_N ),
|
||||
INTEL_MATCH(INTEL_FAM6_RAPTORLAKE ),
|
||||
INTEL_MATCH(INTEL_FAM6_RAPTORLAKE_P),
|
||||
INTEL_MATCH(INTEL_FAM6_RAPTORLAKE_S),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE, 0),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE_L, 0),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE_N, 0),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE, 0),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_P, 0),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_S, 0),
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -533,8 +533,9 @@ int acpi_device_setup_files(struct acpi_device *dev)
|
||||
* If device has _STR, 'description' file is created
|
||||
*/
|
||||
if (acpi_has_method(dev->handle, "_STR")) {
|
||||
status = acpi_evaluate_object(dev->handle, "_STR",
|
||||
NULL, &buffer);
|
||||
status = acpi_evaluate_object_typed(dev->handle, "_STR",
|
||||
NULL, &buffer,
|
||||
ACPI_TYPE_BUFFER);
|
||||
if (ACPI_FAILURE(status))
|
||||
buffer.pointer = NULL;
|
||||
dev->pnp.str_obj = buffer.pointer;
|
||||
|
@ -455,6 +455,12 @@ static const struct dmi_system_id asus_laptop[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1402CVA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* TongFang GMxXGxX/TUXEDO Polaris 15 Gen5 AMD */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GMxXGxX"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* TongFang GMxXGxx sold as Eluktronics Inc. RP-15 */
|
||||
.matches = {
|
||||
|
@ -787,6 +787,26 @@ static void fw_abort_batch_reqs(struct firmware *fw)
|
||||
mutex_unlock(&fw_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reject firmware file names with ".." path components.
|
||||
* There are drivers that construct firmware file names from device-supplied
|
||||
* strings, and we don't want some device to be able to tell us "I would like to
|
||||
* be sent my firmware from ../../../etc/shadow, please".
|
||||
*
|
||||
* Search for ".." surrounded by either '/' or start/end of string.
|
||||
*
|
||||
* This intentionally only looks at the firmware name, not at the firmware base
|
||||
* directory or at symlink contents.
|
||||
*/
|
||||
static bool name_contains_dotdot(const char *name)
|
||||
{
|
||||
size_t name_len = strlen(name);
|
||||
|
||||
return strcmp(name, "..") == 0 || strncmp(name, "../", 3) == 0 ||
|
||||
strstr(name, "/../") != NULL ||
|
||||
(name_len >= 3 && strcmp(name+name_len-3, "/..") == 0);
|
||||
}
|
||||
|
||||
/* called from request_firmware() and request_firmware_work_func() */
|
||||
static int
|
||||
_request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
@ -805,6 +825,14 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (name_contains_dotdot(name)) {
|
||||
dev_warn(device,
|
||||
"Firmware load for '%s' refused, path contains '..' component\n",
|
||||
name);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = _request_firmware_prepare(&fw, name, device, buf, size,
|
||||
offset, opt_flags);
|
||||
if (ret <= 0) /* error or already assigned */
|
||||
@ -860,6 +888,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
* @name will be used as $FIRMWARE in the uevent environment and
|
||||
* should be distinctive enough not to be confused with any other
|
||||
* firmware image for this or any other device.
|
||||
* It must not contain any ".." path components - "foo/bar..bin" is
|
||||
* allowed, but "foo/../bar.bin" is not.
|
||||
*
|
||||
* Caller must hold the reference count of @device.
|
||||
*
|
||||
|
@ -3429,10 +3429,12 @@ void drbd_uuid_new_current(struct drbd_device *device) __must_hold(local)
|
||||
void drbd_uuid_set_bm(struct drbd_device *device, u64 val) __must_hold(local)
|
||||
{
|
||||
unsigned long flags;
|
||||
if (device->ldev->md.uuid[UI_BITMAP] == 0 && val == 0)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&device->ldev->md.uuid_lock, flags);
|
||||
if (device->ldev->md.uuid[UI_BITMAP] == 0 && val == 0) {
|
||||
spin_unlock_irqrestore(&device->ldev->md.uuid_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
if (val == 0) {
|
||||
drbd_uuid_move_history(device);
|
||||
device->ldev->md.uuid[UI_HISTORY_START] = device->ldev->md.uuid[UI_BITMAP];
|
||||
|
@ -876,7 +876,7 @@ is_valid_state(struct drbd_device *device, union drbd_state ns)
|
||||
ns.disk == D_OUTDATED)
|
||||
rv = SS_CONNECTED_OUTDATES;
|
||||
|
||||
else if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) &&
|
||||
else if (nc && (ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) &&
|
||||
(nc->verify_alg[0] == 0))
|
||||
rv = SS_NO_VERIFY_ALG;
|
||||
|
||||
|
@ -84,6 +84,7 @@ static int integrator_ap_lm_probe(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
}
|
||||
map = syscon_node_to_regmap(syscon);
|
||||
of_node_put(syscon);
|
||||
if (IS_ERR(map)) {
|
||||
dev_err(dev,
|
||||
"could not find Integrator/AP system controller\n");
|
||||
|
@ -679,6 +679,7 @@ static int __maybe_unused cctrng_resume(struct device *dev)
|
||||
/* wait for Cryptocell reset completion */
|
||||
if (!cctrng_wait_for_reset_completion(drvdata)) {
|
||||
dev_err(dev, "Cryptocell reset not completed");
|
||||
clk_disable_unprepare(drvdata->clk);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
@ -142,7 +142,7 @@ static int mtk_rng_probe(struct platform_device *pdev)
|
||||
dev_set_drvdata(&pdev->dev, priv);
|
||||
pm_runtime_set_autosuspend_delay(&pdev->dev, RNG_AUTOSUSPEND_TIMEOUT);
|
||||
pm_runtime_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
devm_pm_runtime_enable(&pdev->dev);
|
||||
|
||||
dev_info(&pdev->dev, "registered RNG driver\n");
|
||||
|
||||
|
@ -1129,6 +1129,8 @@ void sev_pci_init(void)
|
||||
return;
|
||||
|
||||
err:
|
||||
sev_dev_destroy(psp_master);
|
||||
|
||||
psp_master->sev_data = NULL;
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@ void efi_retrieve_tpm2_eventlog(void)
|
||||
}
|
||||
|
||||
/* Allocate space for the logs and copy them. */
|
||||
status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
|
||||
status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
|
||||
sizeof(*log_tbl) + log_size, (void **)&log_tbl);
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
|
@ -201,7 +201,7 @@ static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnecto
|
||||
aconnector->dsc_aux = &aconnector->mst_port->dm_dp_aux.aux;
|
||||
|
||||
/* synaptics cascaded MST hub case */
|
||||
if (!aconnector->dsc_aux && is_synaptics_cascaded_panamera(aconnector->dc_link, port))
|
||||
if (is_synaptics_cascaded_panamera(aconnector->dc_link, port))
|
||||
aconnector->dsc_aux = port->mgr->aux;
|
||||
|
||||
if (!aconnector->dsc_aux)
|
||||
|
@ -131,7 +131,7 @@ static unsigned int calc_v_total_from_refresh(
|
||||
|
||||
v_total = div64_u64(div64_u64(((unsigned long long)(
|
||||
frame_duration_in_ns) * (stream->timing.pix_clk_100hz / 10)),
|
||||
stream->timing.h_total), 1000000);
|
||||
stream->timing.h_total) + 500000, 1000000);
|
||||
|
||||
/* v_total cannot be less than nominal */
|
||||
if (v_total < stream->timing.v_total) {
|
||||
|
@ -172,6 +172,13 @@ struct aspeed_i2c_bus {
|
||||
|
||||
static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus);
|
||||
|
||||
/* precondition: bus.lock has been acquired. */
|
||||
static void aspeed_i2c_do_stop(struct aspeed_i2c_bus *bus)
|
||||
{
|
||||
bus->master_state = ASPEED_I2C_MASTER_STOP;
|
||||
writel(ASPEED_I2CD_M_STOP_CMD, bus->base + ASPEED_I2C_CMD_REG);
|
||||
}
|
||||
|
||||
static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus)
|
||||
{
|
||||
unsigned long time_left, flags;
|
||||
@ -189,7 +196,7 @@ static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus)
|
||||
command);
|
||||
|
||||
reinit_completion(&bus->cmd_complete);
|
||||
writel(ASPEED_I2CD_M_STOP_CMD, bus->base + ASPEED_I2C_CMD_REG);
|
||||
aspeed_i2c_do_stop(bus);
|
||||
spin_unlock_irqrestore(&bus->lock, flags);
|
||||
|
||||
time_left = wait_for_completion_timeout(
|
||||
@ -385,13 +392,6 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus)
|
||||
writel(command, bus->base + ASPEED_I2C_CMD_REG);
|
||||
}
|
||||
|
||||
/* precondition: bus.lock has been acquired. */
|
||||
static void aspeed_i2c_do_stop(struct aspeed_i2c_bus *bus)
|
||||
{
|
||||
bus->master_state = ASPEED_I2C_MASTER_STOP;
|
||||
writel(ASPEED_I2CD_M_STOP_CMD, bus->base + ASPEED_I2C_CMD_REG);
|
||||
}
|
||||
|
||||
/* precondition: bus.lock has been acquired. */
|
||||
static void aspeed_i2c_next_msg_or_stop(struct aspeed_i2c_bus *bus)
|
||||
{
|
||||
|
@ -99,8 +99,7 @@ static int sch_transaction(void)
|
||||
if (retries > MAX_RETRIES) {
|
||||
dev_err(&sch_adapter.dev, "SMBus Timeout!\n");
|
||||
result = -ETIMEDOUT;
|
||||
}
|
||||
if (temp & 0x04) {
|
||||
} else if (temp & 0x04) {
|
||||
result = -EIO;
|
||||
dev_dbg(&sch_adapter.dev, "Bus collision! SMBus may be "
|
||||
"locked until next hard reset. (sorry!)\n");
|
||||
|
@ -1118,6 +1118,43 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
|
||||
},
|
||||
/*
|
||||
* Some TongFang barebones have touchpad and/or keyboard issues after
|
||||
* suspend fixable with nomux + reset + noloop + nopnp. Luckily, none of
|
||||
* them have an external PS/2 port so this can safely be set for all of
|
||||
* them.
|
||||
* TongFang barebones come with board_vendor and/or system_vendor set to
|
||||
* a different value for each individual reseller. The only somewhat
|
||||
* universal way to identify them is by board_name.
|
||||
*/
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GM6XGxX"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GMxXGxx"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GMxXGxX"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
/*
|
||||
* A lot of modern Clevo barebones have touchpad and/or keyboard issues
|
||||
* after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_data/x86/soc.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/acpi.h>
|
||||
@ -718,21 +719,6 @@ static int goodix_reset(struct goodix_ts_data *ts)
|
||||
}
|
||||
|
||||
#ifdef ACPI_GPIO_SUPPORT
|
||||
#include <asm/cpu_device_id.h>
|
||||
#include <asm/intel-family.h>
|
||||
|
||||
static const struct x86_cpu_id baytrail_cpu_ids[] = {
|
||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_SILVERMONT, X86_FEATURE_ANY, },
|
||||
{}
|
||||
};
|
||||
|
||||
static inline bool is_byt(void)
|
||||
{
|
||||
const struct x86_cpu_id *id = x86_match_cpu(baytrail_cpu_ids);
|
||||
|
||||
return !!id;
|
||||
}
|
||||
|
||||
static const struct acpi_gpio_params first_gpio = { 0, 0, false };
|
||||
static const struct acpi_gpio_params second_gpio = { 1, 0, false };
|
||||
|
||||
@ -816,7 +802,7 @@ static int goodix_add_acpi_gpio_mappings(struct goodix_ts_data *ts)
|
||||
dev_info(dev, "Using ACPI INTI and INTO methods for IRQ pin access\n");
|
||||
ts->irq_pin_access_method = IRQ_PIN_ACCESS_ACPI_METHOD;
|
||||
gpio_mapping = acpi_goodix_reset_only_gpios;
|
||||
} else if (is_byt() && ts->gpio_count == 2 && ts->gpio_int_idx == -1) {
|
||||
} else if (soc_intel_is_byt() && ts->gpio_count == 2 && ts->gpio_int_idx == -1) {
|
||||
dev_info(dev, "No ACPI GpioInt resource, assuming that the GPIO order is reset, int\n");
|
||||
ts->irq_pin_access_method = IRQ_PIN_ACCESS_ACPI_GPIO;
|
||||
gpio_mapping = acpi_goodix_int_last_gpios;
|
||||
|
@ -146,7 +146,8 @@ static int bcm2835_mbox_probe(struct platform_device *pdev)
|
||||
spin_lock_init(&mbox->lock);
|
||||
|
||||
ret = devm_request_irq(dev, irq_of_parse_and_map(dev->of_node, 0),
|
||||
bcm2835_mbox_irq, 0, dev_name(dev), mbox);
|
||||
bcm2835_mbox_irq, IRQF_NO_SUSPEND, dev_name(dev),
|
||||
mbox);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register a mailbox IRQ handler: %d\n",
|
||||
ret);
|
||||
|
@ -159,7 +159,7 @@ static const struct of_device_id rockchip_mbox_of_match[] = {
|
||||
{ .compatible = "rockchip,rk3368-mailbox", .data = &rk3368_drv_data},
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, rockchp_mbox_of_match);
|
||||
MODULE_DEVICE_TABLE(of, rockchip_mbox_of_match);
|
||||
|
||||
static int rockchip_mbox_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
@ -601,7 +601,6 @@ mlx5e_sq_xmit_mpwqe(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
return;
|
||||
|
||||
err_unmap:
|
||||
mlx5e_dma_unmap_wqe_err(sq, 1);
|
||||
sq->stats->dropped++;
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
|
@ -24,6 +24,11 @@
|
||||
pci_write_config_dword((dev)->pdev, (dev)->vsc_addr + (offset), (val))
|
||||
#define VSC_MAX_RETRIES 2048
|
||||
|
||||
/* Reading VSC registers can take relatively long time.
|
||||
* Yield the cpu every 128 registers read.
|
||||
*/
|
||||
#define VSC_GW_READ_BLOCK_COUNT 128
|
||||
|
||||
enum {
|
||||
VSC_CTRL_OFFSET = 0x4,
|
||||
VSC_COUNTER_OFFSET = 0x8,
|
||||
@ -269,6 +274,7 @@ int mlx5_vsc_gw_read_block_fast(struct mlx5_core_dev *dev, u32 *data,
|
||||
{
|
||||
unsigned int next_read_addr = 0;
|
||||
unsigned int read_addr = 0;
|
||||
unsigned int count = 0;
|
||||
|
||||
while (read_addr < length) {
|
||||
if (mlx5_vsc_gw_read_fast(dev, read_addr, &next_read_addr,
|
||||
@ -276,6 +282,10 @@ int mlx5_vsc_gw_read_block_fast(struct mlx5_core_dev *dev, u32 *data,
|
||||
return read_addr;
|
||||
|
||||
read_addr = next_read_addr;
|
||||
if (++count == VSC_GW_READ_BLOCK_COUNT) {
|
||||
cond_resched();
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
@ -108,6 +108,7 @@ config IEEE802154_CA8210_DEBUGFS
|
||||
|
||||
config IEEE802154_MCR20A
|
||||
tristate "MCR20A transceiver driver"
|
||||
select REGMAP_SPI
|
||||
depends on IEEE802154_DRIVERS && MAC802154
|
||||
depends on SPI
|
||||
help
|
||||
|
@ -1813,12 +1813,14 @@ static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
else
|
||||
rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
|
||||
|
||||
if (rxsc >= 9 && rxsc <= 12)
|
||||
bw = RTW_CHANNEL_WIDTH_40;
|
||||
else if (rxsc >= 13)
|
||||
bw = RTW_CHANNEL_WIDTH_80;
|
||||
else
|
||||
if (rxsc == 0)
|
||||
bw = rtwdev->hal.current_band_width;
|
||||
else if (rxsc >= 1 && rxsc <= 8)
|
||||
bw = RTW_CHANNEL_WIDTH_20;
|
||||
else if (rxsc >= 9 && rxsc <= 12)
|
||||
bw = RTW_CHANNEL_WIDTH_40;
|
||||
else
|
||||
bw = RTW_CHANNEL_WIDTH_80;
|
||||
|
||||
pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
|
||||
pkt_stat->rx_power[RF_PATH_B] = GET_PHY_STAT_P1_PWDB_B(phy_status) - 110;
|
||||
|
@ -381,14 +381,12 @@ static void nwl_pcie_msi_handler_low(struct irq_desc *desc)
|
||||
|
||||
static void nwl_mask_leg_irq(struct irq_data *data)
|
||||
{
|
||||
struct irq_desc *desc = irq_to_desc(data->irq);
|
||||
struct nwl_pcie *pcie;
|
||||
struct nwl_pcie *pcie = irq_data_get_irq_chip_data(data);
|
||||
unsigned long flags;
|
||||
u32 mask;
|
||||
u32 val;
|
||||
|
||||
pcie = irq_desc_get_chip_data(desc);
|
||||
mask = 1 << (data->hwirq - 1);
|
||||
mask = 1 << data->hwirq;
|
||||
raw_spin_lock_irqsave(&pcie->leg_mask_lock, flags);
|
||||
val = nwl_bridge_readl(pcie, MSGF_LEG_MASK);
|
||||
nwl_bridge_writel(pcie, (val & (~mask)), MSGF_LEG_MASK);
|
||||
@ -397,14 +395,12 @@ static void nwl_mask_leg_irq(struct irq_data *data)
|
||||
|
||||
static void nwl_unmask_leg_irq(struct irq_data *data)
|
||||
{
|
||||
struct irq_desc *desc = irq_to_desc(data->irq);
|
||||
struct nwl_pcie *pcie;
|
||||
struct nwl_pcie *pcie = irq_data_get_irq_chip_data(data);
|
||||
unsigned long flags;
|
||||
u32 mask;
|
||||
u32 val;
|
||||
|
||||
pcie = irq_desc_get_chip_data(desc);
|
||||
mask = 1 << (data->hwirq - 1);
|
||||
mask = 1 << data->hwirq;
|
||||
raw_spin_lock_irqsave(&pcie->leg_mask_lock, flags);
|
||||
val = nwl_bridge_readl(pcie, MSGF_LEG_MASK);
|
||||
nwl_bridge_writel(pcie, (val | mask), MSGF_LEG_MASK);
|
||||
|
@ -126,7 +126,7 @@ static int rapl_msr_write_raw(int cpu, struct reg_action *ra)
|
||||
|
||||
/* List of verified CPUs. */
|
||||
static const struct x86_cpu_id pl4_support_ids[] = {
|
||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_TIGERLAKE_L, X86_FEATURE_ANY },
|
||||
X86_MATCH_INTEL_FAM6_MODEL(TIGERLAKE_L, NULL),
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -144,7 +144,10 @@ static void parport_attach(struct parport *port)
|
||||
return;
|
||||
}
|
||||
|
||||
index = ida_simple_get(&pps_client_index, 0, 0, GFP_KERNEL);
|
||||
index = ida_alloc(&pps_client_index, GFP_KERNEL);
|
||||
if (index < 0)
|
||||
goto err_free_device;
|
||||
|
||||
memset(&pps_client_cb, 0, sizeof(pps_client_cb));
|
||||
pps_client_cb.private = device;
|
||||
pps_client_cb.irq_func = parport_irq;
|
||||
@ -155,7 +158,7 @@ static void parport_attach(struct parport *port)
|
||||
index);
|
||||
if (!device->pardev) {
|
||||
pr_err("couldn't register with %s\n", port->name);
|
||||
goto err_free;
|
||||
goto err_free_ida;
|
||||
}
|
||||
|
||||
if (parport_claim_or_block(device->pardev) < 0) {
|
||||
@ -183,8 +186,9 @@ static void parport_attach(struct parport *port)
|
||||
parport_release(device->pardev);
|
||||
err_unregister_dev:
|
||||
parport_unregister_device(device->pardev);
|
||||
err_free:
|
||||
ida_simple_remove(&pps_client_index, index);
|
||||
err_free_ida:
|
||||
ida_free(&pps_client_index, index);
|
||||
err_free_device:
|
||||
kfree(device);
|
||||
}
|
||||
|
||||
@ -204,7 +208,7 @@ static void parport_detach(struct parport *port)
|
||||
pps_unregister_source(device->pps);
|
||||
parport_release(pardev);
|
||||
parport_unregister_device(pardev);
|
||||
ida_simple_remove(&pps_client_index, device->index);
|
||||
ida_free(&pps_client_index, device->index);
|
||||
kfree(device);
|
||||
}
|
||||
|
||||
|
@ -113,6 +113,7 @@ static int __init integrator_soc_init(void)
|
||||
return -ENODEV;
|
||||
|
||||
syscon_regmap = syscon_node_to_regmap(np);
|
||||
of_node_put(np);
|
||||
if (IS_ERR(syscon_regmap))
|
||||
return PTR_ERR(syscon_regmap);
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
*
|
||||
* Author: Linus Walleij <linus.walleij@linaro.org>
|
||||
*/
|
||||
#include <linux/device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
@ -81,6 +82,13 @@ static struct attribute *realview_attrs[] = {
|
||||
|
||||
ATTRIBUTE_GROUPS(realview);
|
||||
|
||||
static void realview_soc_socdev_release(void *data)
|
||||
{
|
||||
struct soc_device *soc_dev = data;
|
||||
|
||||
soc_device_unregister(soc_dev);
|
||||
}
|
||||
|
||||
static int realview_soc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *syscon_regmap;
|
||||
@ -93,7 +101,7 @@ static int realview_soc_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(syscon_regmap))
|
||||
return PTR_ERR(syscon_regmap);
|
||||
|
||||
soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
|
||||
soc_dev_attr = devm_kzalloc(&pdev->dev, sizeof(*soc_dev_attr), GFP_KERNEL);
|
||||
if (!soc_dev_attr)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -106,10 +114,14 @@ static int realview_soc_probe(struct platform_device *pdev)
|
||||
soc_dev_attr->family = "Versatile";
|
||||
soc_dev_attr->custom_attr_group = realview_groups[0];
|
||||
soc_dev = soc_device_register(soc_dev_attr);
|
||||
if (IS_ERR(soc_dev)) {
|
||||
kfree(soc_dev_attr);
|
||||
if (IS_ERR(soc_dev))
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = devm_add_action_or_reset(&pdev->dev, realview_soc_socdev_release,
|
||||
soc_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_read(syscon_regmap, REALVIEW_SYS_ID_OFFSET,
|
||||
&realview_coreid);
|
||||
if (ret)
|
||||
|
@ -919,7 +919,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
|
||||
|
||||
ret = devm_spi_register_controller(&pdev->dev, controller);
|
||||
if (ret < 0) {
|
||||
dev_err_probe(&pdev->dev, ret, "spi_register_controller error: %i\n", ret);
|
||||
dev_err_probe(&pdev->dev, ret, "spi_register_controller error\n");
|
||||
goto free_dma;
|
||||
}
|
||||
|
||||
|
@ -600,8 +600,8 @@ static void rp2_reset_asic(struct rp2_card *card, unsigned int asic_id)
|
||||
u32 clk_cfg;
|
||||
|
||||
writew(1, base + RP2_GLOBAL_CMD);
|
||||
readw(base + RP2_GLOBAL_CMD);
|
||||
msleep(100);
|
||||
readw(base + RP2_GLOBAL_CMD);
|
||||
writel(0, base + RP2_CLK_PRESCALER);
|
||||
|
||||
/* TDM clock configuration */
|
||||
|
@ -942,10 +942,12 @@ static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)
|
||||
struct acm *acm = tty->driver_data;
|
||||
|
||||
ss->line = acm->minor;
|
||||
mutex_lock(&acm->port.mutex);
|
||||
ss->close_delay = jiffies_to_msecs(acm->port.close_delay) / 10;
|
||||
ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE :
|
||||
jiffies_to_msecs(acm->port.closing_wait) / 10;
|
||||
mutex_unlock(&acm->port.mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -631,9 +631,4 @@ int renesas_xhci_check_request_fw(struct pci_dev *pdev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(renesas_xhci_check_request_fw);
|
||||
|
||||
void renesas_xhci_pci_exit(struct pci_dev *dev)
|
||||
{
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(renesas_xhci_pci_exit);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -488,10 +488,10 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
static void xhci_pci_remove(struct pci_dev *dev)
|
||||
{
|
||||
struct xhci_hcd *xhci;
|
||||
bool set_power_d3;
|
||||
|
||||
xhci = hcd_to_xhci(pci_get_drvdata(dev));
|
||||
if (xhci->quirks & XHCI_RENESAS_FW_QUIRK)
|
||||
renesas_xhci_pci_exit(dev);
|
||||
set_power_d3 = xhci->quirks & XHCI_SPURIOUS_WAKEUP;
|
||||
|
||||
xhci->xhc_state |= XHCI_STATE_REMOVING;
|
||||
|
||||
@ -504,11 +504,11 @@ static void xhci_pci_remove(struct pci_dev *dev)
|
||||
xhci->shared_hcd = NULL;
|
||||
}
|
||||
|
||||
/* Workaround for spurious wakeups at shutdown with HSW */
|
||||
if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
|
||||
pci_set_power_state(dev, PCI_D3hot);
|
||||
|
||||
usb_hcd_pci_remove(dev);
|
||||
|
||||
/* Workaround for spurious wakeups at shutdown with HSW */
|
||||
if (set_power_d3)
|
||||
pci_set_power_state(dev, PCI_D3hot);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -7,7 +7,6 @@
|
||||
#if IS_ENABLED(CONFIG_USB_XHCI_PCI_RENESAS)
|
||||
int renesas_xhci_check_request_fw(struct pci_dev *dev,
|
||||
const struct pci_device_id *id);
|
||||
void renesas_xhci_pci_exit(struct pci_dev *dev);
|
||||
|
||||
#else
|
||||
static int renesas_xhci_check_request_fw(struct pci_dev *dev,
|
||||
@ -16,8 +15,6 @@ static int renesas_xhci_check_request_fw(struct pci_dev *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void renesas_xhci_pci_exit(struct pci_dev *dev) { };
|
||||
|
||||
#endif
|
||||
|
||||
struct xhci_driver_data {
|
||||
|
@ -107,7 +107,12 @@ static void appledisplay_complete(struct urb *urb)
|
||||
case ACD_BTN_BRIGHT_UP:
|
||||
case ACD_BTN_BRIGHT_DOWN:
|
||||
pdata->button_pressed = 1;
|
||||
schedule_delayed_work(&pdata->work, 0);
|
||||
/*
|
||||
* there is a window during which no device
|
||||
* is registered
|
||||
*/
|
||||
if (pdata->bd )
|
||||
schedule_delayed_work(&pdata->work, 0);
|
||||
break;
|
||||
case ACD_BTN_NONE:
|
||||
default:
|
||||
@ -202,6 +207,7 @@ static int appledisplay_probe(struct usb_interface *iface,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct backlight_properties props;
|
||||
struct backlight_device *backlight;
|
||||
struct appledisplay *pdata;
|
||||
struct usb_device *udev = interface_to_usbdev(iface);
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
@ -272,13 +278,14 @@ static int appledisplay_probe(struct usb_interface *iface,
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = 0xff;
|
||||
pdata->bd = backlight_device_register(bl_name, NULL, pdata,
|
||||
backlight = backlight_device_register(bl_name, NULL, pdata,
|
||||
&appledisplay_bl_data, &props);
|
||||
if (IS_ERR(pdata->bd)) {
|
||||
if (IS_ERR(backlight)) {
|
||||
dev_err(&iface->dev, "Backlight registration failed\n");
|
||||
retval = PTR_ERR(pdata->bd);
|
||||
retval = PTR_ERR(backlight);
|
||||
goto error;
|
||||
}
|
||||
pdata->bd = backlight;
|
||||
|
||||
/* Try to get brightness */
|
||||
brightness = appledisplay_bl_get_brightness(pdata->bd);
|
||||
|
@ -88,6 +88,9 @@ static int vendor_command(struct cypress *dev, unsigned char request,
|
||||
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
||||
address, data, iobuf, CYPRESS_MAX_REQSIZE,
|
||||
USB_CTRL_GET_TIMEOUT);
|
||||
/* we must not process garbage */
|
||||
if (retval < 2)
|
||||
goto err_buf;
|
||||
|
||||
/* store returned data (more READs to be added) */
|
||||
switch (request) {
|
||||
@ -107,6 +110,7 @@ static int vendor_command(struct cypress *dev, unsigned char request,
|
||||
break;
|
||||
}
|
||||
|
||||
err_buf:
|
||||
kfree(iobuf);
|
||||
error:
|
||||
return retval;
|
||||
|
@ -34,6 +34,8 @@
|
||||
#define YUREX_BUF_SIZE 8
|
||||
#define YUREX_WRITE_TIMEOUT (HZ*2)
|
||||
|
||||
#define MAX_S64_STRLEN 20 /* {-}922337203685477580{7,8} */
|
||||
|
||||
/* table of devices that work with this driver */
|
||||
static struct usb_device_id yurex_table[] = {
|
||||
{ USB_DEVICE(YUREX_VENDOR_ID, YUREX_PRODUCT_ID) },
|
||||
@ -400,8 +402,7 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
|
||||
{
|
||||
struct usb_yurex *dev;
|
||||
int len = 0;
|
||||
char in_buffer[20];
|
||||
unsigned long flags;
|
||||
char in_buffer[MAX_S64_STRLEN];
|
||||
|
||||
dev = file->private_data;
|
||||
|
||||
@ -411,13 +412,15 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
len = snprintf(in_buffer, 20, "%lld\n", dev->bbu);
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
mutex_unlock(&dev->io_mutex);
|
||||
|
||||
if (WARN_ON_ONCE(len >= sizeof(in_buffer)))
|
||||
if (WARN_ON_ONCE(dev->bbu > S64_MAX || dev->bbu < S64_MIN)) {
|
||||
mutex_unlock(&dev->io_mutex);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
spin_lock_irq(&dev->lock);
|
||||
scnprintf(in_buffer, MAX_S64_STRLEN, "%lld\n", dev->bbu);
|
||||
spin_unlock_irq(&dev->lock);
|
||||
mutex_unlock(&dev->io_mutex);
|
||||
|
||||
return simple_read_from_buffer(buffer, count, ppos, in_buffer, len);
|
||||
}
|
||||
@ -506,8 +509,11 @@ static ssize_t yurex_write(struct file *file, const char __user *user_buffer,
|
||||
__func__, retval);
|
||||
goto error;
|
||||
}
|
||||
if (set && timeout)
|
||||
if (set && timeout) {
|
||||
spin_lock_irq(&dev->lock);
|
||||
dev->bbu = c2;
|
||||
spin_unlock_irq(&dev->lock);
|
||||
}
|
||||
return timeout ? count : -EIO;
|
||||
|
||||
error:
|
||||
|
@ -91,7 +91,6 @@ static int ceph_set_page_dirty(struct page *page)
|
||||
|
||||
/* dirty the head */
|
||||
spin_lock(&ci->i_ceph_lock);
|
||||
BUG_ON(ci->i_wr_ref == 0); // caller should hold Fw reference
|
||||
if (__ceph_have_pending_cap_snap(ci)) {
|
||||
struct ceph_cap_snap *capsnap =
|
||||
list_last_entry(&ci->i_cap_snaps,
|
||||
|
@ -190,7 +190,8 @@ static unsigned long dir_block_index(unsigned int level,
|
||||
unsigned long bidx = 0;
|
||||
|
||||
for (i = 0; i < level; i++)
|
||||
bidx += dir_buckets(i, dir_level) * bucket_blocks(i);
|
||||
bidx += mul_u32_u32(dir_buckets(i, dir_level),
|
||||
bucket_blocks(i));
|
||||
bidx += idx * bucket_blocks(level);
|
||||
return bidx;
|
||||
}
|
||||
|
@ -3033,9 +3033,9 @@ static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
|
||||
u32 segment_count = le32_to_cpu(raw_super->segment_count);
|
||||
u32 log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
|
||||
u64 main_end_blkaddr = main_blkaddr +
|
||||
(segment_count_main << log_blocks_per_seg);
|
||||
((u64)segment_count_main << log_blocks_per_seg);
|
||||
u64 seg_end_blkaddr = segment0_blkaddr +
|
||||
(segment_count << log_blocks_per_seg);
|
||||
((u64)segment_count << log_blocks_per_seg);
|
||||
|
||||
if (segment0_blkaddr != cp_blkaddr) {
|
||||
f2fs_info(sbi, "Mismatch start address, segment0(%u) cp_blkaddr(%u)",
|
||||
|
14
fs/fcntl.c
14
fs/fcntl.c
@ -84,8 +84,8 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
|
||||
return error;
|
||||
}
|
||||
|
||||
static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
|
||||
int force)
|
||||
void __f_setown(struct file *filp, struct pid *pid, enum pid_type type,
|
||||
int force)
|
||||
{
|
||||
write_lock_irq(&filp->f_owner.lock);
|
||||
if (force || !filp->f_owner.pid) {
|
||||
@ -95,19 +95,13 @@ static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
|
||||
|
||||
if (pid) {
|
||||
const struct cred *cred = current_cred();
|
||||
security_file_set_fowner(filp);
|
||||
filp->f_owner.uid = cred->uid;
|
||||
filp->f_owner.euid = cred->euid;
|
||||
}
|
||||
}
|
||||
write_unlock_irq(&filp->f_owner.lock);
|
||||
}
|
||||
|
||||
void __f_setown(struct file *filp, struct pid *pid, enum pid_type type,
|
||||
int force)
|
||||
{
|
||||
security_file_set_fowner(filp);
|
||||
f_modown(filp, pid, type, force);
|
||||
}
|
||||
EXPORT_SYMBOL(__f_setown);
|
||||
|
||||
int f_setown(struct file *filp, unsigned long arg, int force)
|
||||
@ -143,7 +137,7 @@ EXPORT_SYMBOL(f_setown);
|
||||
|
||||
void f_delown(struct file *filp)
|
||||
{
|
||||
f_modown(filp, NULL, PIDTYPE_TGID, 1);
|
||||
__f_setown(filp, NULL, PIDTYPE_TGID, 1);
|
||||
}
|
||||
|
||||
pid_t f_getown(struct file *filp)
|
||||
|
@ -670,6 +670,10 @@ void evict_inodes(struct super_block *sb)
|
||||
continue;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
if (atomic_read(&inode->i_count)) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
continue;
|
||||
}
|
||||
if (inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
continue;
|
||||
|
@ -1948,6 +1948,7 @@ static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recov
|
||||
set_bit(ops->owner_flag_bit, &sp->so_flags);
|
||||
nfs4_put_state_owner(sp);
|
||||
status = nfs4_recovery_handle_error(clp, status);
|
||||
nfs4_free_state_owners(&freeme);
|
||||
return (status != 0) ? status : -EAGAIN;
|
||||
}
|
||||
|
||||
|
@ -109,6 +109,8 @@ static inline struct hlist_head *dev_map_index_hash(struct bpf_dtab *dtab,
|
||||
static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr)
|
||||
{
|
||||
u32 valsize = attr->value_size;
|
||||
u64 cost = 0;
|
||||
int err;
|
||||
|
||||
/* check sanity of attributes. 2 value sizes supported:
|
||||
* 4 bytes: ifindex
|
||||
@ -136,11 +138,21 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr)
|
||||
return -EINVAL;
|
||||
|
||||
dtab->n_buckets = roundup_pow_of_two(dtab->map.max_entries);
|
||||
cost += (u64) sizeof(struct hlist_head) * dtab->n_buckets;
|
||||
} else {
|
||||
cost += (u64) dtab->map.max_entries * sizeof(struct bpf_dtab_netdev *);
|
||||
}
|
||||
|
||||
/* if map size is larger than memlock limit, reject it */
|
||||
err = bpf_map_charge_init(&dtab->map.memory, cost);
|
||||
if (err)
|
||||
return -EINVAL;
|
||||
|
||||
if (attr->map_type == BPF_MAP_TYPE_DEVMAP_HASH) {
|
||||
dtab->dev_index_head = dev_map_create_hash(dtab->n_buckets,
|
||||
dtab->map.numa_node);
|
||||
if (!dtab->dev_index_head)
|
||||
return -ENOMEM;
|
||||
goto free_charge;
|
||||
|
||||
spin_lock_init(&dtab->index_lock);
|
||||
} else {
|
||||
@ -148,10 +160,14 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr)
|
||||
sizeof(struct bpf_dtab_netdev *),
|
||||
dtab->map.numa_node);
|
||||
if (!dtab->netdev_map)
|
||||
return -ENOMEM;
|
||||
goto free_charge;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
free_charge:
|
||||
bpf_map_charge_finish(&dtab->map.memory);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static struct bpf_map *dev_map_alloc(union bpf_attr *attr)
|
||||
|
@ -5967,25 +5967,27 @@ static struct pending_free *get_pending_free(void)
|
||||
static void free_zapped_rcu(struct rcu_head *cb);
|
||||
|
||||
/*
|
||||
* Schedule an RCU callback if no RCU callback is pending. Must be called with
|
||||
* the graph lock held.
|
||||
*/
|
||||
static void call_rcu_zapped(struct pending_free *pf)
|
||||
* See if we need to queue an RCU callback, must called with
|
||||
* the lockdep lock held, returns false if either we don't have
|
||||
* any pending free or the callback is already scheduled.
|
||||
* Otherwise, a call_rcu() must follow this function call.
|
||||
*/
|
||||
static bool prepare_call_rcu_zapped(struct pending_free *pf)
|
||||
{
|
||||
WARN_ON_ONCE(inside_selftest());
|
||||
|
||||
if (list_empty(&pf->zapped))
|
||||
return;
|
||||
return false;
|
||||
|
||||
if (delayed_free.scheduled)
|
||||
return;
|
||||
return false;
|
||||
|
||||
delayed_free.scheduled = true;
|
||||
|
||||
WARN_ON_ONCE(delayed_free.pf + delayed_free.index != pf);
|
||||
delayed_free.index ^= 1;
|
||||
|
||||
call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* The caller must hold the graph lock. May be called from RCU context. */
|
||||
@ -6011,6 +6013,7 @@ static void free_zapped_rcu(struct rcu_head *ch)
|
||||
{
|
||||
struct pending_free *pf;
|
||||
unsigned long flags;
|
||||
bool need_callback;
|
||||
|
||||
if (WARN_ON_ONCE(ch != &delayed_free.rcu_head))
|
||||
return;
|
||||
@ -6022,14 +6025,18 @@ static void free_zapped_rcu(struct rcu_head *ch)
|
||||
pf = delayed_free.pf + (delayed_free.index ^ 1);
|
||||
__free_zapped_classes(pf);
|
||||
delayed_free.scheduled = false;
|
||||
|
||||
/*
|
||||
* If there's anything on the open list, close and start a new callback.
|
||||
*/
|
||||
call_rcu_zapped(delayed_free.pf + delayed_free.index);
|
||||
|
||||
need_callback =
|
||||
prepare_call_rcu_zapped(delayed_free.pf + delayed_free.index);
|
||||
lockdep_unlock();
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
/*
|
||||
* If there's pending free and its callback has not been scheduled,
|
||||
* queue an RCU callback.
|
||||
*/
|
||||
if (need_callback)
|
||||
call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6069,6 +6076,7 @@ static void lockdep_free_key_range_reg(void *start, unsigned long size)
|
||||
{
|
||||
struct pending_free *pf;
|
||||
unsigned long flags;
|
||||
bool need_callback;
|
||||
|
||||
init_data_structures_once();
|
||||
|
||||
@ -6076,10 +6084,11 @@ static void lockdep_free_key_range_reg(void *start, unsigned long size)
|
||||
lockdep_lock();
|
||||
pf = get_pending_free();
|
||||
__lockdep_free_key_range(pf, start, size);
|
||||
call_rcu_zapped(pf);
|
||||
need_callback = prepare_call_rcu_zapped(pf);
|
||||
lockdep_unlock();
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
if (need_callback)
|
||||
call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
|
||||
/*
|
||||
* Wait for any possible iterators from look_up_lock_class() to pass
|
||||
* before continuing to free the memory they refer to.
|
||||
@ -6173,6 +6182,7 @@ static void lockdep_reset_lock_reg(struct lockdep_map *lock)
|
||||
struct pending_free *pf;
|
||||
unsigned long flags;
|
||||
int locked;
|
||||
bool need_callback = false;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
locked = graph_lock();
|
||||
@ -6181,11 +6191,13 @@ static void lockdep_reset_lock_reg(struct lockdep_map *lock)
|
||||
|
||||
pf = get_pending_free();
|
||||
__lockdep_reset_lock(pf, lock);
|
||||
call_rcu_zapped(pf);
|
||||
need_callback = prepare_call_rcu_zapped(pf);
|
||||
|
||||
graph_unlock();
|
||||
out_irq:
|
||||
raw_local_irq_restore(flags);
|
||||
if (need_callback)
|
||||
call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6229,6 +6241,7 @@ void lockdep_unregister_key(struct lock_class_key *key)
|
||||
struct pending_free *pf;
|
||||
unsigned long flags;
|
||||
bool found = false;
|
||||
bool need_callback = false;
|
||||
|
||||
might_sleep();
|
||||
|
||||
@ -6249,11 +6262,14 @@ void lockdep_unregister_key(struct lock_class_key *key)
|
||||
if (found) {
|
||||
pf = get_pending_free();
|
||||
__lockdep_free_key_range(pf, key, 1);
|
||||
call_rcu_zapped(pf);
|
||||
need_callback = prepare_call_rcu_zapped(pf);
|
||||
}
|
||||
lockdep_unlock();
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
if (need_callback)
|
||||
call_rcu(&delayed_free.rcu_head, free_zapped_rcu);
|
||||
|
||||
/* Wait until is_dynamic_key() has finished accessing k->hash_entry. */
|
||||
synchronize_rcu();
|
||||
}
|
||||
|
@ -409,7 +409,8 @@ void padata_do_serial(struct padata_priv *padata)
|
||||
/* Sort in ascending order of sequence number. */
|
||||
list_for_each_prev(pos, &reorder->list) {
|
||||
cur = list_entry(pos, struct padata_priv, list);
|
||||
if (cur->seq_nr < padata->seq_nr)
|
||||
/* Compare by difference to consider integer wrap around */
|
||||
if ((signed int)(cur->seq_nr - padata->seq_nr) < 0)
|
||||
break;
|
||||
}
|
||||
list_add(&padata->list, pos);
|
||||
|
@ -144,13 +144,14 @@ static void fill_pool(void)
|
||||
* READ_ONCE()s pair with the WRITE_ONCE()s in pool_lock critical
|
||||
* sections.
|
||||
*/
|
||||
while (READ_ONCE(obj_nr_tofree) && (READ_ONCE(obj_pool_free) < obj_pool_min_free)) {
|
||||
while (READ_ONCE(obj_nr_tofree) &&
|
||||
READ_ONCE(obj_pool_free) < debug_objects_pool_min_level) {
|
||||
raw_spin_lock_irqsave(&pool_lock, flags);
|
||||
/*
|
||||
* Recheck with the lock held as the worker thread might have
|
||||
* won the race and freed the global free list already.
|
||||
*/
|
||||
while (obj_nr_tofree && (obj_pool_free < obj_pool_min_free)) {
|
||||
while (obj_nr_tofree && (obj_pool_free < debug_objects_pool_min_level)) {
|
||||
obj = hlist_entry(obj_to_free.first, typeof(*obj), node);
|
||||
hlist_del(&obj->node);
|
||||
WRITE_ONCE(obj_nr_tofree, obj_nr_tofree - 1);
|
||||
|
@ -423,7 +423,7 @@ static unsigned long mmap_base(unsigned long rnd, struct rlimit *rlim_stack)
|
||||
if (gap + pad > gap)
|
||||
gap += pad;
|
||||
|
||||
if (gap < MIN_GAP)
|
||||
if (gap < MIN_GAP && MIN_GAP < MAX_GAP)
|
||||
gap = MIN_GAP;
|
||||
else if (gap > MAX_GAP)
|
||||
gap = MAX_GAP;
|
||||
|
@ -6629,7 +6629,8 @@ static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen
|
||||
*/
|
||||
static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
|
||||
{
|
||||
return __vfs_setxattr_noperm(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0);
|
||||
return __vfs_setxattr_locked(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
|
||||
|
@ -4652,7 +4652,8 @@ static int smack_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
|
||||
|
||||
static int smack_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
|
||||
{
|
||||
return __vfs_setxattr_noperm(dentry, XATTR_NAME_SMACK, ctx, ctxlen, 0);
|
||||
return __vfs_setxattr_locked(dentry, XATTR_NAME_SMACK, ctx, ctxlen, 0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static int smack_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
|
||||
|
@ -2843,8 +2843,10 @@ static int rt5682_register_dai_clks(struct snd_soc_component *component)
|
||||
}
|
||||
|
||||
if (dev->of_node) {
|
||||
devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
|
||||
ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
|
||||
dai_clk_hw);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw,
|
||||
init.name,
|
||||
|
Loading…
Reference in New Issue
Block a user