mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
Merge "Merge 59d0d52c30 ("AMerge tag 'netfs-fixes-20221115' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs") into android-mainline" into android-mainline
This commit is contained in:
@@ -535,6 +535,11 @@
|
||||
#define MSR_AMD64_CPUID_FN_1 0xc0011004
|
||||
#define MSR_AMD64_LS_CFG 0xc0011020
|
||||
#define MSR_AMD64_DC_CFG 0xc0011022
|
||||
|
||||
#define MSR_AMD64_DE_CFG 0xc0011029
|
||||
#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT 1
|
||||
#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE BIT_ULL(MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT)
|
||||
|
||||
#define MSR_AMD64_BU_CFG2 0xc001102a
|
||||
#define MSR_AMD64_IBSFETCHCTL 0xc0011030
|
||||
#define MSR_AMD64_IBSFETCHLINAD 0xc0011031
|
||||
@@ -640,9 +645,6 @@
|
||||
#define FAM10H_MMIO_CONF_BASE_MASK 0xfffffffULL
|
||||
#define FAM10H_MMIO_CONF_BASE_SHIFT 20
|
||||
#define MSR_FAM10H_NODE_ID 0xc001100c
|
||||
#define MSR_F10H_DECFG 0xc0011029
|
||||
#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT 1
|
||||
#define MSR_F10H_DECFG_LFENCE_SERIALIZE BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT)
|
||||
|
||||
/* K8 MSRs */
|
||||
#define MSR_K8_TOP_MEM1 0xc001001a
|
||||
|
||||
@@ -770,8 +770,6 @@ static void init_amd_gh(struct cpuinfo_x86 *c)
|
||||
set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH);
|
||||
}
|
||||
|
||||
#define MSR_AMD64_DE_CFG 0xC0011029
|
||||
|
||||
static void init_amd_ln(struct cpuinfo_x86 *c)
|
||||
{
|
||||
/*
|
||||
@@ -965,8 +963,8 @@ static void init_amd(struct cpuinfo_x86 *c)
|
||||
* msr_set_bit() uses the safe accessors, too, even if the MSR
|
||||
* is not present.
|
||||
*/
|
||||
msr_set_bit(MSR_F10H_DECFG,
|
||||
MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
|
||||
msr_set_bit(MSR_AMD64_DE_CFG,
|
||||
MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT);
|
||||
|
||||
/* A serializing LFENCE stops RDTSC speculation */
|
||||
set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
|
||||
|
||||
@@ -326,8 +326,8 @@ static void init_hygon(struct cpuinfo_x86 *c)
|
||||
* msr_set_bit() uses the safe accessors, too, even if the MSR
|
||||
* is not present.
|
||||
*/
|
||||
msr_set_bit(MSR_F10H_DECFG,
|
||||
MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
|
||||
msr_set_bit(MSR_AMD64_DE_CFG,
|
||||
MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT);
|
||||
|
||||
/* A serializing LFENCE stops RDTSC speculation */
|
||||
set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
|
||||
|
||||
@@ -2709,9 +2709,9 @@ static int svm_get_msr_feature(struct kvm_msr_entry *msr)
|
||||
msr->data = 0;
|
||||
|
||||
switch (msr->index) {
|
||||
case MSR_F10H_DECFG:
|
||||
if (boot_cpu_has(X86_FEATURE_LFENCE_RDTSC))
|
||||
msr->data |= MSR_F10H_DECFG_LFENCE_SERIALIZE;
|
||||
case MSR_AMD64_DE_CFG:
|
||||
if (cpu_feature_enabled(X86_FEATURE_LFENCE_RDTSC))
|
||||
msr->data |= MSR_AMD64_DE_CFG_LFENCE_SERIALIZE;
|
||||
break;
|
||||
case MSR_IA32_PERF_CAPABILITIES:
|
||||
return 0;
|
||||
@@ -2812,7 +2812,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||
msr_info->data = 0x1E;
|
||||
}
|
||||
break;
|
||||
case MSR_F10H_DECFG:
|
||||
case MSR_AMD64_DE_CFG:
|
||||
msr_info->data = svm->msr_decfg;
|
||||
break;
|
||||
default:
|
||||
@@ -3041,7 +3041,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
|
||||
case MSR_VM_IGNNE:
|
||||
vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data);
|
||||
break;
|
||||
case MSR_F10H_DECFG: {
|
||||
case MSR_AMD64_DE_CFG: {
|
||||
struct kvm_msr_entry msr_entry;
|
||||
|
||||
msr_entry.index = msr->index;
|
||||
|
||||
@@ -1557,7 +1557,7 @@ static const u32 msr_based_features_all[] = {
|
||||
MSR_IA32_VMX_EPT_VPID_CAP,
|
||||
MSR_IA32_VMX_VMFUNC,
|
||||
|
||||
MSR_F10H_DECFG,
|
||||
MSR_AMD64_DE_CFG,
|
||||
MSR_IA32_UCODE_REV,
|
||||
MSR_IA32_ARCH_CAPABILITIES,
|
||||
MSR_IA32_PERF_CAPABILITIES,
|
||||
|
||||
@@ -519,6 +519,7 @@ static void pm_save_spec_msr(void)
|
||||
MSR_TSX_FORCE_ABORT,
|
||||
MSR_IA32_MCU_OPT_CTRL,
|
||||
MSR_AMD64_LS_CFG,
|
||||
MSR_AMD64_DE_CFG,
|
||||
};
|
||||
|
||||
msr_build_context(spec_msr_id, ARRAY_SIZE(spec_msr_id));
|
||||
|
||||
@@ -26,6 +26,7 @@ config MTD_ONENAND_OMAP2
|
||||
tristate "OneNAND on OMAP2/OMAP3 support"
|
||||
depends on ARCH_OMAP2 || ARCH_OMAP3 || (COMPILE_TEST && ARM)
|
||||
depends on OF || COMPILE_TEST
|
||||
depends on OMAP_GPMC
|
||||
help
|
||||
Support for a OneNAND flash device connected to an OMAP2/OMAP3 SoC
|
||||
via the GPMC memory controller.
|
||||
|
||||
@@ -5834,7 +5834,7 @@ nand_match_ecc_req(struct nand_chip *chip,
|
||||
int req_step = requirements->step_size;
|
||||
int req_strength = requirements->strength;
|
||||
int req_corr, step_size, strength, nsteps, ecc_bytes, ecc_bytes_total;
|
||||
int best_step, best_strength, best_ecc_bytes;
|
||||
int best_step = 0, best_strength = 0, best_ecc_bytes = 0;
|
||||
int best_ecc_bytes_total = INT_MAX;
|
||||
int i, j;
|
||||
|
||||
@@ -5915,7 +5915,7 @@ nand_maximize_ecc(struct nand_chip *chip,
|
||||
int step_size, strength, nsteps, ecc_bytes, corr;
|
||||
int best_corr = 0;
|
||||
int best_step = 0;
|
||||
int best_strength, best_ecc_bytes;
|
||||
int best_strength = 0, best_ecc_bytes = 0;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < caps->nstepinfos; i++) {
|
||||
|
||||
@@ -3167,16 +3167,18 @@ static int qcom_nand_host_init_and_register(struct qcom_nand_controller *nandc,
|
||||
|
||||
ret = mtd_device_parse_register(mtd, probes, NULL, NULL, 0);
|
||||
if (ret)
|
||||
nand_cleanup(chip);
|
||||
goto err;
|
||||
|
||||
if (nandc->props->use_codeword_fixup) {
|
||||
ret = qcom_nand_host_parse_boot_partitions(nandc, host, dn);
|
||||
if (ret) {
|
||||
nand_cleanup(chip);
|
||||
return ret;
|
||||
}
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
nand_cleanup(chip);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -2488,12 +2488,12 @@ static bool vfio_pci_dev_set_needs_reset(struct vfio_device_set *dev_set)
|
||||
struct vfio_pci_core_device *cur;
|
||||
bool needs_reset = false;
|
||||
|
||||
list_for_each_entry(cur, &dev_set->device_list, vdev.dev_set_list) {
|
||||
/* No VFIO device in the set can have an open device FD */
|
||||
if (cur->vdev.open_count)
|
||||
return false;
|
||||
/* No other VFIO device in the set can be open. */
|
||||
if (vfio_device_set_open_count(dev_set) > 1)
|
||||
return false;
|
||||
|
||||
list_for_each_entry(cur, &dev_set->device_list, vdev.dev_set_list)
|
||||
needs_reset |= cur->needs_reset;
|
||||
}
|
||||
return needs_reset;
|
||||
}
|
||||
|
||||
|
||||
@@ -125,6 +125,19 @@ static void vfio_release_device_set(struct vfio_device *device)
|
||||
xa_unlock(&vfio_device_set_xa);
|
||||
}
|
||||
|
||||
unsigned int vfio_device_set_open_count(struct vfio_device_set *dev_set)
|
||||
{
|
||||
struct vfio_device *cur;
|
||||
unsigned int open_count = 0;
|
||||
|
||||
lockdep_assert_held(&dev_set->lock);
|
||||
|
||||
list_for_each_entry(cur, &dev_set->device_list, dev_set_list)
|
||||
open_count += cur->open_count;
|
||||
return open_count;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vfio_device_set_open_count);
|
||||
|
||||
/*
|
||||
* Group objects - create, release, get, put, search
|
||||
*/
|
||||
@@ -801,8 +814,9 @@ static struct file *vfio_device_open(struct vfio_device *device)
|
||||
err_close_device:
|
||||
mutex_lock(&device->dev_set->lock);
|
||||
mutex_lock(&device->group->group_lock);
|
||||
if (device->open_count == 1 && device->ops->close_device) {
|
||||
device->ops->close_device(device);
|
||||
if (device->open_count == 1) {
|
||||
if (device->ops->close_device)
|
||||
device->ops->close_device(device);
|
||||
|
||||
vfio_device_container_unregister(device);
|
||||
}
|
||||
@@ -1017,10 +1031,12 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep)
|
||||
mutex_lock(&device->dev_set->lock);
|
||||
vfio_assert_device_open(device);
|
||||
mutex_lock(&device->group->group_lock);
|
||||
if (device->open_count == 1 && device->ops->close_device)
|
||||
device->ops->close_device(device);
|
||||
if (device->open_count == 1) {
|
||||
if (device->ops->close_device)
|
||||
device->ops->close_device(device);
|
||||
|
||||
vfio_device_container_unregister(device);
|
||||
vfio_device_container_unregister(device);
|
||||
}
|
||||
mutex_unlock(&device->group->group_lock);
|
||||
device->open_count--;
|
||||
if (device->open_count == 0)
|
||||
|
||||
@@ -75,11 +75,15 @@ static void erofs_fscache_rreq_unlock_folios(struct netfs_io_request *rreq)
|
||||
|
||||
rcu_read_lock();
|
||||
xas_for_each(&xas, folio, last_page) {
|
||||
unsigned int pgpos =
|
||||
(folio_index(folio) - start_page) * PAGE_SIZE;
|
||||
unsigned int pgend = pgpos + folio_size(folio);
|
||||
unsigned int pgpos, pgend;
|
||||
bool pg_failed = false;
|
||||
|
||||
if (xas_retry(&xas, folio))
|
||||
continue;
|
||||
|
||||
pgpos = (folio_index(folio) - start_page) * PAGE_SIZE;
|
||||
pgend = pgpos + folio_size(folio);
|
||||
|
||||
for (;;) {
|
||||
if (!subreq) {
|
||||
pg_failed = true;
|
||||
@@ -287,22 +291,25 @@ static int erofs_fscache_data_read(struct address_space *mapping,
|
||||
return PTR_ERR(src);
|
||||
|
||||
iov_iter_xarray(&iter, READ, &mapping->i_pages, pos, PAGE_SIZE);
|
||||
if (copy_to_iter(src + offset, size, &iter) != size)
|
||||
if (copy_to_iter(src + offset, size, &iter) != size) {
|
||||
erofs_put_metabuf(&buf);
|
||||
return -EFAULT;
|
||||
}
|
||||
iov_iter_zero(PAGE_SIZE - size, &iter);
|
||||
erofs_put_metabuf(&buf);
|
||||
return PAGE_SIZE;
|
||||
}
|
||||
|
||||
count = min_t(size_t, map.m_llen - (pos - map.m_la), len);
|
||||
DBG_BUGON(!count || count % PAGE_SIZE);
|
||||
|
||||
if (!(map.m_flags & EROFS_MAP_MAPPED)) {
|
||||
count = len;
|
||||
iov_iter_xarray(&iter, READ, &mapping->i_pages, pos, count);
|
||||
iov_iter_zero(count, &iter);
|
||||
return count;
|
||||
}
|
||||
|
||||
count = min_t(size_t, map.m_llen - (pos - map.m_la), len);
|
||||
DBG_BUGON(!count || count % PAGE_SIZE);
|
||||
|
||||
mdev = (struct erofs_map_dev) {
|
||||
.m_deviceid = map.m_deviceid,
|
||||
.m_pa = map.m_pa,
|
||||
@@ -403,13 +410,13 @@ static void erofs_fscache_domain_put(struct erofs_domain *domain)
|
||||
static int erofs_fscache_register_volume(struct super_block *sb)
|
||||
{
|
||||
struct erofs_sb_info *sbi = EROFS_SB(sb);
|
||||
char *domain_id = sbi->opt.domain_id;
|
||||
char *domain_id = sbi->domain_id;
|
||||
struct fscache_volume *volume;
|
||||
char *name;
|
||||
int ret = 0;
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "erofs,%s",
|
||||
domain_id ? domain_id : sbi->opt.fsid);
|
||||
domain_id ? domain_id : sbi->fsid);
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -435,7 +442,7 @@ static int erofs_fscache_init_domain(struct super_block *sb)
|
||||
if (!domain)
|
||||
return -ENOMEM;
|
||||
|
||||
domain->domain_id = kstrdup(sbi->opt.domain_id, GFP_KERNEL);
|
||||
domain->domain_id = kstrdup(sbi->domain_id, GFP_KERNEL);
|
||||
if (!domain->domain_id) {
|
||||
kfree(domain);
|
||||
return -ENOMEM;
|
||||
@@ -472,7 +479,7 @@ static int erofs_fscache_register_domain(struct super_block *sb)
|
||||
|
||||
mutex_lock(&erofs_domain_list_lock);
|
||||
list_for_each_entry(domain, &erofs_domain_list, list) {
|
||||
if (!strcmp(domain->domain_id, sbi->opt.domain_id)) {
|
||||
if (!strcmp(domain->domain_id, sbi->domain_id)) {
|
||||
sbi->domain = domain;
|
||||
sbi->volume = domain->volume;
|
||||
refcount_inc(&domain->ref);
|
||||
@@ -609,7 +616,7 @@ struct erofs_fscache *erofs_domain_register_cookie(struct super_block *sb,
|
||||
struct erofs_fscache *erofs_fscache_register_cookie(struct super_block *sb,
|
||||
char *name, bool need_inode)
|
||||
{
|
||||
if (EROFS_SB(sb)->opt.domain_id)
|
||||
if (EROFS_SB(sb)->domain_id)
|
||||
return erofs_domain_register_cookie(sb, name, need_inode);
|
||||
return erofs_fscache_acquire_cookie(sb, name, need_inode);
|
||||
}
|
||||
@@ -641,7 +648,7 @@ int erofs_fscache_register_fs(struct super_block *sb)
|
||||
struct erofs_sb_info *sbi = EROFS_SB(sb);
|
||||
struct erofs_fscache *fscache;
|
||||
|
||||
if (sbi->opt.domain_id)
|
||||
if (sbi->domain_id)
|
||||
ret = erofs_fscache_register_domain(sb);
|
||||
else
|
||||
ret = erofs_fscache_register_volume(sb);
|
||||
@@ -649,7 +656,7 @@ int erofs_fscache_register_fs(struct super_block *sb)
|
||||
return ret;
|
||||
|
||||
/* acquired domain/volume will be relinquished in kill_sb() on error */
|
||||
fscache = erofs_fscache_register_cookie(sb, sbi->opt.fsid, true);
|
||||
fscache = erofs_fscache_register_cookie(sb, sbi->fsid, true);
|
||||
if (IS_ERR(fscache))
|
||||
return PTR_ERR(fscache);
|
||||
|
||||
|
||||
@@ -75,8 +75,6 @@ struct erofs_mount_opts {
|
||||
unsigned int max_sync_decompress_pages;
|
||||
#endif
|
||||
unsigned int mount_opt;
|
||||
char *fsid;
|
||||
char *domain_id;
|
||||
};
|
||||
|
||||
struct erofs_dev_context {
|
||||
@@ -89,6 +87,8 @@ struct erofs_dev_context {
|
||||
struct erofs_fs_context {
|
||||
struct erofs_mount_opts opt;
|
||||
struct erofs_dev_context *devs;
|
||||
char *fsid;
|
||||
char *domain_id;
|
||||
};
|
||||
|
||||
/* all filesystem-wide lz4 configurations */
|
||||
@@ -170,6 +170,8 @@ struct erofs_sb_info {
|
||||
struct fscache_volume *volume;
|
||||
struct erofs_fscache *s_fscache;
|
||||
struct erofs_domain *domain;
|
||||
char *fsid;
|
||||
char *domain_id;
|
||||
};
|
||||
|
||||
#define EROFS_SB(sb) ((struct erofs_sb_info *)(sb)->s_fs_info)
|
||||
|
||||
@@ -579,9 +579,9 @@ static int erofs_fc_parse_param(struct fs_context *fc,
|
||||
break;
|
||||
case Opt_fsid:
|
||||
#ifdef CONFIG_EROFS_FS_ONDEMAND
|
||||
kfree(ctx->opt.fsid);
|
||||
ctx->opt.fsid = kstrdup(param->string, GFP_KERNEL);
|
||||
if (!ctx->opt.fsid)
|
||||
kfree(ctx->fsid);
|
||||
ctx->fsid = kstrdup(param->string, GFP_KERNEL);
|
||||
if (!ctx->fsid)
|
||||
return -ENOMEM;
|
||||
#else
|
||||
errorfc(fc, "fsid option not supported");
|
||||
@@ -589,9 +589,9 @@ static int erofs_fc_parse_param(struct fs_context *fc,
|
||||
break;
|
||||
case Opt_domain_id:
|
||||
#ifdef CONFIG_EROFS_FS_ONDEMAND
|
||||
kfree(ctx->opt.domain_id);
|
||||
ctx->opt.domain_id = kstrdup(param->string, GFP_KERNEL);
|
||||
if (!ctx->opt.domain_id)
|
||||
kfree(ctx->domain_id);
|
||||
ctx->domain_id = kstrdup(param->string, GFP_KERNEL);
|
||||
if (!ctx->domain_id)
|
||||
return -ENOMEM;
|
||||
#else
|
||||
errorfc(fc, "domain_id option not supported");
|
||||
@@ -728,10 +728,12 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
|
||||
|
||||
sb->s_fs_info = sbi;
|
||||
sbi->opt = ctx->opt;
|
||||
ctx->opt.fsid = NULL;
|
||||
ctx->opt.domain_id = NULL;
|
||||
sbi->devs = ctx->devs;
|
||||
ctx->devs = NULL;
|
||||
sbi->fsid = ctx->fsid;
|
||||
ctx->fsid = NULL;
|
||||
sbi->domain_id = ctx->domain_id;
|
||||
ctx->domain_id = NULL;
|
||||
|
||||
if (erofs_is_fscache_mode(sb)) {
|
||||
sb->s_blocksize = EROFS_BLKSIZ;
|
||||
@@ -820,7 +822,7 @@ static int erofs_fc_get_tree(struct fs_context *fc)
|
||||
{
|
||||
struct erofs_fs_context *ctx = fc->fs_private;
|
||||
|
||||
if (IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && ctx->opt.fsid)
|
||||
if (IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && ctx->fsid)
|
||||
return get_tree_nodev(fc, erofs_fc_fill_super);
|
||||
|
||||
return get_tree_bdev(fc, erofs_fc_fill_super);
|
||||
@@ -834,6 +836,9 @@ static int erofs_fc_reconfigure(struct fs_context *fc)
|
||||
|
||||
DBG_BUGON(!sb_rdonly(sb));
|
||||
|
||||
if (ctx->fsid || ctx->domain_id)
|
||||
erofs_info(sb, "ignoring reconfiguration for fsid|domain_id.");
|
||||
|
||||
if (test_opt(&ctx->opt, POSIX_ACL))
|
||||
fc->sb_flags |= SB_POSIXACL;
|
||||
else
|
||||
@@ -873,8 +878,8 @@ static void erofs_fc_free(struct fs_context *fc)
|
||||
struct erofs_fs_context *ctx = fc->fs_private;
|
||||
|
||||
erofs_free_dev_context(ctx->devs);
|
||||
kfree(ctx->opt.fsid);
|
||||
kfree(ctx->opt.domain_id);
|
||||
kfree(ctx->fsid);
|
||||
kfree(ctx->domain_id);
|
||||
kfree(ctx);
|
||||
}
|
||||
|
||||
@@ -944,8 +949,8 @@ static void erofs_kill_sb(struct super_block *sb)
|
||||
erofs_free_dev_context(sbi->devs);
|
||||
fs_put_dax(sbi->dax_dev, NULL);
|
||||
erofs_fscache_unregister_fs(sb);
|
||||
kfree(sbi->opt.fsid);
|
||||
kfree(sbi->opt.domain_id);
|
||||
kfree(sbi->fsid);
|
||||
kfree(sbi->domain_id);
|
||||
kfree(sbi);
|
||||
sb->s_fs_info = NULL;
|
||||
}
|
||||
@@ -1098,10 +1103,10 @@ static int erofs_show_options(struct seq_file *seq, struct dentry *root)
|
||||
if (test_opt(opt, DAX_NEVER))
|
||||
seq_puts(seq, ",dax=never");
|
||||
#ifdef CONFIG_EROFS_FS_ONDEMAND
|
||||
if (opt->fsid)
|
||||
seq_printf(seq, ",fsid=%s", opt->fsid);
|
||||
if (opt->domain_id)
|
||||
seq_printf(seq, ",domain_id=%s", opt->domain_id);
|
||||
if (sbi->fsid)
|
||||
seq_printf(seq, ",fsid=%s", sbi->fsid);
|
||||
if (sbi->domain_id)
|
||||
seq_printf(seq, ",domain_id=%s", sbi->domain_id);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -210,14 +210,14 @@ int erofs_register_sysfs(struct super_block *sb)
|
||||
int err;
|
||||
|
||||
if (erofs_is_fscache_mode(sb)) {
|
||||
if (sbi->opt.domain_id) {
|
||||
str = kasprintf(GFP_KERNEL, "%s,%s", sbi->opt.domain_id,
|
||||
sbi->opt.fsid);
|
||||
if (sbi->domain_id) {
|
||||
str = kasprintf(GFP_KERNEL, "%s,%s", sbi->domain_id,
|
||||
sbi->fsid);
|
||||
if (!str)
|
||||
return -ENOMEM;
|
||||
name = str;
|
||||
} else {
|
||||
name = sbi->opt.fsid;
|
||||
name = sbi->fsid;
|
||||
}
|
||||
} else {
|
||||
name = sb->s_id;
|
||||
|
||||
@@ -660,6 +660,9 @@ static int z_erofs_read_fragment(struct inode *inode, erofs_off_t pos,
|
||||
u8 *src, *dst;
|
||||
unsigned int i, cnt;
|
||||
|
||||
if (!packed_inode)
|
||||
return -EFSCORRUPTED;
|
||||
|
||||
pos += EROFS_I(inode)->z_fragmentoff;
|
||||
for (i = 0; i < len; i += cnt) {
|
||||
cnt = min_t(unsigned int, len - i,
|
||||
|
||||
@@ -17,9 +17,9 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
|
||||
{
|
||||
struct netfs_io_subrequest *subreq;
|
||||
struct folio *folio;
|
||||
unsigned int iopos, account = 0;
|
||||
pgoff_t start_page = rreq->start / PAGE_SIZE;
|
||||
pgoff_t last_page = ((rreq->start + rreq->len) / PAGE_SIZE) - 1;
|
||||
size_t account = 0;
|
||||
bool subreq_failed = false;
|
||||
|
||||
XA_STATE(xas, &rreq->mapping->i_pages, start_page);
|
||||
@@ -39,18 +39,23 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
|
||||
*/
|
||||
subreq = list_first_entry(&rreq->subrequests,
|
||||
struct netfs_io_subrequest, rreq_link);
|
||||
iopos = 0;
|
||||
subreq_failed = (subreq->error < 0);
|
||||
|
||||
trace_netfs_rreq(rreq, netfs_rreq_trace_unlock);
|
||||
|
||||
rcu_read_lock();
|
||||
xas_for_each(&xas, folio, last_page) {
|
||||
unsigned int pgpos = (folio_index(folio) - start_page) * PAGE_SIZE;
|
||||
unsigned int pgend = pgpos + folio_size(folio);
|
||||
loff_t pg_end;
|
||||
bool pg_failed = false;
|
||||
|
||||
if (xas_retry(&xas, folio))
|
||||
continue;
|
||||
|
||||
pg_end = folio_pos(folio) + folio_size(folio) - 1;
|
||||
|
||||
for (;;) {
|
||||
loff_t sreq_end;
|
||||
|
||||
if (!subreq) {
|
||||
pg_failed = true;
|
||||
break;
|
||||
@@ -58,11 +63,11 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
|
||||
if (test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags))
|
||||
folio_start_fscache(folio);
|
||||
pg_failed |= subreq_failed;
|
||||
if (pgend < iopos + subreq->len)
|
||||
sreq_end = subreq->start + subreq->len - 1;
|
||||
if (pg_end < sreq_end)
|
||||
break;
|
||||
|
||||
account += subreq->transferred;
|
||||
iopos += subreq->len;
|
||||
if (!list_is_last(&subreq->rreq_link, &rreq->subrequests)) {
|
||||
subreq = list_next_entry(subreq, rreq_link);
|
||||
subreq_failed = (subreq->error < 0);
|
||||
@@ -70,7 +75,8 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
|
||||
subreq = NULL;
|
||||
subreq_failed = false;
|
||||
}
|
||||
if (pgend == iopos)
|
||||
|
||||
if (pg_end == sreq_end)
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -121,6 +121,9 @@ static void netfs_rreq_unmark_after_write(struct netfs_io_request *rreq,
|
||||
XA_STATE(xas, &rreq->mapping->i_pages, subreq->start / PAGE_SIZE);
|
||||
|
||||
xas_for_each(&xas, folio, (subreq->start + subreq->len - 1) / PAGE_SIZE) {
|
||||
if (xas_retry(&xas, folio))
|
||||
continue;
|
||||
|
||||
/* We might have multiple writes from the same huge
|
||||
* folio, but we mustn't unlock a folio more than once.
|
||||
*/
|
||||
|
||||
@@ -189,6 +189,7 @@ int vfio_register_emulated_iommu_dev(struct vfio_device *device);
|
||||
void vfio_unregister_group_dev(struct vfio_device *device);
|
||||
|
||||
int vfio_assign_device_set(struct vfio_device *device, void *set_id);
|
||||
unsigned int vfio_device_set_open_count(struct vfio_device_set *dev_set);
|
||||
|
||||
int vfio_mig_get_next_state(struct vfio_device *device,
|
||||
enum vfio_device_mig_state cur_fsm,
|
||||
|
||||
@@ -535,6 +535,11 @@
|
||||
#define MSR_AMD64_CPUID_FN_1 0xc0011004
|
||||
#define MSR_AMD64_LS_CFG 0xc0011020
|
||||
#define MSR_AMD64_DC_CFG 0xc0011022
|
||||
|
||||
#define MSR_AMD64_DE_CFG 0xc0011029
|
||||
#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT 1
|
||||
#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE BIT_ULL(MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT)
|
||||
|
||||
#define MSR_AMD64_BU_CFG2 0xc001102a
|
||||
#define MSR_AMD64_IBSFETCHCTL 0xc0011030
|
||||
#define MSR_AMD64_IBSFETCHLINAD 0xc0011031
|
||||
@@ -640,9 +645,6 @@
|
||||
#define FAM10H_MMIO_CONF_BASE_MASK 0xfffffffULL
|
||||
#define FAM10H_MMIO_CONF_BASE_SHIFT 20
|
||||
#define MSR_FAM10H_NODE_ID 0xc001100c
|
||||
#define MSR_F10H_DECFG 0xc0011029
|
||||
#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT 1
|
||||
#define MSR_F10H_DECFG_LFENCE_SERIALIZE BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT)
|
||||
|
||||
/* K8 MSRs */
|
||||
#define MSR_K8_TOP_MEM1 0xc001001a
|
||||
|
||||
Reference in New Issue
Block a user