[PATCH v3] acpi, nfit: add support for NVDIMM_FAMILY_INTEL v1.6 DSMs
by Dan Williams
Per v1.6 of the NVDIMM_FAMILY_INTEL command set [1] some of the new
commands require rev-id 2. In addition to enabling ND_CMD_CALL for these
new function numbers, add a lookup table for revision-ids by family
and function number.
[1]: http://pmem.io/documents/NVDIMM_DSM_Interface-V1.6.pdf
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
---
Change since v2:
* fix the off-by one error sizing revid_table (Jerry)
drivers/acpi/nfit/core.c | 45 ++++++++++++++++++++++++++++++++++++++++-----
drivers/acpi/nfit/nfit.h | 26 +++++++++++++++++++++++++-
2 files changed, 65 insertions(+), 6 deletions(-)
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 444832b372ec..aa75d67ceee9 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -370,6 +370,32 @@ static union acpi_object *acpi_label_info(acpi_handle handle)
return pkg_to_buf(buf.pointer);
}
+static u8 nfit_dsm_revid(unsigned family, unsigned func)
+{
+ static const u8 revid_table[NVDIMM_FAMILY_MAX+1][32] = {
+ [NVDIMM_FAMILY_INTEL] = {
+ [NVDIMM_INTEL_GET_MODES] = 2,
+ [NVDIMM_INTEL_GET_FWINFO] = 2,
+ [NVDIMM_INTEL_START_FWUPDATE] = 2,
+ [NVDIMM_INTEL_SEND_FWUPDATE] = 2,
+ [NVDIMM_INTEL_FINISH_FWUPDATE] = 2,
+ [NVDIMM_INTEL_QUERY_FWUPDATE] = 2,
+ [NVDIMM_INTEL_SET_THRESHOLD] = 2,
+ [NVDIMM_INTEL_INJECT_ERROR] = 2,
+ },
+ };
+ u8 id;
+
+ if (family > NVDIMM_FAMILY_MAX)
+ return 0;
+ if (func > 31)
+ return 0;
+ id = revid_table[family][func];
+ if (id == 0)
+ return 1; /* default */
+ return id;
+}
+
int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
unsigned int cmd, void *buf, unsigned int buf_len, int *cmd_rc)
{
@@ -468,8 +494,15 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
out_obj = acpi_label_write(handle, p->in_offset, p->in_length,
p->in_buf);
- } else
- out_obj = acpi_evaluate_dsm(handle, guid, 1, func, &in_obj);
+ } else {
+ u8 revid;
+
+ if (nfit_mem)
+ revid = nfit_dsm_revid(nfit_mem->family, func);
+ else
+ revid = 1;
+ out_obj = acpi_evaluate_dsm(handle, guid, revid, func, &in_obj);
+ }
if (!out_obj) {
dev_dbg(dev, "%s:%s _DSM failed cmd: %s\n", __func__, dimm_name,
@@ -1640,7 +1673,7 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
* different command sets. Note, that checking for function0 (bit0)
* tells us if any commands are reachable through this GUID.
*/
- for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_MSFT; i++)
+ for (i = 0; i <= NVDIMM_FAMILY_MAX; i++)
if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 1))
if (family < 0 || i == default_dsm_family)
family = i;
@@ -1650,7 +1683,7 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
if (override_dsm_mask && !disable_vendor_specific)
dsm_mask = override_dsm_mask;
else if (nfit_mem->family == NVDIMM_FAMILY_INTEL) {
- dsm_mask = 0x3fe;
+ dsm_mask = NVDIMM_INTEL_CMDMASK;
if (disable_vendor_specific)
dsm_mask &= ~(1 << ND_CMD_VENDOR);
} else if (nfit_mem->family == NVDIMM_FAMILY_HPE1) {
@@ -1670,7 +1703,9 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
guid = to_nfit_uuid(nfit_mem->family);
for_each_set_bit(i, &dsm_mask, BITS_PER_LONG)
- if (acpi_check_dsm(adev_dimm->handle, guid, 1, 1ULL << i))
+ if (acpi_check_dsm(adev_dimm->handle, guid,
+ nfit_dsm_revid(nfit_mem->family, i),
+ 1ULL << i))
set_bit(i, &nfit_mem->dsm_mask);
obj = acpi_label_info(adev_dimm->handle);
diff --git a/drivers/acpi/nfit/nfit.h b/drivers/acpi/nfit/nfit.h
index b987196bf132..341be9511d0e 100644
--- a/drivers/acpi/nfit/nfit.h
+++ b/drivers/acpi/nfit/nfit.h
@@ -24,7 +24,7 @@
/* ACPI 6.1 */
#define UUID_NFIT_BUS "2f10e7a4-9e91-11e4-89d3-123b93f75cba"
-/* http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf */
+/* http://pmem.io/documents/NVDIMM_DSM_Interface-V1.6.pdf */
#define UUID_NFIT_DIMM "4309ac30-0d11-11e4-9191-0800200c9a66"
/* https://github.com/HewlettPackard/hpe-nvm/blob/master/Documentation/ */
@@ -38,12 +38,36 @@
| ACPI_NFIT_MEM_RESTORE_FAILED | ACPI_NFIT_MEM_FLUSH_FAILED \
| ACPI_NFIT_MEM_NOT_ARMED | ACPI_NFIT_MEM_MAP_FAILED)
+#define NVDIMM_FAMILY_MAX NVDIMM_FAMILY_MSFT
+
#define NVDIMM_STANDARD_CMDMASK \
(1 << ND_CMD_SMART | 1 << ND_CMD_SMART_THRESHOLD | 1 << ND_CMD_DIMM_FLAGS \
| 1 << ND_CMD_GET_CONFIG_SIZE | 1 << ND_CMD_GET_CONFIG_DATA \
| 1 << ND_CMD_SET_CONFIG_DATA | 1 << ND_CMD_VENDOR_EFFECT_LOG_SIZE \
| 1 << ND_CMD_VENDOR_EFFECT_LOG | 1 << ND_CMD_VENDOR)
+/*
+ * Command numbers that the kernel needs to know about to handle
+ * non-default DSM revision ids
+ */
+enum nvdimm_family_cmds {
+ NVDIMM_INTEL_GET_MODES = 11,
+ NVDIMM_INTEL_GET_FWINFO = 12,
+ NVDIMM_INTEL_START_FWUPDATE = 13,
+ NVDIMM_INTEL_SEND_FWUPDATE = 14,
+ NVDIMM_INTEL_FINISH_FWUPDATE = 15,
+ NVDIMM_INTEL_QUERY_FWUPDATE = 16,
+ NVDIMM_INTEL_SET_THRESHOLD = 17,
+ NVDIMM_INTEL_INJECT_ERROR = 18,
+};
+
+#define NVDIMM_INTEL_CMDMASK \
+(NVDIMM_STANDARD_CMDMASK | 1 << NVDIMM_INTEL_GET_MODES \
+ | 1 << NVDIMM_INTEL_GET_FWINFO | 1 << NVDIMM_INTEL_START_FWUPDATE \
+ | 1 << NVDIMM_INTEL_SEND_FWUPDATE | 1 << NVDIMM_INTEL_FINISH_FWUPDATE \
+ | 1 << NVDIMM_INTEL_QUERY_FWUPDATE | 1 << NVDIMM_INTEL_SET_THRESHOLD \
+ | 1 << NVDIMM_INTEL_INJECT_ERROR)
+
enum nfit_uuids {
/* for simplicity alias the uuid index with the family id */
NFIT_DEV_DIMM = NVDIMM_FAMILY_INTEL,
3 years, 2 months
回复:绩效体系的设计以及推进方式
by 冯客
linux-nvdimm
绩效考核暨KPI+BSC 实战训练营
课程目的:
韩非子曾经说过, “人主将欲禁奸,则审合刑名者,言与事也。为人臣者陈而言,君以其言授之事,专以其事责其功。功当其事,事当其言,则赏;功不当其事,事不当其言, 则罚。故群臣其言大而功小者则罚,非罚小功也,罚功不当名也;群臣其言小而 功大者亦罚,非不说于大功也,以为不当名也,害甚于有大功,故罚。”
大概意思就是,君主要领导要辨别下属的好坏,就让下属自己定目标,定了目标,实现了就奖赏,没有实现则惩罚。但是,大大超过了自己定的目标,也处罚,因为他故意定低了目标。这是我们祖先对考核最初的看法。韩非说起来容易,但是实际操作起来,确很难。首先,按照什么来定目标?目标定高和低,可能和外部因素有很大关系,如何过滤?按照韩非的说法,目标要定的很准确才可以,但是,短期目标可以准确,有几个企业能把年度目标定的这么准确呢?另外,不同的下属,定不同的目标,赏罚到一个什么样的程度才好?如何解决他们之间的公平问题呢?
关于绩效与目标的话题,虽然过了几千年,但是在我们的工作中依然存在。现实工作中,从理念的角度讲,都对,但是,一旦去落实,就会遇到很多实际的问题。
问题一、运用事实评价还是运用感觉评价
初一看这个问题,一般人的反应当然是运用事实评价,但是,你是否会想到,运用事实评价你会遇到一个问题,就是你所搜集到的事实,都会受到客观因素的影响,换句话说,总会又外部因素影响我们的评价。比如:销售收入是一个评价销售经理业绩的事实标准,销售收入除了受到销售经理自身的努力影响以外,产品质量、创新程度、交货期等等,都会影响销售经理销售收入目标的实现。如果销售收入目标一旦没有实现,销售肯定会找出诸如此类一大堆理由来证明销售目标没有实现,不是自己的原因造成的。其实,任何一个事实标准都会遇到此类问题。所以,看来运用事实评价存在一定的问题,那么,用感觉评价就没有问题了吗?回答是否定的,运用感觉评价问题会更多,因为不同人,对待同样一个事情的感觉是两样的。
那么,到底是用事实评价,还是用感觉来评价呢?
问题二:职能部门该如何考核与评价
每次培训,这是必有学员问起来的一个问题,因为业务部门的KPI指标,相对而言比较量化,但是职能部门很难找一些量化的指标,及时找到了,指标的可控性也很差。在很多企业里面,经常看到用劳动生产率,人均利润之类的KPI指标考核职能部门,如果这样考核,那么运气的成分就很大了,和努力程度关联性不大,那么,职能部门的KPI改如何操作?
如何解决关键业绩与非关键业绩的矛盾呢?
问题三:为什么员工不愿意做的更好
很多企业制定目标的时候,你们发现员工很多员工明明可以大大的超过公司所规定的目标,但是他绝对不会这样做,因为这样做的会又两个不利于他的后果产生:第一,今年超额实现了目标,那么,明天会定更高的目标,实现目标的难度会大很多,第二,他做到太好,显的别的同事就太差了,他在这个团队内部是难以生存的。如何让员工制定更合理的目标呢?
问题四:短期考核与长期考核的内容是什么呢?
问题五:到底是员工自己定目标,还是上级给下级定目标?还是采用两者相互结合的模式呢??
问题六:是按照整体的业绩来考核每个人,还是按照个体的业绩来考核每个人?
总之,在绩效管理实施过程中,会遇到一系列类似的问题,如果这些问题不得到圆满的解决,绩效管理的效果也会打了很大的折扣。本次课程会围绕这些问题展开,主要讲述绩效体系的设计以及推进方式。
课程简介:
在很多企业进行培训的时候,很多企业管理者、hr经常会和我说,绩效管理很重要,不搞不行,但是,操作起来,又觉得效果很差。如何做绩效才更好?
这个问题很复杂,影响绩效的效果的因素也是多方面的。一般来说,推行绩效的三个产品,都会影响绩效的效果。
推行问题——经理人不支持
经理人做老好人
考核不公平
绩效效果差
绩效制度——用什么样的方法?
考核的周期多长?
是否要进行绩效排名?
谁和谁排名?
轮流坐庄怎么办?
…………
指标体系——公司的整体目标是什么?
公司指标如何与战略接轨?
团队业绩与个体业绩是什么关系?
责任无法分清楚怎么办?
…………
绩效合约——量化指标如何界定?
采购成本到底降低没有如何计算?
职能部门如何考核?
目标定多少?
目标是否要更改?
能否不定目标,达到定目标的效果?
…………
课程目标:掌握建立绩效制度、KPI体系与绩效合约的工具、方法、与注意问题;
培训内容:
推行KPI与绩效管理体系需要解决的三大问题
1、企业建立绩效体系所面临的方法问题;
以感觉为基础判断还是以事实为基础判断?
短期考核还是长期考核?
短期利益还是长期利益?
关键业绩还是非关键业绩?
绩效管理如何与战略接口?
KPI成绩与奖金挂钩的问题?
2、经理人与员工的认识对推行绩效管理的影响;
传统文化对绩效管理的影响
为什么不愿意实现大大超额目标
为什么推行绩效管理这么困难?
3、管理基础对推行KPI的影响
第一部分 绩效制度设计
一、绩效制度设计的总体思路
1、目的是起点
2、其次考核结果应该如何运用,激励效果如何
3、然后选择考核的方式与方法
4、没有公平制度推行不下去
二、绩效制度设计——考核所采用的方法
1、行为还是业绩
2、模糊感觉判断法;
3、关键事件法
4、360°评估;
5、强制分布法;
要不要排名?
绩效排名设几档才合理;
绩效排名每个档次设计什么比例才合理;
谁和谁排名几个三种常见的方式的优缺点设计;
部门人数很少怎么排名?
主管是否要和员工一起排名?
按照编制排名还是按照实际人数排名?
经理给员工轮流坐庄怎么办?
排名是要激励大多数,还是激励一小部分人?
排名的程序
6、kpi与okr;
7、几种方法之间的关系
三、绩效管理的周期
1、短期考核与长期考核
2、短期与长期如何结合
3、长期考核成绩就是短期考核的平均吗?
四、绩效制度每个章节需要什么内容
1、绩效管理的总则
2、绩效计划
3、绩效辅导
4、考核评价
5、绩效改进
第二部分如何建立公司以业绩为核心的指标体系与绩效合同
一、KPI操作中的几个基本问题
1、什么是目标与指标
2、KPI指标的基本属性与操作注意要点
为什么评价起来感觉很难操作——刻度问题;
他们为什么不接受这些考核指标——可控性问题
为什么考核这些指标后适得其反——行为问题
选择kpi的维度
有效性
操作成本
区分度
二、平衡计分卡——公司整体指标的设计
1、什么是平衡计分卡;
2、企业操作平衡计分卡的误区;
3、战略与平衡计分卡有什么关系?——战略与战略地图;
4、如何编制战略地图
5、战略地图编制需要注意的10个问题
6、平衡计算分卡落实的三种方式;
三.如何分解KPI
KPI如果不分解落实下去,就会失去了基础,但是分解KPI的过程中会遇到很多问题,比如:一个kpi指标和好多部门都有关系,到底考核谁好呢?
如何解决这些问题呢?如何将KPI分解落实下去呢?
1、指标分解所需要解决的问题
团队业绩与个体业绩之间的矛盾
2、分解指标的2种基本思想
按照驱动因素分解指标;
按照责任人分解指标;
3、按照驱动因素分解KPI指标,上级指标与下级指标之间的关系
4、按照驱动因素分解的四种方法
按照指标的结构分解法;
OAM分解法;
贡献路径图法;
流程关键控制点法;
四种方法的优缺点;
企业如何结合自己的实际情况选择分解的方法;
5、分解KPI指标的注意问题:
权利对指标分解的影响、
组织结构的影响、
职责划分对指标分解的影响
硬件条件与软件条件对指标分解的影响
四.指标词典的编制
指标找到了就万事大吉了?还存在什么问题呢?为什么需要定义KPI,怎样定义KPI?
1、为什么需要定义KPI
2、财务指标定义时,需要注意的问题;
收入类指标需要注意的问题
成本指标考核需要注意的问题
费用类指标需要注意的问题
3、非财务指标,定义时需要注意的问题;
4、谁来提供数据——自己提供,别人提供,利益相关者提供?
五、任务指标如何定义
职能部门的指标,有些无法量化,该如何定义?
1、职能部门工作的特点;
2、什么是任务指标;
3、难度不同的任务考核
4、工作量不均衡如何处理?
5、谁来制定任务?
6、临时任务多如何处理?
7、任务指标的定义模式;
8、不同领导对员工考核,把我制度不一样要如何处理?
六.目标值的确定
找到了衡量指标就可以了嘛?如何确定目标呢?超过了目标应该计多少分?没有达到目标应该得多少分?
1、设定目标的痛苦;
2、没有历史数据怎么办?
先定目标在修改,还是先不考核,先积累数据再考核?
3、原点法定目标?还是突破发定目标?
4、原点法需要注意的问题:一刀切?回归分析?
5、突破法定目标需要注意的问题:预测的不准确,是否要修改目标?
6、能不能不定目标,让员工你追我赶——赛马法
7、资源配置对目标设定的影响;
8、淡季旺季,对目标设定的影响;
9、制定目标的程序
10、目标冲突的处理
七、KPI的计分方式
1、计分规则有哪些类别
比率法;
层差法;
说明法;
2、计分规则设计要素
要不要封顶?
难度不同怎么区分?
要不要倒扣分
不同计分规则设计的要素;
八.权重的设计
1、什么是指标的组合方式;
2、组合方式的种类;
3、设置权重的步骤与注意问题;
第三部分 推行绩效管理的问题与对策
推行绩效管理所遇到的问题与对策;
推行KPI不只是人力资源部门或者企管部门的事情,KPI在推行过程中有哪些问题与难点呢?
一、在公司推行绩效需要解决的问题
1、推行者需要能够逻辑自恰——自圆其说
2、经理人的观念问题
3、经理人的技巧问题
目标指标设定的技巧
绩效沟通的技巧
绩效辅导的技巧
二、推行需要注意的问题
1、最高领导的支持
2、同事们的支持
3、快乐考核与痛苦考核
4、推行的时机选择
内部压力与外部压力
三、推行绩效管理的策略
1、分层次推行与全员推行
2、局部试点与全员推行
3、与激励挂钩的比例问题
培训讲师:蔡巍
国内知名的人力资源管理实务专家,工商管理硕士,权威人力资源管理实战专家,特别在绩效与薪酬体系设计方面有很深的造诣,形成了自己特有的实战方法,从2000年开始从事咨询行业,积累的丰富的实战经验,蔡老师上课所讲述的案例,大多为自己亲自实践的企业,蔡老师于2005年进入培训行业,开始将自己的实践经验传授给众多企业,先后为汽车、家电、航空、电力、互联网、金融等众多行业提供咨询与培训服务。
在咨询培训之于,蔡老师拙作颇丰。2001年,在中华英才网绩效管理bbs里面,首发了《兔子与猎狗——人力资源管理的目标是什么》,于2002年,出版了第一本著作《奔跑的蜈蚣:如何以考核促进成长》、于2003年《吹口哨的黄牛:以薪酬留住人才》、2004年《KPI,“关键绩效”指引成功》、2005年《BSC,“平衡计分”保证发展》,2006年出版了《人力资源部》,2007年出版了《如何发奖金》受到企业的高度重视,和给予极高的评介。
蔡老师授课风格严禁务实,逻辑性强,上课从不讲述与主题无关的废话,注重实际操作。
培训采用案例研讨、情景模拟、视频教学等多种方式将复杂的原理深入浅出的传达给学员。
曾经辅导与参加过蔡老师培训的企业有:
百度、金信、伊利集团、浦东机场、青岛机场、深圳机场、深圳航空公司、中国国际航空公司、首都机场、中国中铁、大连港股份、神华集团天津煤码头、南方电网集团、广东电网、山西电网、云南电网、贵州电网、国华徐电、国华宁电、万家乐、老板电器、海信科龙、海信集团、创维、一汽集团总部、一汽马自达、一汽轿车、一汽吉林汽车、一汽大众、奥迪销售事业部、一汽汽车研究院、奔腾汽车销售公司、解放汽车、东风本田、奇瑞控股、奇瑞汽车、金龙客车、青岛黄岛城投公司、京基地产、兰江地产、武汉高创集团、和讯科技、新农化工、彩虹集团、好利来连锁、新感觉连锁、鹏开中国、青岛海悦地产、广州秀珀化工、振杰国际、仙琚制药、华宁服饰、久泰化工、大富豪家具、广西水电工程局。
时间地点:
11月10-11日上海 11月17-18日广州
12月08-09日北京 12月22-23日深圳
学员对象:董事长、总(副)经理、总监、企业中高阶主管及企业营销中高层管理人士。
费 用:4000元
报名咨询电话:0.755-6128.8035 0.10-5166.1863 0.21-3126.1580
在线咨询 QQ:6.9.8.3.4.3.6 手机:18890700600(微信同号)
3 years, 2 months
[PATCH v2 0/2] acpi, nfit: support for new NVDIMM_FAMILY_INTEL commands
by Dan Williams
Change since v1 [1]:
* Introduce NVDIMM_STANDARD_CMDMASK and NVDIMM_INTEL_CMDMASK to replace
magic number usage in the driver. (Dave)
[1]: https://lists.01.org/pipermail/linux-nvdimm/2017-October/013082.html
---
The latest version of the NVDIMM_FAMILY_INTEL command set adds support
for firmware updates and setting SMART health alarms / thresholds among
other things. Given that these are command payloads that will only ever
be issued by userspace we only wire up the command numbers and revision
ids for use through the ND_CMD_CALL interface.
---
Dan Williams (2):
acpi, nfit: hide unknown commands from nmemX/commands
acpi, nfit: add support for NVDIMM_FAMILY_INTEL v1.6 DSMs
drivers/acpi/nfit/core.c | 55 ++++++++++++++++++++++++++++++++++++++++------
drivers/acpi/nfit/nfit.h | 32 ++++++++++++++++++++++++++-
2 files changed, 79 insertions(+), 8 deletions(-)
3 years, 2 months
[ndctl PATCH] test/btt-errors: add a case to test with errors in btt metadata
by Vishal Verma
If the BTT metadata is unreadable due to a badblock, we should fail
gracefully. Add a case to make sure that an error injected into the map
causes an IO error when trying to read it.
Cc: Dan Williams <dan.j.williams(a)intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma(a)intel.com>
---
test/btt-errors.sh | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/test/btt-errors.sh b/test/btt-errors.sh
index aec0b9d..d3a4694 100755
--- a/test/btt-errors.sh
+++ b/test/btt-errors.sh
@@ -142,6 +142,30 @@ dd if=/dev/zero of=$MNT/$FILE oflag=direct bs=4096 count=1
# read again and that should succeed
dd if=$MNT/$FILE of=/dev/null iflag=direct bs=4096 count=1
+
+## ensure we get an EIO for errors in namespace metadata
+
+# reset everything to get a clean log
+$NDCTL disable-region -b "$BUS" all
+$NDCTL zero-labels -b "$BUS" all
+$NDCTL enable-region -b "$BUS" all
+dev="x"
+json=$($NDCTL create-namespace -b "$BUS" -t pmem -m sector)
+eval "$(echo "$json" | sed -e "$json2var")"
+[ $dev = "x" ] && echo "fail: $LINENO" && exit 1
+
+# insert error at an arbitrary offset in the map (sector 0)
+force_raw 1
+map=$(hexdump -s 96 -n 4 "/dev/$raw_bdev" | head -1 | cut -d' ' -f2-)
+map=$(tr -d ' ' <<< "0x${map#* }${map%% *}")
+bb_inj=$((map/512))
+$NDCTL inject-error --block="$bb_inj" --count=1 $dev
+force_raw 0
+
+# make sure reading the first block of the namespace fails
+: The following 'dd' is expected to hit an I/O Error
+dd if=/dev/$blockdev of=/dev/null iflag=direct bs=4096 count=1 && err $LINENO || true
+
# done, exit
$NDCTL disable-region -b "$BUS" all
$NDCTL zero-labels -b "$BUS" all
--
2.9.5
3 years, 2 months
[PATCH 0/17 v5] dax, ext4, xfs: Synchronous page faults
by Jan Kara
Hello,
here is the fifth version of my patches to implement synchronous page faults
for DAX mappings to make flushing of DAX mappings possible from userspace so
that they can be flushed on finer than page granularity and also avoid the
overhead of a syscall.
We use a new mmap flag MAP_SYNC to indicate that page faults for the mapping
should be synchronous. The guarantee provided by this flag is: While a block
is writeably mapped into page tables of this mapping, it is guaranteed to be
visible in the file at that offset also after a crash.
How I implement this is that ->iomap_begin() indicates by a flag that inode
block mapping metadata is unstable and may need flushing (use the same test as
whether fdatasync() has metadata to write). If yes, DAX fault handler refrains
from inserting / write-enabling the page table entry and returns special flag
VM_FAULT_NEEDDSYNC together with a PFN to map to the filesystem fault handler.
The handler then calls fdatasync() (vfs_fsync_range()) for the affected range
and after that calls DAX code to update the page table entry appropriately.
I did some basic performance testing on the patches over ramdisk - timed
latency of page faults when faulting 512 pages. I did several tests: with file
preallocated / with file empty, with background file copying going on / without
it, with / without MAP_SYNC (so that we get comparison). The results are
(numbers are in microseconds):
File preallocated, no background load no MAP_SYNC:
min=9 avg=10 max=46
8 - 15 us: 508
16 - 31 us: 3
32 - 63 us: 1
File preallocated, no background load, MAP_SYNC:
min=9 avg=10 max=47
8 - 15 us: 508
16 - 31 us: 2
32 - 63 us: 2
File empty, no background load, no MAP_SYNC:
min=21 avg=22 max=70
16 - 31 us: 506
32 - 63 us: 5
64 - 127 us: 1
File empty, no background load, MAP_SYNC:
min=40 avg=124 max=242
32 - 63 us: 1
64 - 127 us: 333
128 - 255 us: 178
File empty, background load, no MAP_SYNC:
min=21 avg=23 max=67
16 - 31 us: 507
32 - 63 us: 4
64 - 127 us: 1
File empty, background load, MAP_SYNC:
min=94 avg=112 max=181
64 - 127 us: 489
128 - 255 us: 23
So here we can see the difference between MAP_SYNC vs non MAP_SYNC is about
100-200 us when we need to wait for transaction commit in this setup.
Anyway, here are the patches and since Ross already posted his patches to test
the functionality, I think we are ready to get this merged. I've talked with
Dan and he said he could take the patches through his tree, I'd just like to
get a final ack from Christoph on the patch modifying mmap(2). Comments are
welcome.
Changes since v4:
* fixed couple of minor things in the manpage
* make legacy mmap flags always supported, remove them from mask declared
to be supported by ext4 and xfs
Changes since v3:
* updated some changelogs
* folded fs support for VM_SYNC flag into patches implementing the
functionality
* removed ->mmap_validate, use ->mmap_supported_flags instead
* added some Reviewed-by tags
* added manpage patch
Changes since v2:
* avoid unnecessary flushing of faulted page (Ross) - I've realized it makes no
sense to remeasure my benchmark results (after actually doing that and seeing
no difference, sigh) since I use ramdisk and not real PMEM HW and so flushes
are ignored.
* handle nojournal mode of ext4
* other smaller cleanups & fixes (Ross)
* factor larger part of finishing of synchronous fault into a helper (Christoph)
* reorder pfnp argument of dax_iomap_fault() (Christoph)
* add XFS support from Christoph
* use proper MAP_SYNC support in mmap(2)
* rebased on top of 4.14-rc4
Changes since v1:
* switched to using mmap flag MAP_SYNC
* cleaned up fault handlers to avoid passing pfn in vmf->orig_pte
* switched to not touching page tables before we are ready to insert final
entry as it was unnecessary and not really simplifying anything
* renamed fault flag to VM_FAULT_NEEDDSYNC
* other smaller fixes found by reviewers
Honza
3 years, 2 months