mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
Merge fe75a21824 ("Merge tag 'for-5.11/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm") into android-mainline
Steps on the way to 5.11-rc5 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic254e8628a637c80f890964232d1cc6b79b4f0ab
This commit is contained in:
@@ -177,14 +177,20 @@ bitmap_flush_interval:number
|
||||
The bitmap flush interval in milliseconds. The metadata buffers
|
||||
are synchronized when this interval expires.
|
||||
|
||||
allow_discards
|
||||
Allow block discard requests (a.k.a. TRIM) for the integrity device.
|
||||
Discards are only allowed to devices using internal hash.
|
||||
|
||||
fix_padding
|
||||
Use a smaller padding of the tag area that is more
|
||||
space-efficient. If this option is not present, large padding is
|
||||
used - that is for compatibility with older kernels.
|
||||
|
||||
allow_discards
|
||||
Allow block discard requests (a.k.a. TRIM) for the integrity device.
|
||||
Discards are only allowed to devices using internal hash.
|
||||
legacy_recalculate
|
||||
Allow recalculating of volumes with HMAC keys. This is disabled by
|
||||
default for security reasons - an attacker could modify the volume,
|
||||
set recalc_sector to zero, and the kernel would not detect the
|
||||
modification.
|
||||
|
||||
The journal mode (D/J), buffer_sectors, journal_watermark, commit_time and
|
||||
allow_discards can be changed when reloading the target (load an inactive
|
||||
|
||||
@@ -352,8 +352,8 @@ kprobe_breakpoint_ss_handler(struct pt_regs *regs, unsigned int esr)
|
||||
unsigned long addr = instruction_pointer(regs);
|
||||
struct kprobe *cur = kprobe_running();
|
||||
|
||||
if (cur && (kcb->kprobe_status == KPROBE_HIT_SS)
|
||||
&& ((unsigned long)&cur->ainsn.api.insn[1] == addr)) {
|
||||
if (cur && (kcb->kprobe_status & (KPROBE_HIT_SS | KPROBE_REENTER)) &&
|
||||
((unsigned long)&cur->ainsn.api.insn[1] == addr)) {
|
||||
kprobes_restore_local_irqflag(kcb, regs);
|
||||
post_kprobe_handler(cur, kcb, regs);
|
||||
|
||||
|
||||
@@ -709,10 +709,11 @@ static int do_tag_check_fault(unsigned long far, unsigned int esr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
/*
|
||||
* The architecture specifies that bits 63:60 of FAR_EL1 are UNKNOWN for tag
|
||||
* check faults. Mask them out now so that userspace doesn't see them.
|
||||
* The architecture specifies that bits 63:60 of FAR_EL1 are UNKNOWN
|
||||
* for tag check faults. Set them to corresponding bits in the untagged
|
||||
* address.
|
||||
*/
|
||||
far &= (1UL << 60) - 1;
|
||||
far = (__untagged_addr(far) & ~MTE_TAG_MASK) | (far & MTE_TAG_MASK);
|
||||
do_bad_area(far, esr, regs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1481,9 +1481,9 @@ static int crypt_alloc_req_skcipher(struct crypt_config *cc,
|
||||
static int crypt_alloc_req_aead(struct crypt_config *cc,
|
||||
struct convert_context *ctx)
|
||||
{
|
||||
if (!ctx->r.req) {
|
||||
ctx->r.req = mempool_alloc(&cc->req_pool, in_interrupt() ? GFP_ATOMIC : GFP_NOIO);
|
||||
if (!ctx->r.req)
|
||||
if (!ctx->r.req_aead) {
|
||||
ctx->r.req_aead = mempool_alloc(&cc->req_pool, in_interrupt() ? GFP_ATOMIC : GFP_NOIO);
|
||||
if (!ctx->r.req_aead)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
@@ -257,8 +257,9 @@ struct dm_integrity_c {
|
||||
bool journal_uptodate;
|
||||
bool just_formatted;
|
||||
bool recalculate_flag;
|
||||
bool fix_padding;
|
||||
bool discard;
|
||||
bool fix_padding;
|
||||
bool legacy_recalculate;
|
||||
|
||||
struct alg_spec internal_hash_alg;
|
||||
struct alg_spec journal_crypt_alg;
|
||||
@@ -386,6 +387,14 @@ static int dm_integrity_failed(struct dm_integrity_c *ic)
|
||||
return READ_ONCE(ic->failed);
|
||||
}
|
||||
|
||||
static bool dm_integrity_disable_recalculate(struct dm_integrity_c *ic)
|
||||
{
|
||||
if ((ic->internal_hash_alg.key || ic->journal_mac_alg.key) &&
|
||||
!ic->legacy_recalculate)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static commit_id_t dm_integrity_commit_id(struct dm_integrity_c *ic, unsigned i,
|
||||
unsigned j, unsigned char seq)
|
||||
{
|
||||
@@ -3140,6 +3149,7 @@ static void dm_integrity_status(struct dm_target *ti, status_type_t type,
|
||||
arg_count += !!ic->journal_crypt_alg.alg_string;
|
||||
arg_count += !!ic->journal_mac_alg.alg_string;
|
||||
arg_count += (ic->sb->flags & cpu_to_le32(SB_FLAG_FIXED_PADDING)) != 0;
|
||||
arg_count += ic->legacy_recalculate;
|
||||
DMEMIT("%s %llu %u %c %u", ic->dev->name, ic->start,
|
||||
ic->tag_size, ic->mode, arg_count);
|
||||
if (ic->meta_dev)
|
||||
@@ -3163,6 +3173,8 @@ static void dm_integrity_status(struct dm_target *ti, status_type_t type,
|
||||
}
|
||||
if ((ic->sb->flags & cpu_to_le32(SB_FLAG_FIXED_PADDING)) != 0)
|
||||
DMEMIT(" fix_padding");
|
||||
if (ic->legacy_recalculate)
|
||||
DMEMIT(" legacy_recalculate");
|
||||
|
||||
#define EMIT_ALG(a, n) \
|
||||
do { \
|
||||
@@ -3792,7 +3804,7 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
||||
unsigned extra_args;
|
||||
struct dm_arg_set as;
|
||||
static const struct dm_arg _args[] = {
|
||||
{0, 15, "Invalid number of feature args"},
|
||||
{0, 16, "Invalid number of feature args"},
|
||||
};
|
||||
unsigned journal_sectors, interleave_sectors, buffer_sectors, journal_watermark, sync_msec;
|
||||
bool should_write_sb;
|
||||
@@ -3940,6 +3952,8 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
||||
ic->discard = true;
|
||||
} else if (!strcmp(opt_string, "fix_padding")) {
|
||||
ic->fix_padding = true;
|
||||
} else if (!strcmp(opt_string, "legacy_recalculate")) {
|
||||
ic->legacy_recalculate = true;
|
||||
} else {
|
||||
r = -EINVAL;
|
||||
ti->error = "Invalid argument";
|
||||
@@ -4235,6 +4249,20 @@ try_smaller_buffer:
|
||||
r = -ENOMEM;
|
||||
goto bad;
|
||||
}
|
||||
} else {
|
||||
if (ic->sb->flags & cpu_to_le32(SB_FLAG_RECALCULATING)) {
|
||||
ti->error = "Recalculate can only be specified with internal_hash";
|
||||
r = -EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
}
|
||||
|
||||
if (ic->sb->flags & cpu_to_le32(SB_FLAG_RECALCULATING) &&
|
||||
le64_to_cpu(ic->sb->recalc_sector) < ic->provided_data_sectors &&
|
||||
dm_integrity_disable_recalculate(ic)) {
|
||||
ti->error = "Recalculating with HMAC is disabled for security reasons - if you really need it, use the argument \"legacy_recalculate\"";
|
||||
r = -EOPNOTSUPP;
|
||||
goto bad;
|
||||
}
|
||||
|
||||
ic->bufio = dm_bufio_client_create(ic->meta_dev ? ic->meta_dev->bdev : ic->dev->bdev,
|
||||
|
||||
@@ -365,14 +365,23 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
|
||||
{
|
||||
int r;
|
||||
dev_t dev;
|
||||
unsigned int major, minor;
|
||||
char dummy;
|
||||
struct dm_dev_internal *dd;
|
||||
struct dm_table *t = ti->table;
|
||||
|
||||
BUG_ON(!t);
|
||||
|
||||
dev = dm_get_dev_t(path);
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
if (sscanf(path, "%u:%u%c", &major, &minor, &dummy) == 2) {
|
||||
/* Extract the major/minor numbers */
|
||||
dev = MKDEV(major, minor);
|
||||
if (MAJOR(dev) != major || MINOR(dev) != minor)
|
||||
return -EOVERFLOW;
|
||||
} else {
|
||||
dev = dm_get_dev_t(path);
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
dd = find_device(&t->devices, dev);
|
||||
if (!dd) {
|
||||
|
||||
@@ -384,8 +384,10 @@ static void mmc_setup_queue(struct mmc_queue *mq, struct mmc_card *card)
|
||||
"merging was advertised but not possible");
|
||||
blk_queue_max_segments(mq->queue, mmc_get_max_segments(host));
|
||||
|
||||
if (mmc_card_mmc(card))
|
||||
if (mmc_card_mmc(card) && card->ext_csd.data_sector_size) {
|
||||
block_size = card->ext_csd.data_sector_size;
|
||||
WARN_ON(block_size != 512 && block_size != 4096);
|
||||
}
|
||||
|
||||
blk_queue_logical_block_size(mq->queue, block_size);
|
||||
/*
|
||||
|
||||
@@ -314,11 +314,7 @@ err_clk:
|
||||
|
||||
static void sdhci_brcmstb_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sdhci_pltfm_unregister(pdev);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "failed to shutdown\n");
|
||||
sdhci_pltfm_suspend(&pdev->dev);
|
||||
}
|
||||
|
||||
MODULE_DEVICE_TABLE(of, sdhci_brcm_of_match);
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
#include "sdhci-pltfm.h"
|
||||
|
||||
#define SDHCI_DWCMSHC_ARG2_STUFF GENMASK(31, 16)
|
||||
|
||||
/* DWCMSHC specific Mode Select value */
|
||||
#define DWCMSHC_CTRL_HS400 0x7
|
||||
|
||||
@@ -49,6 +51,29 @@ static void dwcmshc_adma_write_desc(struct sdhci_host *host, void **desc,
|
||||
sdhci_adma_write_desc(host, desc, addr, len, cmd);
|
||||
}
|
||||
|
||||
static void dwcmshc_check_auto_cmd23(struct mmc_host *mmc,
|
||||
struct mmc_request *mrq)
|
||||
{
|
||||
struct sdhci_host *host = mmc_priv(mmc);
|
||||
|
||||
/*
|
||||
* No matter V4 is enabled or not, ARGUMENT2 register is 32-bit
|
||||
* block count register which doesn't support stuff bits of
|
||||
* CMD23 argument on dwcmsch host controller.
|
||||
*/
|
||||
if (mrq->sbc && (mrq->sbc->arg & SDHCI_DWCMSHC_ARG2_STUFF))
|
||||
host->flags &= ~SDHCI_AUTO_CMD23;
|
||||
else
|
||||
host->flags |= SDHCI_AUTO_CMD23;
|
||||
}
|
||||
|
||||
static void dwcmshc_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
||||
{
|
||||
dwcmshc_check_auto_cmd23(mmc, mrq);
|
||||
|
||||
sdhci_request(mmc, mrq);
|
||||
}
|
||||
|
||||
static void dwcmshc_set_uhs_signaling(struct sdhci_host *host,
|
||||
unsigned int timing)
|
||||
{
|
||||
@@ -133,6 +158,8 @@ static int dwcmshc_probe(struct platform_device *pdev)
|
||||
|
||||
sdhci_get_of_property(pdev);
|
||||
|
||||
host->mmc_host_ops.request = dwcmshc_request;
|
||||
|
||||
err = sdhci_add_host(host);
|
||||
if (err)
|
||||
goto err_clk;
|
||||
|
||||
@@ -168,7 +168,12 @@ static void xenon_reset_exit(struct sdhci_host *host,
|
||||
/* Disable tuning request and auto-retuning again */
|
||||
xenon_retune_setup(host);
|
||||
|
||||
xenon_set_acg(host, true);
|
||||
/*
|
||||
* The ACG should be turned off at the early init time, in order
|
||||
* to solve a possible issues with the 1.8V regulator stabilization.
|
||||
* The feature is enabled in later stage.
|
||||
*/
|
||||
xenon_set_acg(host, false);
|
||||
|
||||
xenon_set_sdclk_off_idle(host, sdhc_id, false);
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
menuconfig SURFACE_PLATFORMS
|
||||
bool "Microsoft Surface Platform-Specific Device Drivers"
|
||||
depends on ACPI
|
||||
default y
|
||||
help
|
||||
Say Y here to get to see options for platform-specific device drivers
|
||||
@@ -29,20 +30,19 @@ config SURFACE3_WMI
|
||||
|
||||
config SURFACE_3_BUTTON
|
||||
tristate "Power/home/volume buttons driver for Microsoft Surface 3 tablet"
|
||||
depends on ACPI && KEYBOARD_GPIO && I2C
|
||||
depends on KEYBOARD_GPIO && I2C
|
||||
help
|
||||
This driver handles the power/home/volume buttons on the Microsoft Surface 3 tablet.
|
||||
|
||||
config SURFACE_3_POWER_OPREGION
|
||||
tristate "Surface 3 battery platform operation region support"
|
||||
depends on ACPI && I2C
|
||||
depends on I2C
|
||||
help
|
||||
This driver provides support for ACPI operation
|
||||
region of the Surface 3 battery platform driver.
|
||||
|
||||
config SURFACE_GPE
|
||||
tristate "Surface GPE/Lid Support Driver"
|
||||
depends on ACPI
|
||||
depends on DMI
|
||||
help
|
||||
This driver marks the GPEs related to the ACPI lid device found on
|
||||
@@ -52,7 +52,7 @@ config SURFACE_GPE
|
||||
|
||||
config SURFACE_PRO3_BUTTON
|
||||
tristate "Power/home/volume buttons driver for Microsoft Surface Pro 3/4 tablet"
|
||||
depends on ACPI && INPUT
|
||||
depends on INPUT
|
||||
help
|
||||
This driver handles the power/home/volume buttons on the Microsoft Surface Pro 3/4 tablet.
|
||||
|
||||
|
||||
@@ -181,12 +181,12 @@ static int surface_lid_enable_wakeup(struct device *dev, bool enable)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int surface_gpe_suspend(struct device *dev)
|
||||
static int __maybe_unused surface_gpe_suspend(struct device *dev)
|
||||
{
|
||||
return surface_lid_enable_wakeup(dev, true);
|
||||
}
|
||||
|
||||
static int surface_gpe_resume(struct device *dev)
|
||||
static int __maybe_unused surface_gpe_resume(struct device *dev)
|
||||
{
|
||||
return surface_lid_enable_wakeup(dev, false);
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ static inline void amd_pmc_reg_write(struct amd_pmc_dev *dev, int reg_offset, u3
|
||||
iowrite32(val, dev->regbase + reg_offset);
|
||||
}
|
||||
|
||||
#if CONFIG_DEBUG_FS
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static int smu_fw_info_show(struct seq_file *s, void *unused)
|
||||
{
|
||||
struct amd_pmc_dev *dev = s->private;
|
||||
|
||||
@@ -247,7 +247,8 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command,
|
||||
ret = bios_return->return_code;
|
||||
|
||||
if (ret) {
|
||||
if (ret != HPWMI_RET_UNKNOWN_CMDTYPE)
|
||||
if (ret != HPWMI_RET_UNKNOWN_COMMAND &&
|
||||
ret != HPWMI_RET_UNKNOWN_CMDTYPE)
|
||||
pr_warn("query 0x%x returned error 0x%x\n", query, ret);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@@ -164,13 +164,29 @@ static const struct i2c_inst_data bsg2150_data[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct i2c_inst_data int3515_data[] = {
|
||||
{ "tps6598x", IRQ_RESOURCE_APIC, 0 },
|
||||
{ "tps6598x", IRQ_RESOURCE_APIC, 1 },
|
||||
{ "tps6598x", IRQ_RESOURCE_APIC, 2 },
|
||||
{ "tps6598x", IRQ_RESOURCE_APIC, 3 },
|
||||
{}
|
||||
};
|
||||
/*
|
||||
* Device with _HID INT3515 (TI PD controllers) has some unresolved interrupt
|
||||
* issues. The most common problem seen is interrupt flood.
|
||||
*
|
||||
* There are at least two known causes. Firstly, on some boards, the
|
||||
* I2CSerialBus resource index does not match the Interrupt resource, i.e. they
|
||||
* are not one-to-one mapped like in the array below. Secondly, on some boards
|
||||
* the IRQ line from the PD controller is not actually connected at all. But the
|
||||
* interrupt flood is also seen on some boards where those are not a problem, so
|
||||
* there are some other problems as well.
|
||||
*
|
||||
* Because of the issues with the interrupt, the device is disabled for now. If
|
||||
* you wish to debug the issues, uncomment the below, and add an entry for the
|
||||
* INT3515 device to the i2c_multi_instance_ids table.
|
||||
*
|
||||
* static const struct i2c_inst_data int3515_data[] = {
|
||||
* { "tps6598x", IRQ_RESOURCE_APIC, 0 },
|
||||
* { "tps6598x", IRQ_RESOURCE_APIC, 1 },
|
||||
* { "tps6598x", IRQ_RESOURCE_APIC, 2 },
|
||||
* { "tps6598x", IRQ_RESOURCE_APIC, 3 },
|
||||
* { }
|
||||
* };
|
||||
*/
|
||||
|
||||
/*
|
||||
* Note new device-ids must also be added to i2c_multi_instantiate_ids in
|
||||
@@ -179,7 +195,6 @@ static const struct i2c_inst_data int3515_data[] = {
|
||||
static const struct acpi_device_id i2c_multi_inst_acpi_ids[] = {
|
||||
{ "BSG1160", (unsigned long)bsg1160_data },
|
||||
{ "BSG2150", (unsigned long)bsg2150_data },
|
||||
{ "INT3515", (unsigned long)int3515_data },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, i2c_multi_inst_acpi_ids);
|
||||
|
||||
@@ -92,6 +92,7 @@ struct ideapad_private {
|
||||
struct dentry *debug;
|
||||
unsigned long cfg;
|
||||
bool has_hw_rfkill_switch;
|
||||
bool has_touchpad_switch;
|
||||
const char *fnesc_guid;
|
||||
};
|
||||
|
||||
@@ -535,7 +536,9 @@ static umode_t ideapad_is_visible(struct kobject *kobj,
|
||||
} else if (attr == &dev_attr_fn_lock.attr) {
|
||||
supported = acpi_has_method(priv->adev->handle, "HALS") &&
|
||||
acpi_has_method(priv->adev->handle, "SALS");
|
||||
} else
|
||||
} else if (attr == &dev_attr_touchpad.attr)
|
||||
supported = priv->has_touchpad_switch;
|
||||
else
|
||||
supported = true;
|
||||
|
||||
return supported ? attr->mode : 0;
|
||||
@@ -867,6 +870,9 @@ static void ideapad_sync_touchpad_state(struct ideapad_private *priv)
|
||||
{
|
||||
unsigned long value;
|
||||
|
||||
if (!priv->has_touchpad_switch)
|
||||
return;
|
||||
|
||||
/* Without reading from EC touchpad LED doesn't switch state */
|
||||
if (!read_ec_data(priv->adev->handle, VPCCMD_R_TOUCHPAD, &value)) {
|
||||
/* Some IdeaPads don't really turn off touchpad - they only
|
||||
@@ -989,6 +995,9 @@ static int ideapad_acpi_add(struct platform_device *pdev)
|
||||
priv->platform_device = pdev;
|
||||
priv->has_hw_rfkill_switch = dmi_check_system(hw_rfkill_list);
|
||||
|
||||
/* Most ideapads with ELAN0634 touchpad don't use EC touchpad switch */
|
||||
priv->has_touchpad_switch = !acpi_dev_present("ELAN0634", NULL, -1);
|
||||
|
||||
ret = ideapad_sysfs_init(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -1006,6 +1015,10 @@ static int ideapad_acpi_add(struct platform_device *pdev)
|
||||
if (!priv->has_hw_rfkill_switch)
|
||||
write_ec_cmd(priv->adev->handle, VPCCMD_W_RF, 1);
|
||||
|
||||
/* The same for Touchpad */
|
||||
if (!priv->has_touchpad_switch)
|
||||
write_ec_cmd(priv->adev->handle, VPCCMD_W_TOUCHPAD, 1);
|
||||
|
||||
for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++)
|
||||
if (test_bit(ideapad_rfk_data[i].cfgbit, &priv->cfg))
|
||||
ideapad_register_rfkill(priv, i);
|
||||
|
||||
@@ -204,12 +204,6 @@ static const struct dmi_system_id dmi_switches_allow_list[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Venue 11 Pro 7130"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Stream x360 Convertible PC 11"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
@@ -222,6 +216,12 @@ static const struct dmi_system_id dmi_switches_allow_list[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Switch SA5-271"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7352"),
|
||||
},
|
||||
},
|
||||
{} /* Array terminator */
|
||||
};
|
||||
|
||||
|
||||
@@ -8783,6 +8783,7 @@ static const struct tpacpi_quirk fan_quirk_table[] __initconst = {
|
||||
TPACPI_Q_LNV3('N', '1', 'T', TPACPI_FAN_2CTL), /* P71 */
|
||||
TPACPI_Q_LNV3('N', '1', 'U', TPACPI_FAN_2CTL), /* P51 */
|
||||
TPACPI_Q_LNV3('N', '2', 'C', TPACPI_FAN_2CTL), /* P52 / P72 */
|
||||
TPACPI_Q_LNV3('N', '2', 'N', TPACPI_FAN_2CTL), /* P53 / P73 */
|
||||
TPACPI_Q_LNV3('N', '2', 'E', TPACPI_FAN_2CTL), /* P1 / X1 Extreme (1st gen) */
|
||||
TPACPI_Q_LNV3('N', '2', 'O', TPACPI_FAN_2CTL), /* P1 / X1 Extreme (2nd gen) */
|
||||
TPACPI_Q_LNV3('N', '2', 'V', TPACPI_FAN_2CTL), /* P1 / X1 Extreme (3nd gen) */
|
||||
@@ -9951,9 +9952,9 @@ static int tpacpi_proxsensor_init(struct ibm_init_struct *iibm)
|
||||
if ((palm_err == -ENODEV) && (lap_err == -ENODEV))
|
||||
return 0;
|
||||
/* Otherwise, if there was an error return it */
|
||||
if (palm_err && (palm_err != ENODEV))
|
||||
if (palm_err && (palm_err != -ENODEV))
|
||||
return palm_err;
|
||||
if (lap_err && (lap_err != ENODEV))
|
||||
if (lap_err && (lap_err != -ENODEV))
|
||||
return lap_err;
|
||||
|
||||
if (has_palmsensor) {
|
||||
|
||||
@@ -263,6 +263,16 @@ static const struct ts_dmi_data digma_citi_e200_data = {
|
||||
.properties = digma_citi_e200_props,
|
||||
};
|
||||
|
||||
static const struct property_entry estar_beauty_hd_props[] = {
|
||||
PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct ts_dmi_data estar_beauty_hd_data = {
|
||||
.acpi_name = "GDIX1001:00",
|
||||
.properties = estar_beauty_hd_props,
|
||||
};
|
||||
|
||||
static const struct property_entry gp_electronic_t701_props[] = {
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-x", 960),
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-y", 640),
|
||||
@@ -942,6 +952,14 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Estar Beauty HD (MID 7316R) */
|
||||
.driver_data = (void *)&estar_beauty_hd_data,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Estar"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "eSTAR BEAUTY HD Intel Quad core"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* GP-electronic T701 */
|
||||
.driver_data = (void *)&gp_electronic_t701_data,
|
||||
|
||||
@@ -5038,7 +5038,7 @@ bad:
|
||||
return;
|
||||
}
|
||||
|
||||
static struct ceph_connection *con_get(struct ceph_connection *con)
|
||||
static struct ceph_connection *mds_get_con(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_mds_session *s = con->private;
|
||||
|
||||
@@ -5047,7 +5047,7 @@ static struct ceph_connection *con_get(struct ceph_connection *con)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void con_put(struct ceph_connection *con)
|
||||
static void mds_put_con(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_mds_session *s = con->private;
|
||||
|
||||
@@ -5058,7 +5058,7 @@ static void con_put(struct ceph_connection *con)
|
||||
* if the client is unresponsive for long enough, the mds will kill
|
||||
* the session entirely.
|
||||
*/
|
||||
static void peer_reset(struct ceph_connection *con)
|
||||
static void mds_peer_reset(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_mds_session *s = con->private;
|
||||
struct ceph_mds_client *mdsc = s->s_mdsc;
|
||||
@@ -5067,7 +5067,7 @@ static void peer_reset(struct ceph_connection *con)
|
||||
send_mds_reconnect(mdsc, s);
|
||||
}
|
||||
|
||||
static void dispatch(struct ceph_connection *con, struct ceph_msg *msg)
|
||||
static void mds_dispatch(struct ceph_connection *con, struct ceph_msg *msg)
|
||||
{
|
||||
struct ceph_mds_session *s = con->private;
|
||||
struct ceph_mds_client *mdsc = s->s_mdsc;
|
||||
@@ -5125,8 +5125,8 @@ out:
|
||||
* Note: returned pointer is the address of a structure that's
|
||||
* managed separately. Caller must *not* attempt to free it.
|
||||
*/
|
||||
static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con,
|
||||
int *proto, int force_new)
|
||||
static struct ceph_auth_handshake *
|
||||
mds_get_authorizer(struct ceph_connection *con, int *proto, int force_new)
|
||||
{
|
||||
struct ceph_mds_session *s = con->private;
|
||||
struct ceph_mds_client *mdsc = s->s_mdsc;
|
||||
@@ -5142,7 +5142,7 @@ static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con,
|
||||
return auth;
|
||||
}
|
||||
|
||||
static int add_authorizer_challenge(struct ceph_connection *con,
|
||||
static int mds_add_authorizer_challenge(struct ceph_connection *con,
|
||||
void *challenge_buf, int challenge_buf_len)
|
||||
{
|
||||
struct ceph_mds_session *s = con->private;
|
||||
@@ -5153,7 +5153,7 @@ static int add_authorizer_challenge(struct ceph_connection *con,
|
||||
challenge_buf, challenge_buf_len);
|
||||
}
|
||||
|
||||
static int verify_authorizer_reply(struct ceph_connection *con)
|
||||
static int mds_verify_authorizer_reply(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_mds_session *s = con->private;
|
||||
struct ceph_mds_client *mdsc = s->s_mdsc;
|
||||
@@ -5165,7 +5165,7 @@ static int verify_authorizer_reply(struct ceph_connection *con)
|
||||
NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static int invalidate_authorizer(struct ceph_connection *con)
|
||||
static int mds_invalidate_authorizer(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_mds_session *s = con->private;
|
||||
struct ceph_mds_client *mdsc = s->s_mdsc;
|
||||
@@ -5288,15 +5288,15 @@ static int mds_check_message_signature(struct ceph_msg *msg)
|
||||
}
|
||||
|
||||
static const struct ceph_connection_operations mds_con_ops = {
|
||||
.get = con_get,
|
||||
.put = con_put,
|
||||
.dispatch = dispatch,
|
||||
.get_authorizer = get_authorizer,
|
||||
.add_authorizer_challenge = add_authorizer_challenge,
|
||||
.verify_authorizer_reply = verify_authorizer_reply,
|
||||
.invalidate_authorizer = invalidate_authorizer,
|
||||
.peer_reset = peer_reset,
|
||||
.get = mds_get_con,
|
||||
.put = mds_put_con,
|
||||
.alloc_msg = mds_alloc_msg,
|
||||
.dispatch = mds_dispatch,
|
||||
.peer_reset = mds_peer_reset,
|
||||
.get_authorizer = mds_get_authorizer,
|
||||
.add_authorizer_challenge = mds_add_authorizer_challenge,
|
||||
.verify_authorizer_reply = mds_verify_authorizer_reply,
|
||||
.invalidate_authorizer = mds_invalidate_authorizer,
|
||||
.sign_message = mds_sign_message,
|
||||
.check_message_signature = mds_check_message_signature,
|
||||
.get_auth_request = mds_get_auth_request,
|
||||
|
||||
@@ -1427,7 +1427,7 @@ phys_addr_t __init memblock_phys_alloc_range(phys_addr_t size,
|
||||
}
|
||||
|
||||
/**
|
||||
* memblock_phys_alloc_try_nid - allocate a memory block from specified MUMA node
|
||||
* memblock_phys_alloc_try_nid - allocate a memory block from specified NUMA node
|
||||
* @size: size of memory block to be allocated in bytes
|
||||
* @align: alignment of the region and block's size
|
||||
* @nid: nid of the free area to find, %NUMA_NO_NODE for any node
|
||||
|
||||
@@ -569,6 +569,34 @@ e_range:
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
static int decode_con_secret(void **p, void *end, u8 *con_secret,
|
||||
int *con_secret_len)
|
||||
{
|
||||
int len;
|
||||
|
||||
ceph_decode_32_safe(p, end, len, bad);
|
||||
ceph_decode_need(p, end, len, bad);
|
||||
|
||||
dout("%s len %d\n", __func__, len);
|
||||
if (con_secret) {
|
||||
if (len > CEPH_MAX_CON_SECRET_LEN) {
|
||||
pr_err("connection secret too big %d\n", len);
|
||||
goto bad_memzero;
|
||||
}
|
||||
memcpy(con_secret, *p, len);
|
||||
*con_secret_len = len;
|
||||
}
|
||||
memzero_explicit(*p, len);
|
||||
*p += len;
|
||||
return 0;
|
||||
|
||||
bad_memzero:
|
||||
memzero_explicit(*p, len);
|
||||
bad:
|
||||
pr_err("failed to decode connection secret\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int handle_auth_session_key(struct ceph_auth_client *ac,
|
||||
void **p, void *end,
|
||||
u8 *session_key, int *session_key_len,
|
||||
@@ -612,17 +640,9 @@ static int handle_auth_session_key(struct ceph_auth_client *ac,
|
||||
dout("%s decrypted %d bytes\n", __func__, ret);
|
||||
dend = dp + ret;
|
||||
|
||||
ceph_decode_32_safe(&dp, dend, len, e_inval);
|
||||
if (len > CEPH_MAX_CON_SECRET_LEN) {
|
||||
pr_err("connection secret too big %d\n", len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dout("%s connection secret len %d\n", __func__, len);
|
||||
if (con_secret) {
|
||||
memcpy(con_secret, dp, len);
|
||||
*con_secret_len = len;
|
||||
}
|
||||
ret = decode_con_secret(&dp, dend, con_secret, con_secret_len);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* service tickets */
|
||||
@@ -828,7 +848,6 @@ static int decrypt_authorizer_reply(struct ceph_crypto_key *secret,
|
||||
{
|
||||
void *dp, *dend;
|
||||
u8 struct_v;
|
||||
int len;
|
||||
int ret;
|
||||
|
||||
dp = *p + ceph_x_encrypt_offset();
|
||||
@@ -843,17 +862,9 @@ static int decrypt_authorizer_reply(struct ceph_crypto_key *secret,
|
||||
ceph_decode_64_safe(&dp, dend, *nonce_plus_one, e_inval);
|
||||
dout("%s nonce_plus_one %llu\n", __func__, *nonce_plus_one);
|
||||
if (struct_v >= 2) {
|
||||
ceph_decode_32_safe(&dp, dend, len, e_inval);
|
||||
if (len > CEPH_MAX_CON_SECRET_LEN) {
|
||||
pr_err("connection secret too big %d\n", len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dout("%s connection secret len %d\n", __func__, len);
|
||||
if (con_secret) {
|
||||
memcpy(con_secret, dp, len);
|
||||
*con_secret_len = len;
|
||||
}
|
||||
ret = decode_con_secret(&dp, dend, con_secret, con_secret_len);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -96,6 +96,7 @@ int ceph_crypto_key_decode(struct ceph_crypto_key *key, void **p, void *end)
|
||||
key->len = ceph_decode_16(p);
|
||||
ceph_decode_need(p, end, key->len, bad);
|
||||
ret = set_secret(key, *p);
|
||||
memzero_explicit(*p, key->len);
|
||||
*p += key->len;
|
||||
return ret;
|
||||
|
||||
@@ -134,7 +135,7 @@ int ceph_crypto_key_unarmor(struct ceph_crypto_key *key, const char *inkey)
|
||||
void ceph_crypto_key_destroy(struct ceph_crypto_key *key)
|
||||
{
|
||||
if (key) {
|
||||
kfree(key->key);
|
||||
kfree_sensitive(key->key);
|
||||
key->key = NULL;
|
||||
if (key->tfm) {
|
||||
crypto_free_sync_skcipher(key->tfm);
|
||||
|
||||
@@ -1100,7 +1100,7 @@ static int read_partial_message(struct ceph_connection *con)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
BUG_ON(!con->in_msg ^ skip);
|
||||
BUG_ON((!con->in_msg) ^ skip);
|
||||
if (skip) {
|
||||
/* skip this message */
|
||||
dout("alloc_msg said skip message\n");
|
||||
|
||||
@@ -689,11 +689,10 @@ static int verify_epilogue_crcs(struct ceph_connection *con, u32 front_crc,
|
||||
}
|
||||
|
||||
static int setup_crypto(struct ceph_connection *con,
|
||||
u8 *session_key, int session_key_len,
|
||||
u8 *con_secret, int con_secret_len)
|
||||
const u8 *session_key, int session_key_len,
|
||||
const u8 *con_secret, int con_secret_len)
|
||||
{
|
||||
unsigned int noio_flag;
|
||||
void *p;
|
||||
int ret;
|
||||
|
||||
dout("%s con %p con_mode %d session_key_len %d con_secret_len %d\n",
|
||||
@@ -751,15 +750,14 @@ static int setup_crypto(struct ceph_connection *con,
|
||||
return ret;
|
||||
}
|
||||
|
||||
p = con_secret;
|
||||
WARN_ON((unsigned long)p & crypto_aead_alignmask(con->v2.gcm_tfm));
|
||||
ret = crypto_aead_setkey(con->v2.gcm_tfm, p, CEPH_GCM_KEY_LEN);
|
||||
WARN_ON((unsigned long)con_secret &
|
||||
crypto_aead_alignmask(con->v2.gcm_tfm));
|
||||
ret = crypto_aead_setkey(con->v2.gcm_tfm, con_secret, CEPH_GCM_KEY_LEN);
|
||||
if (ret) {
|
||||
pr_err("failed to set gcm key: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
p += CEPH_GCM_KEY_LEN;
|
||||
WARN_ON(crypto_aead_ivsize(con->v2.gcm_tfm) != CEPH_GCM_IV_LEN);
|
||||
ret = crypto_aead_setauthsize(con->v2.gcm_tfm, CEPH_GCM_TAG_LEN);
|
||||
if (ret) {
|
||||
@@ -777,8 +775,11 @@ static int setup_crypto(struct ceph_connection *con,
|
||||
aead_request_set_callback(con->v2.gcm_req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
||||
crypto_req_done, &con->v2.gcm_wait);
|
||||
|
||||
memcpy(&con->v2.in_gcm_nonce, p, CEPH_GCM_IV_LEN);
|
||||
memcpy(&con->v2.out_gcm_nonce, p + CEPH_GCM_IV_LEN, CEPH_GCM_IV_LEN);
|
||||
memcpy(&con->v2.in_gcm_nonce, con_secret + CEPH_GCM_KEY_LEN,
|
||||
CEPH_GCM_IV_LEN);
|
||||
memcpy(&con->v2.out_gcm_nonce,
|
||||
con_secret + CEPH_GCM_KEY_LEN + CEPH_GCM_IV_LEN,
|
||||
CEPH_GCM_IV_LEN);
|
||||
return 0; /* auth_x, secure mode */
|
||||
}
|
||||
|
||||
@@ -800,7 +801,7 @@ static int hmac_sha256(struct ceph_connection *con, const struct kvec *kvecs,
|
||||
desc->tfm = con->v2.hmac_tfm;
|
||||
ret = crypto_shash_init(desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < kvec_cnt; i++) {
|
||||
WARN_ON((unsigned long)kvecs[i].iov_base &
|
||||
@@ -808,15 +809,14 @@ static int hmac_sha256(struct ceph_connection *con, const struct kvec *kvecs,
|
||||
ret = crypto_shash_update(desc, kvecs[i].iov_base,
|
||||
kvecs[i].iov_len);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = crypto_shash_final(desc, hmac);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
out:
|
||||
shash_desc_zero(desc);
|
||||
return 0; /* auth_x, both plain and secure modes */
|
||||
return ret; /* auth_x, both plain and secure modes */
|
||||
}
|
||||
|
||||
static void gcm_inc_nonce(struct ceph_gcm_nonce *nonce)
|
||||
@@ -2072,27 +2072,32 @@ static int process_auth_done(struct ceph_connection *con, void *p, void *end)
|
||||
if (con->state != CEPH_CON_S_V2_AUTH) {
|
||||
dout("%s con %p state changed to %d\n", __func__, con,
|
||||
con->state);
|
||||
return -EAGAIN;
|
||||
ret = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
dout("%s con %p handle_auth_done ret %d\n", __func__, con, ret);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
ret = setup_crypto(con, session_key, session_key_len, con_secret,
|
||||
con_secret_len);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
reset_out_kvecs(con);
|
||||
ret = prepare_auth_signature(con);
|
||||
if (ret) {
|
||||
pr_err("prepare_auth_signature failed: %d\n", ret);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
con->state = CEPH_CON_S_V2_AUTH_SIGNATURE;
|
||||
return 0;
|
||||
|
||||
out:
|
||||
memzero_explicit(session_key_buf, sizeof(session_key_buf));
|
||||
memzero_explicit(con_secret_buf, sizeof(con_secret_buf));
|
||||
return ret;
|
||||
|
||||
bad:
|
||||
pr_err("failed to decode auth_done\n");
|
||||
@@ -3436,6 +3441,8 @@ void ceph_con_v2_reset_protocol(struct ceph_connection *con)
|
||||
}
|
||||
|
||||
con->v2.con_mode = CEPH_CON_MODE_UNKNOWN;
|
||||
memzero_explicit(&con->v2.in_gcm_nonce, CEPH_GCM_IV_LEN);
|
||||
memzero_explicit(&con->v2.out_gcm_nonce, CEPH_GCM_IV_LEN);
|
||||
|
||||
if (con->v2.hmac_tfm) {
|
||||
crypto_free_shash(con->v2.hmac_tfm);
|
||||
|
||||
@@ -1433,7 +1433,7 @@ static int mon_handle_auth_bad_method(struct ceph_connection *con,
|
||||
/*
|
||||
* handle incoming message
|
||||
*/
|
||||
static void dispatch(struct ceph_connection *con, struct ceph_msg *msg)
|
||||
static void mon_dispatch(struct ceph_connection *con, struct ceph_msg *msg)
|
||||
{
|
||||
struct ceph_mon_client *monc = con->private;
|
||||
int type = le16_to_cpu(msg->hdr.type);
|
||||
@@ -1565,21 +1565,21 @@ static void mon_fault(struct ceph_connection *con)
|
||||
* will come from the messenger workqueue, which is drained prior to
|
||||
* mon_client destruction.
|
||||
*/
|
||||
static struct ceph_connection *con_get(struct ceph_connection *con)
|
||||
static struct ceph_connection *mon_get_con(struct ceph_connection *con)
|
||||
{
|
||||
return con;
|
||||
}
|
||||
|
||||
static void con_put(struct ceph_connection *con)
|
||||
static void mon_put_con(struct ceph_connection *con)
|
||||
{
|
||||
}
|
||||
|
||||
static const struct ceph_connection_operations mon_con_ops = {
|
||||
.get = con_get,
|
||||
.put = con_put,
|
||||
.dispatch = dispatch,
|
||||
.fault = mon_fault,
|
||||
.get = mon_get_con,
|
||||
.put = mon_put_con,
|
||||
.alloc_msg = mon_alloc_msg,
|
||||
.dispatch = mon_dispatch,
|
||||
.fault = mon_fault,
|
||||
.get_auth_request = mon_get_auth_request,
|
||||
.handle_auth_reply_more = mon_handle_auth_reply_more,
|
||||
.handle_auth_done = mon_handle_auth_done,
|
||||
|
||||
@@ -5412,7 +5412,7 @@ void ceph_osdc_cleanup(void)
|
||||
/*
|
||||
* handle incoming message
|
||||
*/
|
||||
static void dispatch(struct ceph_connection *con, struct ceph_msg *msg)
|
||||
static void osd_dispatch(struct ceph_connection *con, struct ceph_msg *msg)
|
||||
{
|
||||
struct ceph_osd *osd = con->private;
|
||||
struct ceph_osd_client *osdc = osd->o_osdc;
|
||||
@@ -5534,9 +5534,9 @@ static struct ceph_msg *alloc_msg_with_page_vector(struct ceph_msg_header *hdr)
|
||||
return m;
|
||||
}
|
||||
|
||||
static struct ceph_msg *alloc_msg(struct ceph_connection *con,
|
||||
struct ceph_msg_header *hdr,
|
||||
int *skip)
|
||||
static struct ceph_msg *osd_alloc_msg(struct ceph_connection *con,
|
||||
struct ceph_msg_header *hdr,
|
||||
int *skip)
|
||||
{
|
||||
struct ceph_osd *osd = con->private;
|
||||
int type = le16_to_cpu(hdr->type);
|
||||
@@ -5560,7 +5560,7 @@ static struct ceph_msg *alloc_msg(struct ceph_connection *con,
|
||||
/*
|
||||
* Wrappers to refcount containing ceph_osd struct
|
||||
*/
|
||||
static struct ceph_connection *get_osd_con(struct ceph_connection *con)
|
||||
static struct ceph_connection *osd_get_con(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_osd *osd = con->private;
|
||||
if (get_osd(osd))
|
||||
@@ -5568,7 +5568,7 @@ static struct ceph_connection *get_osd_con(struct ceph_connection *con)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void put_osd_con(struct ceph_connection *con)
|
||||
static void osd_put_con(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_osd *osd = con->private;
|
||||
put_osd(osd);
|
||||
@@ -5582,8 +5582,8 @@ static void put_osd_con(struct ceph_connection *con)
|
||||
* Note: returned pointer is the address of a structure that's
|
||||
* managed separately. Caller must *not* attempt to free it.
|
||||
*/
|
||||
static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con,
|
||||
int *proto, int force_new)
|
||||
static struct ceph_auth_handshake *
|
||||
osd_get_authorizer(struct ceph_connection *con, int *proto, int force_new)
|
||||
{
|
||||
struct ceph_osd *o = con->private;
|
||||
struct ceph_osd_client *osdc = o->o_osdc;
|
||||
@@ -5599,7 +5599,7 @@ static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con,
|
||||
return auth;
|
||||
}
|
||||
|
||||
static int add_authorizer_challenge(struct ceph_connection *con,
|
||||
static int osd_add_authorizer_challenge(struct ceph_connection *con,
|
||||
void *challenge_buf, int challenge_buf_len)
|
||||
{
|
||||
struct ceph_osd *o = con->private;
|
||||
@@ -5610,7 +5610,7 @@ static int add_authorizer_challenge(struct ceph_connection *con,
|
||||
challenge_buf, challenge_buf_len);
|
||||
}
|
||||
|
||||
static int verify_authorizer_reply(struct ceph_connection *con)
|
||||
static int osd_verify_authorizer_reply(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_osd *o = con->private;
|
||||
struct ceph_osd_client *osdc = o->o_osdc;
|
||||
@@ -5622,7 +5622,7 @@ static int verify_authorizer_reply(struct ceph_connection *con)
|
||||
NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static int invalidate_authorizer(struct ceph_connection *con)
|
||||
static int osd_invalidate_authorizer(struct ceph_connection *con)
|
||||
{
|
||||
struct ceph_osd *o = con->private;
|
||||
struct ceph_osd_client *osdc = o->o_osdc;
|
||||
@@ -5731,18 +5731,18 @@ static int osd_check_message_signature(struct ceph_msg *msg)
|
||||
}
|
||||
|
||||
static const struct ceph_connection_operations osd_con_ops = {
|
||||
.get = get_osd_con,
|
||||
.put = put_osd_con,
|
||||
.dispatch = dispatch,
|
||||
.get_authorizer = get_authorizer,
|
||||
.add_authorizer_challenge = add_authorizer_challenge,
|
||||
.verify_authorizer_reply = verify_authorizer_reply,
|
||||
.invalidate_authorizer = invalidate_authorizer,
|
||||
.alloc_msg = alloc_msg,
|
||||
.get = osd_get_con,
|
||||
.put = osd_put_con,
|
||||
.alloc_msg = osd_alloc_msg,
|
||||
.dispatch = osd_dispatch,
|
||||
.fault = osd_fault,
|
||||
.reencode_message = osd_reencode_message,
|
||||
.get_authorizer = osd_get_authorizer,
|
||||
.add_authorizer_challenge = osd_add_authorizer_challenge,
|
||||
.verify_authorizer_reply = osd_verify_authorizer_reply,
|
||||
.invalidate_authorizer = osd_invalidate_authorizer,
|
||||
.sign_message = osd_sign_message,
|
||||
.check_message_signature = osd_check_message_signature,
|
||||
.fault = osd_fault,
|
||||
.get_auth_request = osd_get_auth_request,
|
||||
.handle_auth_reply_more = osd_handle_auth_reply_more,
|
||||
.handle_auth_done = osd_handle_auth_done,
|
||||
|
||||
@@ -367,21 +367,13 @@ static struct perf_mmap* perf_evlist__alloc_mmap(struct perf_evlist *evlist, boo
|
||||
return map;
|
||||
}
|
||||
|
||||
static void perf_evlist__set_sid_idx(struct perf_evlist *evlist,
|
||||
struct perf_evsel *evsel, int idx, int cpu,
|
||||
int thread)
|
||||
static void perf_evsel__set_sid_idx(struct perf_evsel *evsel, int idx, int cpu, int thread)
|
||||
{
|
||||
struct perf_sample_id *sid = SID(evsel, cpu, thread);
|
||||
|
||||
sid->idx = idx;
|
||||
if (evlist->cpus && cpu >= 0)
|
||||
sid->cpu = evlist->cpus->map[cpu];
|
||||
else
|
||||
sid->cpu = -1;
|
||||
if (!evsel->system_wide && evlist->threads && thread >= 0)
|
||||
sid->tid = perf_thread_map__pid(evlist->threads, thread);
|
||||
else
|
||||
sid->tid = -1;
|
||||
sid->cpu = perf_cpu_map__cpu(evsel->cpus, cpu);
|
||||
sid->tid = perf_thread_map__pid(evsel->threads, thread);
|
||||
}
|
||||
|
||||
static struct perf_mmap*
|
||||
@@ -500,8 +492,7 @@ mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops,
|
||||
if (perf_evlist__id_add_fd(evlist, evsel, cpu, thread,
|
||||
fd) < 0)
|
||||
return -1;
|
||||
perf_evlist__set_sid_idx(evlist, evsel, idx, cpu,
|
||||
thread);
|
||||
perf_evsel__set_sid_idx(evsel, idx, cpu, thread);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -186,6 +186,7 @@ struct output_option {
|
||||
|
||||
enum {
|
||||
OUTPUT_TYPE_SYNTH = PERF_TYPE_MAX,
|
||||
OUTPUT_TYPE_OTHER,
|
||||
OUTPUT_TYPE_MAX
|
||||
};
|
||||
|
||||
@@ -283,6 +284,18 @@ static struct {
|
||||
|
||||
.invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
|
||||
},
|
||||
|
||||
[OUTPUT_TYPE_OTHER] = {
|
||||
.user_set = false,
|
||||
|
||||
.fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
|
||||
PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
|
||||
PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
|
||||
PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
|
||||
PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD,
|
||||
|
||||
.invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
|
||||
},
|
||||
};
|
||||
|
||||
struct evsel_script {
|
||||
@@ -343,8 +356,11 @@ static inline int output_type(unsigned int type)
|
||||
case PERF_TYPE_SYNTH:
|
||||
return OUTPUT_TYPE_SYNTH;
|
||||
default:
|
||||
return type;
|
||||
if (type < PERF_TYPE_MAX)
|
||||
return type;
|
||||
}
|
||||
|
||||
return OUTPUT_TYPE_OTHER;
|
||||
}
|
||||
|
||||
static inline unsigned int attr_type(unsigned int type)
|
||||
|
||||
@@ -162,6 +162,14 @@ static bool contains_event(struct evsel **metric_events, int num_events,
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool evsel_same_pmu(struct evsel *ev1, struct evsel *ev2)
|
||||
{
|
||||
if (!ev1->pmu_name || !ev2->pmu_name)
|
||||
return false;
|
||||
|
||||
return !strcmp(ev1->pmu_name, ev2->pmu_name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a group of events in perf_evlist that correspond to those from a parsed
|
||||
* metric expression. Note, as find_evsel_group is called in the same order as
|
||||
@@ -280,8 +288,7 @@ static struct evsel *find_evsel_group(struct evlist *perf_evlist,
|
||||
*/
|
||||
if (!has_constraint &&
|
||||
ev->leader != metric_events[i]->leader &&
|
||||
!strcmp(ev->leader->pmu_name,
|
||||
metric_events[i]->leader->pmu_name))
|
||||
evsel_same_pmu(ev->leader, metric_events[i]->leader))
|
||||
break;
|
||||
if (!strcmp(metric_events[i]->name, ev->name)) {
|
||||
set_bit(ev->idx, evlist_used);
|
||||
@@ -766,7 +773,6 @@ int __weak arch_get_runtimeparam(struct pmu_event *pe __maybe_unused)
|
||||
struct metricgroup_add_iter_data {
|
||||
struct list_head *metric_list;
|
||||
const char *metric;
|
||||
struct metric **m;
|
||||
struct expr_ids *ids;
|
||||
int *ret;
|
||||
bool *has_match;
|
||||
@@ -1058,12 +1064,13 @@ static int metricgroup__add_metric_sys_event_iter(struct pmu_event *pe,
|
||||
void *data)
|
||||
{
|
||||
struct metricgroup_add_iter_data *d = data;
|
||||
struct metric *m = NULL;
|
||||
int ret;
|
||||
|
||||
if (!match_pe_metric(pe, d->metric))
|
||||
return 0;
|
||||
|
||||
ret = add_metric(d->metric_list, pe, d->metric_no_group, d->m, NULL, d->ids);
|
||||
ret = add_metric(d->metric_list, pe, d->metric_no_group, &m, NULL, d->ids);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1114,7 +1121,6 @@ static int metricgroup__add_metric(const char *metric, bool metric_no_group,
|
||||
.metric_list = &list,
|
||||
.metric = metric,
|
||||
.metric_no_group = metric_no_group,
|
||||
.m = &m,
|
||||
.ids = &ids,
|
||||
.has_match = &has_match,
|
||||
.ret = &ret,
|
||||
|
||||
@@ -1249,6 +1249,8 @@ static void dump_isst_config(int arg)
|
||||
isst_ctdp_display_information_end(outf);
|
||||
}
|
||||
|
||||
static void adjust_scaling_max_from_base_freq(int cpu);
|
||||
|
||||
static void set_tdp_level_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
|
||||
void *arg4)
|
||||
{
|
||||
@@ -1267,6 +1269,9 @@ static void set_tdp_level_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
|
||||
int pkg_id = get_physical_package_id(cpu);
|
||||
int die_id = get_physical_die_id(cpu);
|
||||
|
||||
/* Wait for updated base frequencies */
|
||||
usleep(2000);
|
||||
|
||||
fprintf(stderr, "Option is set to online/offline\n");
|
||||
ctdp_level.core_cpumask_size =
|
||||
alloc_cpu_set(&ctdp_level.core_cpumask);
|
||||
@@ -1283,6 +1288,7 @@ static void set_tdp_level_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
|
||||
if (CPU_ISSET_S(i, ctdp_level.core_cpumask_size, ctdp_level.core_cpumask)) {
|
||||
fprintf(stderr, "online cpu %d\n", i);
|
||||
set_cpu_online_offline(i, 1);
|
||||
adjust_scaling_max_from_base_freq(i);
|
||||
} else {
|
||||
fprintf(stderr, "offline cpu %d\n", i);
|
||||
set_cpu_online_offline(i, 0);
|
||||
@@ -1440,6 +1446,31 @@ static int set_cpufreq_scaling_min_max(int cpu, int max, int freq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int no_turbo(void)
|
||||
{
|
||||
return parse_int_file(0, "/sys/devices/system/cpu/intel_pstate/no_turbo");
|
||||
}
|
||||
|
||||
static void adjust_scaling_max_from_base_freq(int cpu)
|
||||
{
|
||||
int base_freq, scaling_max_freq;
|
||||
|
||||
scaling_max_freq = parse_int_file(0, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu);
|
||||
base_freq = get_cpufreq_base_freq(cpu);
|
||||
if (scaling_max_freq < base_freq || no_turbo())
|
||||
set_cpufreq_scaling_min_max(cpu, 1, base_freq);
|
||||
}
|
||||
|
||||
static void adjust_scaling_min_from_base_freq(int cpu)
|
||||
{
|
||||
int base_freq, scaling_min_freq;
|
||||
|
||||
scaling_min_freq = parse_int_file(0, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu);
|
||||
base_freq = get_cpufreq_base_freq(cpu);
|
||||
if (scaling_min_freq < base_freq)
|
||||
set_cpufreq_scaling_min_max(cpu, 0, base_freq);
|
||||
}
|
||||
|
||||
static int set_clx_pbf_cpufreq_scaling_min_max(int cpu)
|
||||
{
|
||||
struct isst_pkg_ctdp_level_info *ctdp_level;
|
||||
@@ -1537,6 +1568,7 @@ static void set_scaling_min_to_cpuinfo_max(int cpu)
|
||||
continue;
|
||||
|
||||
set_cpufreq_scaling_min_max_from_cpuinfo(i, 1, 0);
|
||||
adjust_scaling_min_from_base_freq(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user