2、当客户说过一段时间、以后、改天、回头、月底时,如何应对?
销售精英2天强化训练 【时间地点】 2016年 09月24-25日上海10月15-16日深圳11月05-06日上海 11月19-20日北京11月26-27日深圳12月17-18日上海 Judge(评价)一个人,一个公司是不是优秀,不要看他是不是Harvard(哈佛大学),是不是Stanford(斯坦福大学).不要judge(评价)里面有多少名牌大学毕业生,而要judge(评价)这帮人干活是不是发疯一样干,看他每天下班是不是笑眯眯回家! ——阿里巴巴公司马云 ——课程简介 第一章客户需求分析 思考: 1、面对客户找不到话说,怎么办?二次沟通应该聊些什么? 2、为什么我把所有资料都给客户了,他还说要考虑一下? 3、同一件事,客户不同的人告诉我不一样的要求,听谁的? 4、同一件事,客户同一个人告诉我两次的答案不一样,听哪次的? 5、推荐哪一种产品给客户好?最好的?稍好的?还是够用的? 4、为什么我按客户要求去做,他还是没有选择我们? 5、不同的客户,我应该如何应对? 6、忠诚的客户应该如何培养? 第一节、为什么要对客户需求进行分析? 1、客户初次告诉我们的信息往往是有所保留的; 2、客户想要的产品,不一定就是实际所需要的; 3、客户不缺少产品信息,困惑的是自己如何选择; 4、客户购买决定是比较出来的,没有比较,产品就没有价值; 5、销售人员第一思想是战争思想,情报最重要; 6、未来的送货员,联络员,报价员将被淘汰; 第二节、如何做好客户需求分析? 一、基本要求: 1.无事不登三宝殿,有目的地做好拜访计划; 2.引导客户,首先要控制谈话的方向、节奏、内容; 3.从讲产品的“卖点”转变到讲客户的“买点” 4.好的,不一定是最适合的,最合适的才是最好的; 5.不要把猜测当成事实,“谈”的是什么?“判”是由谁判? 6.讨论:客户说价格太贵,代表哪15种不同的意思? 二、需求分析要点: 1.了解客户的4种期望目标; 2.了解客户采购的5个适当; 3.判断谁是关键人的8个依据; 4.哪6大类问题不可以问? 要表达别人听得懂的话; 5.提问注意的“3不谈”,“4不讲”; 6.客户需求分析手册制定的6个步骤; ?找对方向,事半功倍,为什么找这个客户? ?时间没对,努力白费,为什么这个时候找? ?找对人,说对话,为什么找这个人? ?为什么推荐这个产品?给客户需要的,而不是自己想给的; ?为什么给这样的服务? 客户看重不是产品,而是使用价值; ?为什么报这个价? 在客户的预算与同行之间找到平衡; 7.为什么还这个价?关注竞争对手,调整自己的策略; 第二章 如何正确推荐产品 思考: 1、为什么我满足客户所提出的要求,客户却还需要考虑一下? 2、为什么客户不相信我质量与服务的承诺? 3、面对客户提出高端产品的要求,而我只有低端产品,怎么办? 4、如何推荐产品才能让客户感觉到我们跟别人不一样; 第一节 为什么需要我们正确地推荐产品? 1、客户往往对自己深层次的问题并不清楚; 2、客户的提出的要求可能是模糊或抽象,有的仅仅提出方向,不要局限于客户明显的问题,头痛医头,脚痛医脚; 3、客户往往会以我们竞品给他的条件要求我们; 4、满足客户提出的要求,是引导客户在不同公司之间做比较,而不在我公司做出决策; 第二节 如何帮助客户建立“排他性”的采购标准? 案例:客户关心的是你如何保证你的质量和服务水平 1、打仗就是打后勤,推荐产品中常用的34项内容; 2、产品的功能与客户需要解决的问题要相对应;客户喜欢提供解决方案的人,而不仅提供工具的人; 3、如何给竞争对手业务员设置障碍? 第三节 见什么人,说什么话; 不同情况下如何讲?时间、能力、精力、兴趣、文化水平、不同的职位等; 1. 什么情况下偏重于理性说服,打动别人的脑? 2. 什么情况下偏重于情感说服,打动别人的心? 3. 何种情况下只讲优势不讲劣势? 4. 何种情况下即讲优势又讲劣势? 第三章如何有效处理异议 思考 1、遇到小气、固执、粗鲁、啰嗦、刻薄、吹毛求疵、优柔寡断的客户应对? 2、客户直接挂电话,怎么办? 3、第二次见面,客户对我大发脾气,怎么办? 4、有一个行业,销售人员每天都会遇到大量的拒绝,为什么却没有任何人会沮丧? 5、客户就没有压力吗?知已知彼,客户采购时会有哪些压力? 6、为什么客户在上班时与下班后会表现不同的性格特征? 第一节:买卖双方的心情分析 1、如果一方比另一方更主动、更积极追求合作,则后者称为潜在客户 2、卖方知道某价一定不能卖,但买方不知道什么价不能买; 3、当卖方表现自己很想卖,买方会表现自己不想买; 4、买方还的价,并不一定是他认为商品就应该值这个价; 5、付钱之前,买方占优势,之后,卖方占优势; 第二节、理解客户购买时的心态; 1、客户谈判时常用7种试探技巧分析; 2、客户态度非常好,就是不下订单,为什么? 3、为什么有些客户让我们感觉高高在上,花钱是大爷?难道他们素质真的差? 4、客户自身会有哪6个压力? 案例:客户提出合理条件,是否我就应该降价? 案例:如何分清客户异议的真实性? 案例:当谈判出现僵局时怎么办? 案例:为什么我答应客户提出的所有的条件,反而失去了订单? 案例:客户一再地提出不同的条件,怎么处理? 案例:客户要求我降价时,怎么办?请分8个步骤处理 第三节 客户异议处理的5个区分 1、要区分“第一” 还是“唯一” 2、对客户要求的真伪进行鉴别; 3、要区分“情绪”还是“行为” 4、区分“假想”还是“事实” 5、区别问题的轻重,缓急; 第四章 如何建立良好的客情关系? 案例:销售工作需要疯狂、圆滑、奉承、见人说人话,见鬼说鬼话吗? 案例:生意不成仁义在,咱俩交个朋友,这句话应该由谁说? 案例:邀请客户吃饭,你应该怎么说? 案例:当客户表扬了你,你会怎么回答? 案例:我代表公司的形象,是否我应该表现自己很强势? 案例:为了获得客户的信任,我是否应该花重金包装自己?让自己很完美? 案例:是否需要处处表现自己很有礼貌? 案例:如何与企业高层、政府高层打交道? 第一节 做回真实和真诚的自己,表里如一 礼仪的目的是尊重别人,而不是伪装自己,礼仪中常见的错误; 1、演别人,再好的演技也会搞砸,想做别人的时候,你就会离自己很远; 2、不同的人,需求不同,越改越累,越改越气,只会把自己折磨得心浮气躁,不得人心; 3、以朋友的心态与客户交往,过多的商业化语言、行为、过多的礼仪只会让客户感觉到生硬、距离、排斥、公事公办,没有感情; 4、适当的暴露自己的缺点,越完美的人越不可信; 5、守时,守信,守约,及时传递进程与信息,让客户感觉到可控性; 6、销售不是向客户笑,而是要让客户对自己笑; 第二节 感谢伤害我的人,是因为我自己错了; 1、一味顺从、推卸责任、理论交谈、谈论小事、无诚信; 2、当客户说过一段时间、以后、改天、回头、月底时,如何应对? 3、越完美的人越不可信,自我暴露的四个层次; 4、做好防错性的服务,签完合同仅仅是合作的开始; ?指导客户如何使用; ?跟踪产品使用的情况; ?为客户在使用过程中提供指导建议; ?积极解答客户在使用中提出的问题; 第四章团队配合 思考: 1.团队配合的前提是什么?是否任意两个人在一起都会有团队精神? 2.团队配合中为什么会出现扯皮的现象? 3.为什么公司花那么高成本让大家加深感情,但有些人之间还是有隔阂? 4.业绩好的人影响业绩差的人容易还是业绩差的影响业绩好的容易? 5.统一底薪好?还是差别化底薪好?如何让大家都觉得公平? 6.为什么有能力的不听话,听话的却没能力? 7.为什么有些人总是不按我要求的方法去做? 8.面对业绩总是很差的员工,到底是留还是开? 第一节团队配合的重要性 1.优秀的业务员业绩往往是普通的几十甚至上百倍; 2.提高成交的效率,不要杀敌一千,而自损八百; 3.优秀业务员缺时间,业绩普通的业务员缺能力,扬长避短,人尽其才; 4.把人力资源效益利用最大化; 5.打造完美的团队,让成员的缺点相互抵消; 第二节,如何开展团队配合 第一、能力互补 1.关注员工的能力,不要把未来寄托在员工未知的潜能上; 2.不要把员工塑造成同一类型的人,不把专才当全才用; 3.团队以能为本,销售岗位常见的14项技能; 4.售前、售中、售后人员要求与如何搭配? 5.案例:新员工有激情,但能力不足,老员工有能力,但激情不足,怎么办? 第二、利益关联 1.为什么成员会相互冷漠、互不关心、彼此封锁信息和资源? 2.为什么团队成员把团队的事不当回事? 3.如何才能让团队成员真心的为优秀的成员而高兴? 4.开除业绩差的员工,其他成员缺乏安全感怎么办? 5.如何才能让团队自动自发的努力工作? 第三节、不同客户喜欢不同风格的销售人员 1、 销售人员形象与举止,注意自己的形象; 2、 是否具备相似的背景,门当户对; 3、 是否具备相同的认识,道不同不相为盟; 4、 是否“投其所好”,话不投机半句多; 5、 赞美,喜欢对方,我们同样对喜欢我们的人有好感; 先交流感情,增进互信,欲速则不达; 6、 是否对销售人员熟悉,销售最忌讳交浅言深; 初次见面就企图跟别人成为朋友的行为很幼稚; 初次见面就暗示好处的行为很肤浅; 刚见面就强调价格很便宜的行为很愚蠢; 7、 销售人员是否具备亲和力,别人的脸是自己的一面镜子; 成交并不取决于说理,而是取决于心情 8、 销售人员是否值得信赖。 第六章 新客户开发 案例:为什么客户一开始很有兴趣,但迟迟不下单? 案例:前天明明说不买的客户居然今天却买了,客户的话能相信吗? 案例:客户答应买我司的产品,却突然变卦买别人的了,为什么? 案例:为什么我们会买自己没有兴趣的而且并不需要的产品? 一、客户是根据自己所投入的精力、金钱来确定自己的态度; 二、如何才能引导客户作自我说服? 1.不要轻易给客户下结论,谁会买,谁不会买 2.态度上的变化叫说服,行为上的变化叫接受; 3.我们都喜欢为我们自己的行为找理由,却不善于做我们已找到理由的事; 4.客户是发现了自己的需求,“发现”的依据是自己的行为; 5.案例:合同签订后,应该问哪4句话,提升客户忠诚度? 第七章 自我激励 1.做销售工作赚钱最快,且最容易得到老板的重视、同事的尊重; 2.不要把第一次见面看成最后一次,工作要积极但不要着急; 3.不是成功太慢,而是放弃太快,钱是给内行的人赚的; 4.不要报着试试看的心态,企图一夜暴富的投机心态让客户反感; 5.不是有希望才坚持,而是坚持了才有希望; 6.付出才会拥有,而不是拥有才付出;做了才会,而不是会了才做; 7.好工作是做出来的,不是找出来的,不要把自己托付给公司,而要独立成长; 8.尝试不同的工作方法,而不是多年重复使用一种方式,具备试错的精神; 9.工作可以出错,但不可以不做,世界上最危险的莫过于原地不动; 10.不要把未来寄托在自己一无所知的行业上,做好目前的工作; 【培训特点】 1.分组讨论,训练为主,互动式教学;2次现场考试; 2.真实案例分析,大量课后作业题,既有抢答,又有辩论,还有现场演练,热烈的课堂氛围; 3.将销售管理融入培训现场: 3.1 不仅关注个人学习表现,而且重视团队合作; 3.2 不仅关注2天以内的学习,而且营造2天以后的培训学习氛围; 3.3 不仅考核个人得分,而且考核团队得分;不仅考核学员的学习成绩,而且考核学员学习的参与度; 【讲师介绍】 王老师 销售团队管理咨询师、销售培训讲师; 曾任可口可乐(中国)公司业务经理;阿里巴巴(中国)网络技术有限公司业务经理; 清华大学.南京大学EMBA特邀培训讲师;新加坡莱佛士学院特约讲师;
Re: [ndctl PATCH] ndctl: bash completion for {enable,disable}-dimm commands
On 09/19, Vishal Verma wrote: > Add bash completion for the two new commands. Don't add a "-i" by > default in __ndctl_get_dimms, instead specift "-i" manually where needed s/specifit/specify/ > (everywhere except the completion for disable-dimm) > > Signed-off-by: Vishal Verma> --- > contrib/ndctl | 13 + > 1 file changed, 9 insertions(+), 4 deletions(-) > ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
[ndctl PATCH] ndctl: bash completion for {enable, disable}-dimm commands
Add bash completion for the two new commands. Don't add a "-i" by default in __ndctl_get_dimms, instead specift "-i" manually where needed (everywhere except the completion for disable-dimm) Signed-off-by: Vishal Verma--- contrib/ndctl | 13 + 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contrib/ndctl b/contrib/ndctl index 160a9dc..2c04504 100755 --- a/contrib/ndctl +++ b/contrib/ndctl @@ -127,8 +127,7 @@ __ndctl_get_ns() __ndctl_get_dimms() { - # when listing dimms, always list idle ones too - opts="--dimms -i $*" + opts="--dimms $*" [ -n "$bus_filter" ] && opts="$opts --bus=$bus_filter" echo "$(ndctl list $opts | grep -E "^\s*\"dev\":" | cut -d\" -f4)" } @@ -148,7 +147,7 @@ __ndctl_comp_options() opts=$(__ndctl_get_regions) ;; --dimm) - opts=$(__ndctl_get_dimms) + opts=$(__ndctl_get_dimms -i) ;; --namespace) opts=$(__ndctl_get_ns) @@ -201,10 +200,16 @@ __ndctl_comp_non_option_args() disable-region) opts="$(__ndctl_get_regions) all" ;; + enable-dimm) + opts="$(__ndctl_get_dimms -i) all" + ;; + disable-dimm) + opts="$(__ndctl_get_dimms) all" + ;; read-labels) ;& zero-labels) - opts="$(__ndctl_get_dimms) all" + opts="$(__ndctl_get_dimms -i) all" ;; *) return -- 2.7.4 ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
[ndctl PATCH] ndctl: fix disable-dimm error message
cmd_disable_dimm() expects a negative number for an error, otherwise we end up reporting: # ndctl disable-dimm nmem1 nmem1 is active, skipping... disabled 16 dimms ...instead of: # ndctl disable-dimm nmem1 nmem1 is active, skipping... error disabling dimms: Device or resource busy Reported-by: Vishal VermaSigned-off-by: Dan Williams --- ndctl/builtin-xable-dimm.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ndctl/builtin-xable-dimm.c b/ndctl/builtin-xable-dimm.c index 4bdbc7f8eea3..f0d298837aeb 100644 --- a/ndctl/builtin-xable-dimm.c +++ b/ndctl/builtin-xable-dimm.c @@ -67,7 +67,7 @@ static int do_xable_dimm(const char *dimm_arg, rc = success; if (!success && skip) - rc = EBUSY; + rc = -EBUSY; out: dimm_bus = NULL; return rc; ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
[ndctl PATCH] build: fix recommended build procedure
Hideaki Kimura reports that the default build instructions do not result in a usable build. $ ndctl --version ndctl: error while loading shared libraries: libndctl.so.6: cannot open shared object file: No such file or directory Use the default recommended configure options from autogen.sh. Reported-by: Hideaki KimuraSigned-off-by: Dan Williams --- README.md |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7256c2f15e20..e9dec67a0ea2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ sub-system in the Linux kernel Build = `./autogen.sh` -`./configure --enable-local` +`./configure CFLAGS='-g -O0' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64` `make` `make check` `sudo make install` ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
Re: [ndctl PATCH v3 0/4] ndctl: add support for HPE type N SMART health data
On Fri, Sep 16, 2016 at 1:10 PM, Brian Boylstonwrote: > This set of patches adds support for the HPE SMART DSM functions and enables > ndctl to report DIMM health data for HPE type N NVDIMMs. The relevant > firmware interfaces are described in [1]. > > The first patch virtualizes the ndctl_cmd_smart*() family of libndctl > interfaces into a set of ndctl_smart_ops, allowing runtime implementation > differentiation depending on the firmware support provided by a DIMM. > > The second and third patches add miscellaneous pieces needed for the > final patch: > > The fourth patch adds a set of ndctl_smart_ops for the HPE1 DSM family, > based on the firmware interfaces defined in [1]. These ndctl_smart_ops > translate the HPE1 DSM output to match the interface of the existing > Intel DSM-inspired smart_ops. This delivers health reporting parity for > HPE type N NVDIMMs, however: > > When evaluating this ndctl_smart_ops approach, please consider our goal of > adding JSON exports for some of the additional health data defined in [1]. > I expect this would entail adding additional accessor functions to > ndctl_smart_ops, but it's not clear whether or how to extend the existing > get_flags()/check flags/get_data() model used by util_dimm_health_to_json(). > > If you'd like to test these changes, note the following: > > . Some of the DSM functions for HPE type N NVDIMMs, including the ones used > by this patch, require the acpi_ipmi kernel module to be loaded, and you > may need to manually modprobe it. > > . Without [2], you'll need to include '--idle' in your ndctl invocation as > ndctl will consider type Ns to be disabled and will otherwise omit them. > > . Without [3], "alarm_temperature" and "alarm_spares" will be inaccurate. > > [1] > https://github.com/HewlettPackard/hpe-nvm/raw/master/Documentation/NFIT_DSM_DDR4_NVDIMM-N_v84s.pdf > [2] https://lists.01.org/pipermail/linux-nvdimm/2016-August/006619.html > [3] https://lists.01.org/pipermail/linux-nvdimm/2016-September/006810.html > > Changes in v3: > - Dropped the smart_dimm_op() macro and open coded > ndctl_dimm_cmd_new_smart() and ndctl_dimm_cmd_new_smart_threshold(). > (suggested by Dan) > - Do not fail add_dimm() if the read of nfit/commands fails, just set > dimm->dsm_family to -1 instead (suggested by Dan). As part of this, > I also moved the read to after the has_nfit() check. > - Added missing bibliography to the commit message for the last patch. > - I realized that v2 wouldn't compile if HAS_SMART was not 1, so I > changed intel_smart_ops and hpe1_smart_ops into pointers and set them > to NULL if HAS_SMART != 1. They are const because that seems to > avoid compiler warnings about unused variables in cases where > libndctl-private.h is included by something other than libndctl.c. > > Changes in v2: > New approach: taught libndctl how to translate between the HPE1 DSM > family and the existing ndctl_cmd_smart*() libndctl interfaces > (as suggested by Dan). > > Brian Boylston (4): > libndctl: introduce ndctl_smart_ops > libndctl: record dsm family in add_dimm() > libndctl: enable ND_CMD_CALL > libndctl: add support for the HPE1 family of DSM SMART functions Thanks, applied and pushed out to the 'pending' branch for ndctl-55. ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
[ndctl PATCH 6/6] ndctl: fix potential null deref in util_namespace_to_json()
Similar to commit 59a9803454ee "util_namespace_to_json: fix potential null pointer dereference" check that we actually get a btt instance when the namespace is detected to be in "safe" mode. Signed-off-by: Dan Williams--- ndctl/util/json.c |2 ++ 1 file changed, 2 insertions(+) diff --git a/ndctl/util/json.c b/ndctl/util/json.c index 6b74c240a3f5..82e677c2c7a7 100644 --- a/ndctl/util/json.c +++ b/ndctl/util/json.c @@ -179,6 +179,8 @@ struct json_object *util_namespace_to_json(struct ndctl_namespace *ndns, jobj = json_object_new_string("dax"); break; case NDCTL_NS_MODE_SAFE: + if (!btt) + goto err; jobj = json_object_new_string("sector"); size = ndctl_btt_get_size(btt); break; ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
[ndctl PATCH 4/6] test, libndctl: fix uninitialized variable usage in check_btt_size()
If the namespace size is not one we expect, fail the test. Signed-off-by: Dan Williams--- test/libndctl.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/libndctl.c b/test/libndctl.c index e36fe8a4fe6f..a0bf74a9c333 100644 --- a/test/libndctl.c +++ b/test/libndctl.c @@ -984,7 +984,7 @@ static int check_btt_size(struct ndctl_btt *btt) fprintf(stderr, "%s: %s unexpected namespace size: %llx\n", __func__, ndctl_namespace_get_devname(ndns), ns_size); - break; + return -ENXIO; } expect = expect_table[size_select][sect_select]; ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
[ndctl PATCH 2/6] test, dsm-fail: test get_config_size DSM failures
We expect that if the dimm driver fails to enable then any label-data-dependent regions/namespaces will also fail to enable. Signed-off-by: Dan Williams--- ndctl/Makefile.am|3 + ndctl/builtin-test.c |5 + test.h |1 test/Makefile.am | 10 ++ test/dsm-fail.c | 220 ++ 5 files changed, 239 insertions(+) create mode 100644 test/dsm-fail.c diff --git a/ndctl/Makefile.am b/ndctl/Makefile.am index f6cd3f1c235b..63f387b58de9 100644 --- a/ndctl/Makefile.am +++ b/ndctl/Makefile.am @@ -34,6 +34,9 @@ ndctl_LDADD =\ if ENABLE_TEST ndctl_SOURCES += ../test/libndctl.c \ +../test/dsm-fail.c \ +../util/log.c \ +../util/sysfs.c \ ../test/dpa-alloc.c \ ../test/parent-uuid.c \ ../test/core.c diff --git a/ndctl/builtin-test.c b/ndctl/builtin-test.c index d9c5b0f28d6e..d8539a133d10 100644 --- a/ndctl/builtin-test.c +++ b/ndctl/builtin-test.c @@ -49,6 +49,11 @@ int cmd_test(int argc, const char **argv, struct ndctl_ctx *ctx) if (rc && rc != 77) return rc; + rc = test_dsm_fail(loglevel, test, ctx); + fprintf(stderr, "test-dsm-fail: %s\n", result(rc)); + if (rc && rc != 77) + return rc; + rc = test_dpa_alloc(loglevel, test, ctx); fprintf(stderr, "test-dpa-alloc: %s\n", result(rc)); if (rc && rc != 77) diff --git a/test.h b/test.h index 2940ac0f7396..bf708f38bfbf 100644 --- a/test.h +++ b/test.h @@ -18,6 +18,7 @@ struct ndctl_ctx; int test_parent_uuid(int loglevel, struct ndctl_test *test, struct ndctl_ctx *ctx); int test_dax_directio(int dax_fd, void *dax_addr, off_t offset); int test_dpa_alloc(int loglevel, struct ndctl_test *test, struct ndctl_ctx *ctx); +int test_dsm_fail(int loglevel, struct ndctl_test *test, struct ndctl_ctx *ctx); int test_libndctl(int loglevel, struct ndctl_test *test, struct ndctl_ctx *ctx); int test_blk_namespaces(int loglevel, struct ndctl_test *test, struct ndctl_ctx *ctx); int test_pmem_namespaces(int loglevel, struct ndctl_test *test, struct ndctl_ctx *ctx); diff --git a/test/Makefile.am b/test/Makefile.am index f0240fe5883a..5513f429869f 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -2,6 +2,7 @@ include $(top_srcdir)/Makefile.am.in TESTS =\ libndctl \ + dsm-fail \ dpa-alloc \ parent-uuid \ create.sh \ @@ -10,6 +11,7 @@ TESTS =\ check_PROGRAMS =\ libndctl \ + dsm-fail \ dpa-alloc \ parent-uuid \ dax-errors @@ -39,6 +41,14 @@ LIBNDCTL_LIB =\ libndctl_SOURCES = libndctl.c core.c libndctl_LDADD = $(LIBNDCTL_LIB) $(UUID_LIBS) $(KMOD_LIBS) +dsm_fail_SOURCES =\ + dsm-fail.c \ + core.c \ + ../util/log.c \ + ../util/sysfs.c + +dsm_fail_LDADD = $(LIBNDCTL_LIB) $(KMOD_LIBS) + blk_ns_SOURCES = blk_namespaces.c core.c blk_ns_LDADD = $(LIBNDCTL_LIB) $(KMOD_LIBS) diff --git a/test/dsm-fail.c b/test/dsm-fail.c new file mode 100644 index ..ca80cef79092 --- /dev/null +++ b/test/dsm-fail.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2014-2016, Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#ifdef HAVE_NDCTL_H +#include +#else +#include +#endif +#include + +#define DIMM_PATH "/sys/devices/platform/nfit_test.0/nfit_test_dimm/test_dimm0" + +static void reset_bus(struct ndctl_bus *bus) +{ + struct ndctl_region *region; + struct ndctl_dimm *dimm; + + /* disable all regions so that set_config_data commands are permitted */ + ndctl_region_foreach(bus, region) + ndctl_region_disable_invalidate(region); + + ndctl_dimm_foreach(bus, dimm) + ndctl_dimm_zero_labels(dimm); + + /* set regions back to their default state */ + ndctl_region_foreach(bus, region) + ndctl_region_enable(region); +} + +static int do_test(struct ndctl_ctx *ctx, struct ndctl_test *test) +{ + struct ndctl_bus *bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0"); + struct ndctl_dimm *dimm, *victim = NULL; + char path[1024], buf[SYSFS_ATTR_SIZE]; + struct ndctl_region *region; + struct log_ctx log_ctx; + unsigned int handle; + int rc, err = 0; + + if (!ndctl_test_attempt(test, KERNEL_VERSION(4,
[ndctl PATCH 5/6] libdaxctl: fix deref-before-null-check in daxctl_new_region
If ->region_path is not set, do not attempt to take its length. Signed-off-by: Dan Williams--- daxctl/lib/libdaxctl.c | 11 --- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/daxctl/lib/libdaxctl.c b/daxctl/lib/libdaxctl.c index ecdb99640115..8f1b88e06ac6 100644 --- a/daxctl/lib/libdaxctl.c +++ b/daxctl/lib/libdaxctl.c @@ -217,14 +217,19 @@ DAXCTL_EXPORT struct daxctl_region *daxctl_new_region(struct daxctl_ctx *ctx, region->id = id; region->refcount = 1; uuid_copy(region->uuid, uuid); + region->region_path = strdup(path); + if (!region->region_path) { + free(region); + return NULL; + } + list_head_init(>devices); region->buf_len = strlen(region->region_path) + REGION_BUF_SIZE; region->region_buf = calloc(1, region->buf_len); - - if (!region->region_path || !region->region_buf) { + if (!region->region_buf) { daxctl_region_unref(region); - region = NULL; + return NULL; } dbg(ctx, "%s: %s\n", __func__, daxctl_region_get_devname(region)); ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
[ndctl PATCH 1/6] build: build libraries and utilities in separate directories
When trying to add an "ndctl test" user of the util/log.c and util/sysfs.c routines, automake complained about util/log.o being already built for a library when trying to include it in the utility. Move the library build into ndctl/lib/ rather than re-using ndctl/. Signed-off-by: Dan Williams--- Makefile.am|2 +- configure.ac |3 ++- daxctl/Makefile.am | 27 --- daxctl/lib/Makefile.am | 28 ndctl/Makefile.am | 48 ndctl/lib/Makefile.am | 47 +++ 6 files changed, 78 insertions(+), 77 deletions(-) delete mode 100644 daxctl/Makefile.am create mode 100644 daxctl/lib/Makefile.am create mode 100644 ndctl/lib/Makefile.am diff --git a/Makefile.am b/Makefile.am index ce1032e3381d..9eb396639efe 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ include Makefile.am.in ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} -SUBDIRS = . daxctl ndctl +SUBDIRS = . daxctl/lib ndctl/lib ndctl if ENABLE_DOCS SUBDIRS += Documentation endif diff --git a/configure.ac b/configure.ac index 7bc97be9039d..7b4af616cf2b 100644 --- a/configure.ac +++ b/configure.ac @@ -260,7 +260,8 @@ AC_SUBST([my_CFLAGS]) AC_CONFIG_HEADERS(config.h) AC_CONFIG_FILES([ Makefile -daxctl/Makefile +daxctl/lib/Makefile +ndctl/lib/Makefile ndctl/Makefile test/Makefile Documentation/Makefile diff --git a/daxctl/Makefile.am b/daxctl/Makefile.am deleted file mode 100644 index 67ae5aed4a18.. --- a/daxctl/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -include $(top_srcdir)/Makefile.am.in - -%.pc: %.pc.in Makefile - $(SED_PROCESS) - -lib_LTLIBRARIES = lib/libdaxctl.la - -lib_libdaxctl_la_SOURCES =\ - libdaxctl.h \ - lib/libdaxctl-private.h \ - ../util/sysfs.c \ - ../util/sysfs.h \ - ../util/log.c \ - ../util/log.h \ - lib/libdaxctl.c - -EXTRA_DIST += lib/libdaxctl.sym - -lib_libdaxctl_la_LDFLAGS = $(AM_LDFLAGS) \ - -version-info $(LIBDAXCTL_CURRENT):$(LIBDAXCTL_REVISION):$(LIBDAXCTL_AGE) \ - -Wl,--version-script=$(top_srcdir)/daxctl/lib/libdaxctl.sym -lib_libdaxctl_la_DEPENDENCIES = lib/libdaxctl.sym - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = lib/libdaxctl.pc -EXTRA_DIST += lib/libdaxctl.pc.in -CLEANFILES += lib/libdaxctl.pc diff --git a/daxctl/lib/Makefile.am b/daxctl/lib/Makefile.am new file mode 100644 index ..92783847266a --- /dev/null +++ b/daxctl/lib/Makefile.am @@ -0,0 +1,28 @@ +include $(top_srcdir)/Makefile.am.in + +%.pc: %.pc.in Makefile + $(SED_PROCESS) + +pkginclude_HEADERS = ../libdaxctl.h +lib_LTLIBRARIES = libdaxctl.la + +libdaxctl_la_SOURCES =\ + ../libdaxctl.h \ + libdaxctl-private.h \ + ../../util/sysfs.c \ + ../../util/sysfs.h \ + ../../util/log.c \ + ../../util/log.h \ + libdaxctl.c + +EXTRA_DIST += libdaxctl.sym + +libdaxctl_la_LDFLAGS = $(AM_LDFLAGS) \ + -version-info $(LIBDAXCTL_CURRENT):$(LIBDAXCTL_REVISION):$(LIBDAXCTL_AGE) \ + -Wl,--version-script=$(top_srcdir)/daxctl/lib/libdaxctl.sym +libdaxctl_la_DEPENDENCIES = libdaxctl.sym + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libdaxctl.pc +EXTRA_DIST += libdaxctl.pc.in +CLEANFILES += libdaxctl.pc diff --git a/ndctl/Makefile.am b/ndctl/Makefile.am index a84595b0f5e1..f6cd3f1c235b 100644 --- a/ndctl/Makefile.am +++ b/ndctl/Makefile.am @@ -1,39 +1,5 @@ include $(top_srcdir)/Makefile.am.in -BUILT_SOURCES = libndctl.h -lib/libndctl.h: libndctl.h.in - touch $(top_srcdir)/version.m4 - -%.pc: %.pc.in Makefile - $(SED_PROCESS) - -pkginclude_HEADERS = libndctl.h -lib_LTLIBRARIES = lib/libndctl.la - -lib_libndctl_la_SOURCES =\ - libndctl.h \ - lib/libndctl-private.h \ - ../util/log.c \ - ../util/log.h \ - ../util/sysfs.c \ - ../util/sysfs.h \ - lib/libndctl.c - -lib_libndctl_la_LIBADD =\ - ../daxctl/lib/libdaxctl.la \ - $(UDEV_LIBS) \ - $(UUID_LIBS) \ - $(KMOD_LIBS) - -if ENABLE_ARS -lib_libndctl_la_SOURCES += lib/libndctl-ars.c -endif - -if ENABLE_SMART -lib_libndctl_la_SOURCES += lib/libndctl-smart.c -lib_libndctl_la_SOURCES += lib/libndctl-hpe1.c -endif - bin_PROGRAMS = ndctl ndctl_SOURCES = ndctl.c \ @@ -72,17 +38,3 @@ ndctl_SOURCES += ../test/libndctl.c \ ../test/parent-uuid.c \ ../test/core.c endif - - - -EXTRA_DIST += lib/libndctl.sym - -lib_libndctl_la_LDFLAGS = $(AM_LDFLAGS) \ - -version-info $(LIBNDCTL_CURRENT):$(LIBNDCTL_REVISION):$(LIBNDCTL_AGE) \ - -Wl,--version-script=$(top_srcdir)/ndctl/lib/libndctl.sym -lib_libndctl_la_DEPENDENCIES = lib/libndctl.sym - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = lib/libndctl.pc -EXTRA_DIST += lib/libndctl.pc.in -CLEANFILES += lib/libndctl.pc diff --git
Re: [PATCH] ndctl: move test/dax-errors buffer to global to avoid gcc optimization
On Mon, Sep 19, 2016 at 9:45 AM, Dave Jiangwrote: > On 09/18/2016 09:42 AM, Elliott, Robert (Persistent Memory) wrote: >> >> >>> -Original Message- >>> From: Dave Jiang [mailto:dave.ji...@intel.com] >>> Sent: Friday, September 16, 2016 12:24 PM >> ... >>> Subject: Re: [PATCH] ndctl: move test/dax-errors buffer to global to >>> avoid gcc optimization >>> >>> On 09/15/2016 06:18 PM, Elliott, Robert (Persistent Memory) wrote: >> > Some gcc toolchain are optimizing out the memcpy and this causes > dax- errors to not trigger the SIG_BUS when doing memcpy on an > mmap'd buffer. By moving > the buffer to a global variable this bypasses the optimization and > allow the test to work as intended. > >> ... > diff --git a/test/dax-errors.c b/test/dax-errors.c > index 11d0031..9ea5c91 100644 > --- a/test/dax-errors.c > +++ b/test/dax-errors.c > @@ -17,6 +17,8 @@ > > static sigjmp_buf sj_env; > static int sig_count; > +/* buf is global in order to avoid gcc memcpy optimization */ > +static void *buf; > > static void sigbus_hdl(int sig, siginfo_t *siginfo, void *ptr) > { > @@ -27,7 +29,7 @@ static void sigbus_hdl(int sig, siginfo_t *siginfo, > void *ptr) > > static int test_dax_read_err(int fd) > { > -void *base, *buf; > +void *base; > int rc = 0; > > if (fd < 0) { > I've run into that kind of problem before, and found that marking *buf as volatile (and leaving it inside the function) tends to be honored better by aggressive optimizing compilers and linkers. >>> >>> Doesn't appear to work. The compiler discards the volatile. >>> >>> >>> CC dax-errors.o >>> dax-errors.c: In function 'test_dax_read_err': >>> dax-errors.c:66:9: warning: passing argument 1 of 'memcpy' discards >>> 'volatile' qualifier from pointer target type [-Wdiscarded- >>> qualifiers] >>> memcpy(buf, base, 4096); >>> ^~~ >>> In file included from dax-errors.c:8:0: >>> /usr/include/string.h:42:14: note: expected 'void * restrict' but >>> argument is of type 'volatile void *' >>> extern void *memcpy (void *__restrict __dest, const void *__restrict >>> __src, >>> ^~ >>> CCLD dax-errors >>> >> >> For this, put volatile to the right of the *: >> void * volatile buf; > > It made the compile warning go away, but it did not prevent the memcpy > optimization. It still fails unlike when I move the ptr to global. > > gcc version 6.1.1 20160621 (Red Hat 6.1.1-3) (GCC) > > gcc -DHAVE_CONFIG_H -I. -I.. -include ../config.h > -DSYSCONFDIR=\""/etc"\" -DLIBEXECDIR=\""/usr/libexec"\" > -DPREFIX=\""/usr"\" -DNDCTL_MAN_PATH=\""/usr/share/man"\" -I../ndctl/lib > -I../ndctl -I../ -I/usr/include/uuid -I/usr/include/json-c -Wall > -Wchar-subscripts -Wformat-security -Wmissing-declarations > -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wshadow > -Wsign-compare -Wstrict-prototypes -Wtype-limits -fvisibility=hidden > -ffunction-sections -fdata-sections -g -O2 -MT dax-errors.o -MD -MP -MF > $depbase.Tpo -c -o dax-errors.o dax-errors.c I've already applied the "make it global" version. So we can defer more "volatile" keyword experiments. ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
Re: [PATCH] ndctl: move test/dax-errors buffer to global to avoid gcc optimization
On 09/18/2016 09:42 AM, Elliott, Robert (Persistent Memory) wrote: > > >> -Original Message- >> From: Dave Jiang [mailto:dave.ji...@intel.com] >> Sent: Friday, September 16, 2016 12:24 PM > ... >> Subject: Re: [PATCH] ndctl: move test/dax-errors buffer to global to >> avoid gcc optimization >> >> On 09/15/2016 06:18 PM, Elliott, Robert (Persistent Memory) wrote: >>> > Some gcc toolchain are optimizing out the memcpy and this causes dax- errors to not trigger the SIG_BUS when doing memcpy on an mmap'd buffer. By moving the buffer to a global variable this bypasses the optimization and allow the test to work as intended. > ... diff --git a/test/dax-errors.c b/test/dax-errors.c index 11d0031..9ea5c91 100644 --- a/test/dax-errors.c +++ b/test/dax-errors.c @@ -17,6 +17,8 @@ static sigjmp_buf sj_env; static int sig_count; +/* buf is global in order to avoid gcc memcpy optimization */ +static void *buf; static void sigbus_hdl(int sig, siginfo_t *siginfo, void *ptr) { @@ -27,7 +29,7 @@ static void sigbus_hdl(int sig, siginfo_t *siginfo, void *ptr) static int test_dax_read_err(int fd) { -void *base, *buf; +void *base; int rc = 0; if (fd < 0) { >>> >>> I've run into that kind of problem before, and found that >>> marking *buf as volatile (and leaving it inside the function) >>> tends to be honored better by aggressive optimizing compilers >>> and linkers. >> >> Doesn't appear to work. The compiler discards the volatile. >> >> >> CC dax-errors.o >> dax-errors.c: In function 'test_dax_read_err': >> dax-errors.c:66:9: warning: passing argument 1 of 'memcpy' discards >> 'volatile' qualifier from pointer target type [-Wdiscarded- >> qualifiers] >> memcpy(buf, base, 4096); >> ^~~ >> In file included from dax-errors.c:8:0: >> /usr/include/string.h:42:14: note: expected 'void * restrict' but >> argument is of type 'volatile void *' >> extern void *memcpy (void *__restrict __dest, const void *__restrict >> __src, >> ^~ >> CCLD dax-errors >> > > For this, put volatile to the right of the *: > void * volatile buf; It made the compile warning go away, but it did not prevent the memcpy optimization. It still fails unlike when I move the ptr to global. gcc version 6.1.1 20160621 (Red Hat 6.1.1-3) (GCC) gcc -DHAVE_CONFIG_H -I. -I.. -include ../config.h -DSYSCONFDIR=\""/etc"\" -DLIBEXECDIR=\""/usr/libexec"\" -DPREFIX=\""/usr"\" -DNDCTL_MAN_PATH=\""/usr/share/man"\" -I../ndctl/lib -I../ndctl -I../ -I/usr/include/uuid -I/usr/include/json-c -Wall -Wchar-subscripts -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wshadow -Wsign-compare -Wstrict-prototypes -Wtype-limits -fvisibility=hidden -ffunction-sections -fdata-sections -g -O2 -MT dax-errors.o -MD -MP -MF $depbase.Tpo -c -o dax-errors.o dax-errors.c > > That means buf (the pointer) is volatile, and the compiler is > not allowed to optimize away any accesses inside this function. > When calling another function, it just picks up the value at > that time; that other function doesn't need to continue treating > it as special. > > On a little test program, gcc -O2 preserves the call, and -O3 > optimizes away the call unless it is marked volatile like that. > > In comparison: > volatile void *buf; > means whatever buf points to is volatile, and all functions to > which buf is passed must agree. Accesses to buf itself could > be optimized away, but any dereferences using it that remain > must be freshly made. > > memcpy does not promise to treat its buffers that way, so > triggers compiler warnings or errors if src or dest are pointing > to volatile data. > > In a test program, I made a mycpy() with volatile * buffer > arguments, and gcc -O3 does optimize away the call. > > This combination has both properties: > volatile void * volatile buf; > > > --- > Robert Elliott, HPE Persistent Memory > > ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
团队配合的前提是什么?是否任意两个人在一起都会有团队精神?
销售精英2天强化训练 【时间地点】 2016年 09月24-25日上海10月15-16日深圳11月05-06日上海 11月19-20日北京11月26-27日深圳12月17-18日上海 Judge(评价)一个人,一个公司是不是优秀,不要看他是不是Harvard(哈佛大学),是不是Stanford(斯坦福大学).不要judge(评价)里面有多少名牌大学毕业生,而要judge(评价)这帮人干活是不是发疯一样干,看他每天下班是不是笑眯眯回家! ——阿里巴巴公司马云 ——课程简介 第一章客户需求分析 思考: 1、面对客户找不到话说,怎么办?二次沟通应该聊些什么? 2、为什么我把所有资料都给客户了,他还说要考虑一下? 3、同一件事,客户不同的人告诉我不一样的要求,听谁的? 4、同一件事,客户同一个人告诉我两次的答案不一样,听哪次的? 5、推荐哪一种产品给客户好?最好的?稍好的?还是够用的? 4、为什么我按客户要求去做,他还是没有选择我们? 5、不同的客户,我应该如何应对? 6、忠诚的客户应该如何培养? 第一节、为什么要对客户需求进行分析? 1、客户初次告诉我们的信息往往是有所保留的; 2、客户想要的产品,不一定就是实际所需要的; 3、客户不缺少产品信息,困惑的是自己如何选择; 4、客户购买决定是比较出来的,没有比较,产品就没有价值; 5、销售人员第一思想是战争思想,情报最重要; 6、未来的送货员,联络员,报价员将被淘汰; 第二节、如何做好客户需求分析? 一、基本要求: 1.无事不登三宝殿,有目的地做好拜访计划; 2.引导客户,首先要控制谈话的方向、节奏、内容; 3.从讲产品的“卖点”转变到讲客户的“买点” 4.好的,不一定是最适合的,最合适的才是最好的; 5.不要把猜测当成事实,“谈”的是什么?“判”是由谁判? 6.讨论:客户说价格太贵,代表哪15种不同的意思? 二、需求分析要点: 1.了解客户的4种期望目标; 2.了解客户采购的5个适当; 3.判断谁是关键人的8个依据; 4.哪6大类问题不可以问? 要表达别人听得懂的话; 5.提问注意的“3不谈”,“4不讲”; 6.客户需求分析手册制定的6个步骤; ?找对方向,事半功倍,为什么找这个客户? ?时间没对,努力白费,为什么这个时候找? ?找对人,说对话,为什么找这个人? ?为什么推荐这个产品?给客户需要的,而不是自己想给的; ?为什么给这样的服务? 客户看重不是产品,而是使用价值; ?为什么报这个价? 在客户的预算与同行之间找到平衡; 7.为什么还这个价?关注竞争对手,调整自己的策略; 第二章 如何正确推荐产品 思考: 1、为什么我满足客户所提出的要求,客户却还需要考虑一下? 2、为什么客户不相信我质量与服务的承诺? 3、面对客户提出高端产品的要求,而我只有低端产品,怎么办? 4、如何推荐产品才能让客户感觉到我们跟别人不一样; 第一节 为什么需要我们正确地推荐产品? 1、客户往往对自己深层次的问题并不清楚; 2、客户的提出的要求可能是模糊或抽象,有的仅仅提出方向,不要局限于客户明显的问题,头痛医头,脚痛医脚; 3、客户往往会以我们竞品给他的条件要求我们; 4、满足客户提出的要求,是引导客户在不同公司之间做比较,而不在我公司做出决策; 第二节 如何帮助客户建立“排他性”的采购标准? 案例:客户关心的是你如何保证你的质量和服务水平 1、打仗就是打后勤,推荐产品中常用的34项内容; 2、产品的功能与客户需要解决的问题要相对应;客户喜欢提供解决方案的人,而不仅提供工具的人; 3、如何给竞争对手业务员设置障碍? 第三节 见什么人,说什么话; 不同情况下如何讲?时间、能力、精力、兴趣、文化水平、不同的职位等; 1. 什么情况下偏重于理性说服,打动别人的脑? 2. 什么情况下偏重于情感说服,打动别人的心? 3. 何种情况下只讲优势不讲劣势? 4. 何种情况下即讲优势又讲劣势? 第三章如何有效处理异议 思考 1、遇到小气、固执、粗鲁、啰嗦、刻薄、吹毛求疵、优柔寡断的客户应对? 2、客户直接挂电话,怎么办? 3、第二次见面,客户对我大发脾气,怎么办? 4、有一个行业,销售人员每天都会遇到大量的拒绝,为什么却没有任何人会沮丧? 5、客户就没有压力吗?知已知彼,客户采购时会有哪些压力? 6、为什么客户在上班时与下班后会表现不同的性格特征? 第一节:买卖双方的心情分析 1、如果一方比另一方更主动、更积极追求合作,则后者称为潜在客户 2、卖方知道某价一定不能卖,但买方不知道什么价不能买; 3、当卖方表现自己很想卖,买方会表现自己不想买; 4、买方还的价,并不一定是他认为商品就应该值这个价; 5、付钱之前,买方占优势,之后,卖方占优势; 第二节、理解客户购买时的心态; 1、客户谈判时常用7种试探技巧分析; 2、客户态度非常好,就是不下订单,为什么? 3、为什么有些客户让我们感觉高高在上,花钱是大爷?难道他们素质真的差? 4、客户自身会有哪6个压力? 案例:客户提出合理条件,是否我就应该降价? 案例:如何分清客户异议的真实性? 案例:当谈判出现僵局时怎么办? 案例:为什么我答应客户提出的所有的条件,反而失去了订单? 案例:客户一再地提出不同的条件,怎么处理? 案例:客户要求我降价时,怎么办?请分8个步骤处理 第三节 客户异议处理的5个区分 1、要区分“第一” 还是“唯一” 2、对客户要求的真伪进行鉴别; 3、要区分“情绪”还是“行为” 4、区分“假想”还是“事实” 5、区别问题的轻重,缓急; 第四章 如何建立良好的客情关系? 案例:销售工作需要疯狂、圆滑、奉承、见人说人话,见鬼说鬼话吗? 案例:生意不成仁义在,咱俩交个朋友,这句话应该由谁说? 案例:邀请客户吃饭,你应该怎么说? 案例:当客户表扬了你,你会怎么回答? 案例:我代表公司的形象,是否我应该表现自己很强势? 案例:为了获得客户的信任,我是否应该花重金包装自己?让自己很完美? 案例:是否需要处处表现自己很有礼貌? 案例:如何与企业高层、政府高层打交道? 第一节 做回真实和真诚的自己,表里如一 礼仪的目的是尊重别人,而不是伪装自己,礼仪中常见的错误; 1、演别人,再好的演技也会搞砸,想做别人的时候,你就会离自己很远; 2、不同的人,需求不同,越改越累,越改越气,只会把自己折磨得心浮气躁,不得人心; 3、以朋友的心态与客户交往,过多的商业化语言、行为、过多的礼仪只会让客户感觉到生硬、距离、排斥、公事公办,没有感情; 4、适当的暴露自己的缺点,越完美的人越不可信; 5、守时,守信,守约,及时传递进程与信息,让客户感觉到可控性; 6、销售不是向客户笑,而是要让客户对自己笑; 第二节 感谢伤害我的人,是因为我自己错了; 1、一味顺从、推卸责任、理论交谈、谈论小事、无诚信; 2、当客户说过一段时间、以后、改天、回头、月底时,如何应对? 3、越完美的人越不可信,自我暴露的四个层次; 4、做好防错性的服务,签完合同仅仅是合作的开始; ?指导客户如何使用; ?跟踪产品使用的情况; ?为客户在使用过程中提供指导建议; ?积极解答客户在使用中提出的问题; 第四章团队配合 思考: 1.团队配合的前提是什么?是否任意两个人在一起都会有团队精神? 2.团队配合中为什么会出现扯皮的现象? 3.为什么公司花那么高成本让大家加深感情,但有些人之间还是有隔阂? 4.业绩好的人影响业绩差的人容易还是业绩差的影响业绩好的容易? 5.统一底薪好?还是差别化底薪好?如何让大家都觉得公平? 6.为什么有能力的不听话,听话的却没能力? 7.为什么有些人总是不按我要求的方法去做? 8.面对业绩总是很差的员工,到底是留还是开? 第一节团队配合的重要性 1.优秀的业务员业绩往往是普通的几十甚至上百倍; 2.提高成交的效率,不要杀敌一千,而自损八百; 3.优秀业务员缺时间,业绩普通的业务员缺能力,扬长避短,人尽其才; 4.把人力资源效益利用最大化; 5.打造完美的团队,让成员的缺点相互抵消; 第二节,如何开展团队配合 第一、能力互补 1.关注员工的能力,不要把未来寄托在员工未知的潜能上; 2.不要把员工塑造成同一类型的人,不把专才当全才用; 3.团队以能为本,销售岗位常见的14项技能; 4.售前、售中、售后人员要求与如何搭配? 5.案例:新员工有激情,但能力不足,老员工有能力,但激情不足,怎么办? 第二、利益关联 1.为什么成员会相互冷漠、互不关心、彼此封锁信息和资源? 2.为什么团队成员把团队的事不当回事? 3.如何才能让团队成员真心的为优秀的成员而高兴? 4.开除业绩差的员工,其他成员缺乏安全感怎么办? 5.如何才能让团队自动自发的努力工作? 第三节、不同客户喜欢不同风格的销售人员 1、 销售人员形象与举止,注意自己的形象; 2、 是否具备相似的背景,门当户对; 3、 是否具备相同的认识,道不同不相为盟; 4、 是否“投其所好”,话不投机半句多; 5、 赞美,喜欢对方,我们同样对喜欢我们的人有好感; 先交流感情,增进互信,欲速则不达; 6、 是否对销售人员熟悉,销售最忌讳交浅言深; 初次见面就企图跟别人成为朋友的行为很幼稚; 初次见面就暗示好处的行为很肤浅; 刚见面就强调价格很便宜的行为很愚蠢; 7、 销售人员是否具备亲和力,别人的脸是自己的一面镜子; 成交并不取决于说理,而是取决于心情 8、 销售人员是否值得信赖。 第六章 新客户开发 案例:为什么客户一开始很有兴趣,但迟迟不下单? 案例:前天明明说不买的客户居然今天却买了,客户的话能相信吗? 案例:客户答应买我司的产品,却突然变卦买别人的了,为什么? 案例:为什么我们会买自己没有兴趣的而且并不需要的产品? 一、客户是根据自己所投入的精力、金钱来确定自己的态度; 二、如何才能引导客户作自我说服? 1.不要轻易给客户下结论,谁会买,谁不会买 2.态度上的变化叫说服,行为上的变化叫接受; 3.我们都喜欢为我们自己的行为找理由,却不善于做我们已找到理由的事; 4.客户是发现了自己的需求,“发现”的依据是自己的行为; 5.案例:合同签订后,应该问哪4句话,提升客户忠诚度? 第七章 自我激励 1.做销售工作赚钱最快,且最容易得到老板的重视、同事的尊重; 2.不要把第一次见面看成最后一次,工作要积极但不要着急; 3.不是成功太慢,而是放弃太快,钱是给内行的人赚的; 4.不要报着试试看的心态,企图一夜暴富的投机心态让客户反感; 5.不是有希望才坚持,而是坚持了才有希望; 6.付出才会拥有,而不是拥有才付出;做了才会,而不是会了才做; 7.好工作是做出来的,不是找出来的,不要把自己托付给公司,而要独立成长; 8.尝试不同的工作方法,而不是多年重复使用一种方式,具备试错的精神; 9.工作可以出错,但不可以不做,世界上最危险的莫过于原地不动; 10.不要把未来寄托在自己一无所知的行业上,做好目前的工作; 【培训特点】 1.分组讨论,训练为主,互动式教学;2次现场考试; 2.真实案例分析,大量课后作业题,既有抢答,又有辩论,还有现场演练,热烈的课堂氛围; 3.将销售管理融入培训现场: 3.1 不仅关注个人学习表现,而且重视团队合作; 3.2 不仅关注2天以内的学习,而且营造2天以后的培训学习氛围; 3.3 不仅考核个人得分,而且考核团队得分;不仅考核学员的学习成绩,而且考核学员学习的参与度; 【讲师介绍】 王老师 销售团队管理咨询师、销售培训讲师; 曾任可口可乐(中国)公司业务经理;阿里巴巴(中国)网络技术有限公司业务经理; 清华大学.南京大学EMBA特邀培训讲师;新加坡莱佛士学院特约讲师;
[PATCH] nvdimm: fix PHYS_PFN/PFN_PHYS mixup
nd_activate_region() iomaps any hint addresses required when activating a region. To prevent duplicate mappings it checks the PFN of the hint to be mapped against the PFNs of the already mapped hints. Unfortunately it doesn't convert the PFN back into a physical address before passing it to devm_nvdimm_ioremap(). Instead it applies PHYS_PFN a second time which ends about as well as you would imagine. Signed-off-by: Oliver O'HalloranCc: Dan Williams --- drivers/nvdimm/region_devs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c index e8d5ba7b29af..4eef88eb5144 100644 --- a/drivers/nvdimm/region_devs.c +++ b/drivers/nvdimm/region_devs.c @@ -57,7 +57,7 @@ static int nvdimm_map_flush(struct device *dev, struct nvdimm *nvdimm, int dimm, ndrd->flush_wpq[dimm][j] & PAGE_MASK); else flush_page = devm_nvdimm_ioremap(dev, - PHYS_PFN(pfn), PAGE_SIZE); + PFN_PHYS(pfn), PAGE_SIZE); if (!flush_page) return -ENXIO; ndrd->flush_wpq[dimm][i] = flush_page -- 2.5.5 ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
Returned mail: see transcript for details
Your message was not delivered due to the following reason(s): Your message could not be delivered because the destination server was unreachable within the allowed queue period. The amount of time a message is queued before it is returned depends on local configura- tion parameters. Most likely there is a network problem that prevented delivery, but it is also possible that the computer is turned off, or does not have a mail system running right now. Your message was not delivered within 8 days: Host 5.35.172.81 is not responding. The following recipients did not receive this message:Please reply to postmas...@jimaz.cz if you feel this message to be in error. ___ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm