[PATCH] fs, dax: fix build warning for !CONFIG_FS_DAX_PMD case for dax_iomap_pmd_fault
by Dave Jiang
Stephen reported:
With just Linus' tree, today's linux-next build (powerpc ppc64_defconfig)
produced this warning:
fs/dax.c: In function 'dax_iomap_fault':
fs/dax.c:1462:35: warning: passing argument 2 of 'dax_iomap_pmd_fault' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
return dax_iomap_pmd_fault(vmf, ops);
^
fs/dax.c:1439:12: note: expected 'struct iomap_ops *' but argument is of type 'const struct iomap_ops *'
static int dax_iomap_pmd_fault(struct vm_fault *vmf, struct iomap_ops *ops)
^
Introduced by
commit a2d581675d48 ("mm,fs,dax: change ->pmd_fault to ->huge_fault")
which missed fixing up the !CONFIG_FS_DAX_PMD case.
Reported-by: Stephen Rothwell <sfr(a)canb.auug.org.au>
Signed-off-by: Dave Jiang <dave.jiang(a)intel.com>
---
fs/dax.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/dax.c b/fs/dax.c
index 5ae8b71..7436c98 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1436,7 +1436,8 @@ static int dax_iomap_pmd_fault(struct vm_fault *vmf,
return result;
}
#else
-static int dax_iomap_pmd_fault(struct vm_fault *vmf, struct iomap_ops *ops)
+static int dax_iomap_pmd_fault(struct vm_fault *vmf,
+ const struct iomap_ops *ops)
{
return VM_FAULT_FALLBACK;
}
5 years, 5 months
Re:如何帮助上司提升工作效率与品质
by 董捷勇
linux-nvdimm: 您好!
详 @ 细 @ 课 @ 程 @ 大 @ 纲
请 @ 您 @ 阅 @ 读 @ 附 @ 件 @ 内 @ 容
5 years, 5 months
Courier was not able to deliver your parcel (ID05987993, UPS)
by rapt13r3al3stat3@raptisrealestate.gr
Dear Customer,
Your item has arrived at February 23, but our courier was not able to deliver the parcel.
Please check the attachment for complete details!
Kind thanks,
Jacob Cook,
UPS Senior Office Manager.
5 years, 5 months
运用TOC设计流水生产线考察团-联想参观:席位火热预定中
by 金骋
------------------ 原始邮件 ------------------
发件人: "金骋";<jfgfl(a)sniz.net>;
发送时间: 2017-2-24/12:06:40
收件人: "linux-nvdimm"<linux-nvdimm(a)lists.01.org>;
《运用TOC设计流水生产线考察团-联想参观》
上课时间:2017年03月03-04日 地点:深圳 山水酒店罗湖口岸店
课程费用:3880元/人(含资料费、专家演讲费、会务费)住宿可统一安排,费用自理
课程对象:工厂总经理、厂长、计划经理、主管及生产相关部门经理、主管、工程师
课程背景
生产瓶颈管理 (TOC - Theory Of Constraints) 近几年已成一股新的生产管理模式,许多企业在导入实施TOC后在短时间内即可产生显著的成效,例如制造时间大幅缩短,存货下降:福特汽车的电子部门其生产前置时间从10天降至16小时(2班),而且对客户的交期不再延误。 这些改变并不需巨额的投资,亦不需要改变现有工厂的布置或流程,所要改变的只是工厂的管理思维而已。
每一家工厂都有一个以上的限制,例如:产能不足,物料供应不足,市场需求不足等,其中有些限制是有形的,也有一些是无形的,例如:公司或工厂管理的政策或规定等,这些限制阻碍一家公司或工厂达到现在及未来赚更多钱的目的。本课程讨论如何突破工厂有形及无形的限制(瓶颈),以期达成其预定的目标。
此次培训我们将带您走进高科技龙头企业「联想」Lenovo于深圳厂房的现场! 联想多次被业界评为“中国最佳精益实践企业”、“精益领袖”,它所实践的精益项目曾被美国质量学会(ASQ)评为“国际卓越精益项目(ITEA)”。
联想拥有世界一流的管理流程、处于业界领先地位的ERP系统、联想自主研发的Pro-M、Pro-Make、ECC生产物料控制系统等先进的供应链管理系统以及优秀的生产制造团队,这一切构成了联想深圳工厂独一无二竞争力,使其成为业界与联想其他工厂的学习标杆!
课程目标
1、学习TOC核心原理及如何通过推行TOC瓶颈管理来提升经营业绩
2、学习TOC管理实施步骤,从瓶颈管理切入剖析工厂制造成本,掌握通过TOC管理改善缩短制造周期及提升准时交付的方法
3、TOC流动生产目标管理,目标分解方法与技巧、达成监控及管理控制体系
4、掌握建立同步流动生产系统的方法,通过同步流动生产实施降低库存50%,减少企业资金占用、大幅缩短制造周期
5、均衡流动生产计划体系的编排原则、方法、实施技巧及过程控制体系与制度
6、TOC流动生产原则下的生产流水线设计方法,物料配送方法
7、辅导案例分享:老师正在推行TOC流动生产管理的企业案例分享
8、参观著名的高科技企业「联想」于深圳的工厂,感受应用TOC及精益管理在现场的呈现,并与联想的工程师深入交流日常管理的运用及推行方法;
培训形式
企业资料现场诊断和实作对策、学员与讲师互动相辅而成,不是纯粹填鸭灌输,也不是研究客观案例,而是让学员体验执行过程,关注现实事例。
课程大纲
第一部分:TOC及工厂目标管理
TOC定义及其原理
1、TOC瓶颈管理的含义
2、工厂运营中的瓶颈制约因素
3、瓶颈管理的基本原理
4、TOC原理企业运营诊断技术
a.透过现场表像看企业管理的内在问题
5、TOC的发展及其对企业经营的贡献
TOC工厂运营目标管理
1、工厂运营管理的三大核心目标
2、运营目标与企业财务报表的内在关联
3、TOC工厂管理的三大指标
4、三大指标的相互关联与作用
5、瓶颈制约因素对三大指标的影响
TOC管理团队与目标分解
1、传统组织结构与TOC团队结构的区别
2、管理成员的组织分工与工作关系
3、目标的确定及目标分解
4、目标达成监控及绩效管理要点
第二部分:TOC流动生产计划管理
工序间流动生产价值流图分析
1、价值流图的含义及生产流动性评价
2、如何从价值流图识别瓶颈工序
3、价值流图展现的流动生产制约因素
小组案例:价值流(VSM)TOC分析
TOC流动生产计划排单
1、工厂计划管理的不同模式分析
2、不同计划管理模式的优缺点
3、计划管理模式对订单交付及效率的影响
4、TOC流动生产计划排单的特点
5、流动计划排单编排的方法与步骤
5、流动计划排单的格式设计及排单频率
7、多品种、少批量均衡排单原则
8、均衡性、连续性、制约优先的排单原则运用
TOC流动生产DBR系统设计
1、DBR系统原理与控制方法
2、TOC运用DBR管理原则
3、衡量流动生产执行状况的三大指标
a.工序WIP、日产出、小时均衡产出
4、三大指标执行过程中的管控要点
5、工序间半成品的转移过数管理与控制
6、急单、插单及延期风险订单管理
7、生产排单执行异常跟进与改善
第三部份:流动生产及生产流水线
制造工厂的不同生产模式
1、传统工序专业化生产模式优缺点
2、工序流动生产组织模式的特点
3、工序流动生产模式在TOC管理中的运用
工序流动生产模式设计方法
1、工序产能分析及瓶颈识别
2、生产能力均衡及资源分配原则
3、工序间WIP最少原则及控制方法
4、工序间半成品流动周转系统设计
5、加快工序半成品流转的方法与技巧
DFT 流水线设计方法
1、工作分解SOE
2、工位设计与产线平衡
3、KANBAN 设计与运行管理
4、工位在线物料配送
Q&A 学员提问与答复
第四部份:精益工厂标杆企业参观学习
联想 (Lenovo)文化介绍分享
1、联想的创业精神
2、联想的精益6西格玛及持续改善体系
联想生产现场参观
1、90%的订单根据客户需求订制,每天订单量2000-5000张,50台以下的小订单占比60%,「多种小量」却能在一条流水在线实现,达到订单与订单之间的无缝衔接;
2、自我研发的Pro-Kitting,Pro-Make系统,让复杂的定制化计算机产品生产过程无差错
3、现场6S及改善宣传目视化展示
4、装配流水线 (One Piece Flow) 配送体系
5、单元化生产线运作 (Cell Line)
6、供货商VMI仓库管理
7、自动化生产 (Automation) 设备实施的运用
8、现场质量管理及目视化展示板
9、现场员工绩效管理:葡萄图的运用
联想精益物流体系参观
1、实现零库存 (产品遍布160多个国家,20000多个地区)
2、物料产品的接收、储存、保管、包装、装车发货流程
3、供货商JIT供货体系现场运用
4、如何做到WIP只停留在仓库6小时?
5、自动化包装、物流自动化分装发货体系
联想管理层 / 工程师与学员交流
1、联想管理人员:生产、物流、质量
2、学员互动问题解答
主讲老师:罗老师
香港生产力促进局及香港工业总会特约讲师。国内著名大学机械工程学士、工商管理硕士(MBA),拥有近十年著名企业生产、工程及质量经理经验,精益生产及6西格玛实施专家。
罗历任世界500强FLEXTRONICS企业之供货商质量、IE工程、精益生产及六西格玛高级经理、亚洲最大的精密五金冲压注塑产品服务提供商AMTEK生产及工程经理及著名港资EMS企业NAMTAI GROUP生产工程经理。
辅导案例介绍:
于伟创力(FLEXTRONICS)独立完成6个黑带项目和推行精益生产系统及指导企业内部管理改善,领导团队为企业节省近500万美元成本及生产效率提升约25%。
为美的(MIDEA)日电集团下属的: 微波电器、洗碗机、热水器、厨房电器、风扇全面推行精益运营管理,并指定罗老师为独家咨询人。
带领团队进驻阿波罗(APOLLO)实施精益流程改善项目,揭开阿波罗这家大型民营企业的改革序目,效率4个月内提升50%以上。
为台资美律电子(MERRY SOUND)提供精益生产咨询辅导服务;主要生产线效率提升20%以上。
辅导深圳瑞视光电(RAECE),3个月在制品WIP降低50%;生产周期缩短30%以上;主要制程生产效率提升20%以上。
辅导深圳市秋田微电子集团(AV-DISPLAY)实施TOC管理改善,两年来生产效率提升超过50%;产品质量改善:良率由80%提升至90%以上……
报名回执
课程名称
上课时间 上课地点
公司名称(发票抬头)
联 系 人 部门/职务
联系电话 手机号码
电子邮箱(接收开课通知书,非常重要)
参会学员姓名职务性别联系电话&手机Email
参会人数:_________人,费用合计:_________元; 付款方式:□ 转帐 □ 现金
发票类别: □ 增值税普通发票 □ 增值税专用发票(需提供一般纳税人开票资料)
报名咨询电话:0755-61288035 赵先生
在线咨询 QQ:6983436 报名信箱:6983436(a)qq.com (报名请回复报名表)
5 years, 5 months
Problem with parcel shipping, ID:003133060
by www-data
Dear Customer,
Your parcel was successfully delivered February 22 to UPS Station, but our courier cound not contact you.
You can download the shipment label attached!
With sincere appreciation,
Rafael Craig,
UPS Station Manager.
5 years, 5 months
[PATCH v2] device-dax: fix cdev leak
by Dan Williams
If device_add() fails, cleanup the cdev. Otherwise, we leak a kobj_map()
with a stale device number.
As Jason points out, there is a small possibility that userspace has
opened and mapped the device in the time between cdev_add() and the
device_add() failure. We need a new kill_dax_dev() helper to invalidate
any established mappings.
Fixes: ba09c01d2fa8 ("dax: convert to the cdev api")
Cc: <stable(a)vger.kernel.org>
Cc: Logan Gunthorpe <logang(a)deltatee.com>
Reported-by: Jason Gunthorpe <jgunthorpe(a)obsidianresearch.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
---
v2: handle the potential of userspace establishing mappings
between cdev_add() and device_add()
drivers/dax/dax.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
index ed758b74ddf0..b62a52fa3707 100644
--- a/drivers/dax/dax.c
+++ b/drivers/dax/dax.c
@@ -630,13 +630,10 @@ static void dax_dev_release(struct device *dev)
kfree(dax_dev);
}
-static void unregister_dax_dev(void *dev)
+static void kill_dax_dev(struct dax_dev *dax_dev)
{
- struct dax_dev *dax_dev = to_dax_dev(dev);
struct cdev *cdev = &dax_dev->cdev;
- dev_dbg(dev, "%s\n", __func__);
-
/*
* Note, rcu is not protecting the liveness of dax_dev, rcu is
* ensuring that any fault handlers that might have seen
@@ -648,6 +645,15 @@ static void unregister_dax_dev(void *dev)
synchronize_rcu();
unmap_mapping_range(dax_dev->inode->i_mapping, 0, 0, 1);
cdev_del(cdev);
+}
+
+static void unregister_dax_dev(void *dev)
+{
+ struct dax_dev *dax_dev = to_dax_dev(dev);
+
+ dev_dbg(dev, "%s\n", __func__);
+
+ kill_dax_dev(dax_dev);
device_unregister(dev);
}
@@ -724,6 +730,7 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
dev_set_name(dev, "dax%d.%d", dax_region->id, dax_dev->id);
rc = device_add(dev);
if (rc) {
+ kill_dax_dev(dax_dev);
put_device(dev);
return ERR_PTR(rc);
}
5 years, 5 months
[PATCH] device-dax: fix cdev leak
by Dan Williams
If device_add() fails, cleanup the cdev. Otherwise, we leak a kobj_map()
with a stale device number.
Fixes: ba09c01d2fa8 ("dax: convert to the cdev api")
Cc: <stable(a)vger.kernel.org>
Cc: Logan Gunthorpe <logang(a)deltatee.com>
Reported-by: Jason Gunthorpe <jgunthorpe(a)obsidianresearch.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
---
drivers/dax/dax.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
index ed758b74ddf0..0f8008dd0b0c 100644
--- a/drivers/dax/dax.c
+++ b/drivers/dax/dax.c
@@ -724,6 +724,7 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region,
dev_set_name(dev, "dax%d.%d", dax_region->id, dax_dev->id);
rc = device_add(dev);
if (rc) {
+ cdev_del(&dax_dev->cdev);
put_device(dev);
return ERR_PTR(rc);
}
5 years, 5 months
mmap dio write failure
by Xiong Zhou
Hi,
At first, I am not sure whether this is an issue.
mmap a file in a DAX mountpoint, open another file
in a non-DAX mountpoint with O_DIRECT, write the
mapped area to the other file.
This write Success on pmem ramdisk(memmap=2G!20G like)
This write Fail(Bad address) on nvdimm pmem devices.
This write Fail(Bad address) on brd based ramdisk.
If we skip the O_DIRECT flag, all tests pass.
If we write from DAX to DAX, all tests pass.
If we write from non-DAX to DAX, all tests pass.
Kernel version: Linus tree commit 44b4b46.
I have checked back to v4.6 testing on nvdimm devices,
all the same results. I do remember that this test
passed on nvdimms back to May 2016 and i have some
notes for that. However things changed a lot, test
scripts, kernel code, even the nvdimm and machine
firmweare.
Thanks,
Xiong
sh-4.2# cat tbad.sh
#!/bin/bash
[ -z "$1" ] && exit 1
DEV="$1"
MNT=/tbdmnt
cc t_mmap_dio.c
mkdir -p $MNT
wipefs -af $DEV
mkfs.xfs -fq $DEV && \
mount -o dax $DEV $MNT && \
xfs_io -f -c "w -W 0 268435456" $MNT/ts > /dev/null && \
xfs_io -f -c "w -W 0 268435456" ./td > /dev/null
if ./a.out $MNT/ts ./td 16777216 "$DEV" ; then
echo PASS
else
echo FAIL
fi
umount $MNT
sh-4.2# cat t_mmap_dio.c
/*
* This programme was originally written by
* Jeff Moyer <jmoyer(a)redhat.com>
*/
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <libaio.h>
#include <errno.h>
#include <sys/time.h>
void usage(char *prog)
{
fprintf(stderr,
"usage: %s <src file> <dest file> <size> <msg>\n",
prog);
exit(1);
}
void err_exit(char *op, unsigned long len, char *s)
{
fprintf(stderr, "%s(%s) len %lu %s\n",
op, strerror(errno), len, s);
exit(1);
}
int main(int argc, char **argv)
{
int fd, fd2, ret;
char *map;
unsigned long len;
if (argc < 4)
usage(basename(argv[0]));
len = strtoul(argv[3], NULL, 10);
if (errno == ERANGE)
err_exit("strtoul", 0, argv[4]);
/* Open source file and mmap*/
fd = open(argv[1], O_RDWR, 0644);
if (fd < 0)
err_exit("open s", len, argv[4]);
map = (char *)mmap(NULL, len,
PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (map == MAP_FAILED)
err_exit("mmap", len, argv[4]);
/* Open dest file with O_DIRECT */
fd2 = open(argv[2], O_RDWR|O_DIRECT, 0644);
if (fd2 < 0)
err_exit("open d", len, argv[4]);
/* First, test storing to dest file from source mapping */
ret = write(fd2, map, len);
if (ret != len)
err_exit("write", len, argv[4]);
ret = (int)lseek(fd2, 0, SEEK_SET);
if (ret == -1)
err_exit("lseek", len, argv[4]);
/* Next, test reading from dest file into source mapping */
ret = read(fd2, map, len);
if (ret != len)
err_exit("read", len, argv[4]);
ret = msync(map, len, MS_SYNC);
if (ret < 0)
err_exit("msync", len, argv[4]);
ret = munmap(map, len);
if (ret < 0)
err_exit("munmap", len, argv[4]);
ret = close(fd);
if (ret < 0)
err_exit("clsoe fd", len, argv[4]);
ret = close(fd2);
if (ret < 0)
err_exit("close fd2", len, argv[4]);
exit(0);
}
sh-4.2# ndctl list -N
[
{
"dev":"namespace3.0",
"mode":"raw",
"size":8589934592,
"blockdev":"pmem3"
},
{
"dev":"namespace2.0",
"mode":"raw",
"size":8589934592,
"blockdev":"pmem2"
},
{
"dev":"namespace1.0",
"mode":"memory",
"size":2147483648,
"blockdev":"pmem1"
},
{
"dev":"namespace0.0",
"mode":"memory",
"size":2147483648,
"blockdev":"pmem0"
}
]
sh-4.2# modinfo brd
filename: /lib/modules/4.10.0-rc4-master-44b4b46+/kernel/drivers/block/brd.ko
alias: rd
alias: block-major-1-*
license: GPL
srcversion: 25AABF2EF57F6A37AFFEBA6
depends:
intree: Y
vermagic: 4.10.0-rc4-master-44b4b46+ SMP mod_unload modversions
parm: rd_nr:Maximum number of brd devices (int)
parm: rd_size:Size of each RAM disk in kbytes. (ulong)
parm: max_part:Num Minors to reserve between devices (int)
sh-4.2# uname -r
4.10.0-rc4-master-44b4b46+
sh-4.2# bash tbad.sh /dev/pmem0
/dev/pmem0: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42
PASS
sh-4.2# bash tbad.sh /dev/pmem2
/dev/pmem2: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42
write(Bad address) len 16777216 /dev/pmem2
FAIL
sh-4.2# bash tbad.sh /dev/ram0
/dev/ram0: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42
write(Bad address) len 16777216 /dev/ram0
FAIL
sh-4.2# df .
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhxxxxxxxxxxxxxxxxx-01-root 52399104 43658792 8740312 84% /
sh-4.2#
5 years, 5 months