From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from [222.73.24.84] (helo=song.cn.fujitsu.com) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UcrMh-0008IC-RR for kexec@lists.infradead.org; Thu, 16 May 2013 06:08:38 +0000 Message-ID: <5194758D.90502@cn.fujitsu.com> Date: Thu, 16 May 2013 13:58:37 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v6 2/8] vmcore: allocate buffer for ELF headers on page-size alignment References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090551.28109.73350.stgit@localhost6.localdomain6> In-Reply-To: <20130515090551.28109.73350.stgit@localhost6.localdomain6> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "kexec" Errors-To: kexec-bounces+dwmw2=twosheds.infradead.org@lists.infradead.org To: HATAYAMA Daisuke Cc: riel@redhat.com, hughd@google.com, jingbai.ma@hp.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, lisa.mitchell@hp.com, linux-mm@kvack.org, kumagai-atsushi@mxc.nes.nec.co.jp, ebiederm@xmission.com, kosaki.motohiro@jp.fujitsu.com, akpm@linux-foundation.org, walken@google.com, cpw@sgi.com, vgoyal@redhat.com 5LqOIDIwMTPlubQwNeaciDE15pelIDE3OjA1LCBIQVRBWUFNQSBEYWlzdWtlIOWGmemBkzoKPiBB bGxvY2F0ZSBFTEYgaGVhZGVycyBvbiBwYWdlLXNpemUgYm91bmRhcnkgdXNpbmcgX19nZXRfZnJl ZV9wYWdlcygpCj4gaW5zdGVhZCBvZiBrbWFsbG9jKCkuCj4gCj4gTGF0ZXIgcGF0Y2ggd2lsbCBt ZXJnZSBQVF9OT1RFIGVudHJpZXMgaW50byBhIHNpbmdsZSB1bmlxdWUgb25lIGFuZAo+IGRlY3Jl YXNlIHRoZSBidWZmZXIgc2l6ZSBhY3R1YWxseSB1c2VkLiBLZWVwIG9yaWdpbmFsIGJ1ZmZlciBz aXplIGluCj4gdmFyaWFibGUgZWxmY29yZWJ1Zl9zel9vcmlnIHRvIGtmcmVlIHRoZSBidWZmZXIg bGF0ZXIgYW5kIGFjdHVhbGx5Cj4gdXNlZCBidWZmZXIgc2l6ZSB3aXRoIHJvdW5kZWQgdXAgdG8g cGFnZS1zaXplIGJvdW5kYXJ5IGluIHZhcmlhYmxlCj4gZWxmY29yZWJ1Zl9zeiBzZXBhcmF0ZWx5 Lgo+IAo+IFRoZSBzaXplIG9mIHBhcnQgb2YgdGhlIEVMRiBidWZmZXIgZXhwb3J0ZWQgZnJvbSAv cHJvYy92bWNvcmUgaXMKPiBlbGZjb3JlYnVmX3N6Lgo+IAo+IFRoZSBtZXJnZWQsIHJlbW92ZWQg UFRfTk9URSBlbnRyaWVzLCBpLmUuIHRoZSByYW5nZSBbZWxmY29yZWJ1Zl9zeiwKPiBlbGZjb3Jl YnVmX3N6X29yaWddLCBpcyBmaWxsZWQgd2l0aCAwLgo+IAo+IFVzZSBzaXplIG9mIHRoZSBFTEYg aGVhZGVycyBhcyBhbiBpbml0aWFsIG9mZnNldCB2YWx1ZSBpbgo+IHNldF92bWNvcmVfbGlzdF9v ZmZzZXRzX2VsZns2NCwzMn0gYW5kCj4gcHJvY2Vzc19wdGxvYWRfcHJvZ3JhbV9oZWFkZXJzX2Vs Zns2NCwzMn0gaW4gb3JkZXIgdG8gaW5kaWNhdGUgdGhhdAo+IHRoZSBvZmZzZXQgaW5jbHVkZXMg dGhlIGhvbGVzIHRvd2FyZHMgdGhlIHBhZ2UgYm91bmRhcnkuCj4gCj4gU2lnbmVkLW9mZi1ieTog SEFUQVlBTUEgRGFpc3VrZSA8ZC5oYXRheWFtYUBqcC5mdWppdHN1LmNvbT4KPiAtLS0KCkFja2Vk LWJ5OiBaaGFuZyBZYW5mZWkgPHpoYW5neWFuZmVpQGNuLmZ1aml0c3UuY29tPgoKPiAKPiAgZnMv cHJvYy92bWNvcmUuYyB8ICAgODAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCj4gIDEgZmlsZXMgY2hhbmdlZCwgNDUgaW5zZXJ0aW9ucygrKSwg MzUgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvdm1jb3JlLmMgYi9mcy9w cm9jL3ZtY29yZS5jCj4gaW5kZXggYWIwYzkyZS4uNDg4ODZlNiAxMDA2NDQKPiAtLS0gYS9mcy9w cm9jL3ZtY29yZS5jCj4gKysrIGIvZnMvcHJvYy92bWNvcmUuYwo+IEBAIC0zMiw2ICszMiw3IEBA IHN0YXRpYyBMSVNUX0hFQUQodm1jb3JlX2xpc3QpOwo+ICAvKiBTdG9yZXMgdGhlIHBvaW50ZXIg dG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIGtlcm5lbCBlbGYgY29yZSBoZWFkZXJzLiAqLwo+ICBz dGF0aWMgY2hhciAqZWxmY29yZWJ1ZjsKPiAgc3RhdGljIHNpemVfdCBlbGZjb3JlYnVmX3N6Owo+ ICtzdGF0aWMgc2l6ZV90IGVsZmNvcmVidWZfc3pfb3JpZzsKPiAgCj4gIC8qIFRvdGFsIHNpemUg b2Ygdm1jb3JlIGZpbGUuICovCj4gIHN0YXRpYyB1NjQgdm1jb3JlX3NpemU7Cj4gQEAgLTE4Niw3 ICsxODcsNyBAQCBzdGF0aWMgc3RydWN0IHZtY29yZSogX19pbml0IGdldF9uZXdfZWxlbWVudCh2 b2lkKQo+ICAJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWNvcmUpLCBHRlBfS0VSTkVM KTsKPiAgfQo+ICAKPiAtc3RhdGljIHU2NCBfX2luaXQgZ2V0X3ZtY29yZV9zaXplX2VsZjY0KGNo YXIgKmVsZnB0cikKPiArc3RhdGljIHU2NCBfX2luaXQgZ2V0X3ZtY29yZV9zaXplX2VsZjY0KGNo YXIgKmVsZnB0ciwgc2l6ZV90IGVsZnN6KQo+ICB7Cj4gIAlpbnQgaTsKPiAgCXU2NCBzaXplOwo+ IEBAIC0xOTUsNyArMTk2LDcgQEAgc3RhdGljIHU2NCBfX2luaXQgZ2V0X3ZtY29yZV9zaXplX2Vs ZjY0KGNoYXIgKmVsZnB0cikKPiAgCj4gIAllaGRyX3B0ciA9IChFbGY2NF9FaGRyICopZWxmcHRy Owo+ICAJcGhkcl9wdHIgPSAoRWxmNjRfUGhkciopKGVsZnB0ciArIHNpemVvZihFbGY2NF9FaGRy KSk7Cj4gLQlzaXplID0gc2l6ZW9mKEVsZjY0X0VoZHIpICsgKChlaGRyX3B0ci0+ZV9waG51bSkg KiBzaXplb2YoRWxmNjRfUGhkcikpOwo+ICsJc2l6ZSA9IGVsZnN6Owo+ICAJZm9yIChpID0gMDsg aSA8IGVoZHJfcHRyLT5lX3BobnVtOyBpKyspIHsKPiAgCQlzaXplICs9IHBoZHJfcHRyLT5wX21l bXN6Owo+ICAJCXBoZHJfcHRyKys7Cj4gQEAgLTIwMyw3ICsyMDQsNyBAQCBzdGF0aWMgdTY0IF9f aW5pdCBnZXRfdm1jb3JlX3NpemVfZWxmNjQoY2hhciAqZWxmcHRyKQo+ICAJcmV0dXJuIHNpemU7 Cj4gIH0KPiAgCj4gLXN0YXRpYyB1NjQgX19pbml0IGdldF92bWNvcmVfc2l6ZV9lbGYzMihjaGFy ICplbGZwdHIpCj4gK3N0YXRpYyB1NjQgX19pbml0IGdldF92bWNvcmVfc2l6ZV9lbGYzMihjaGFy ICplbGZwdHIsIHNpemVfdCBlbGZzeikKPiAgewo+ICAJaW50IGk7Cj4gIAl1NjQgc2l6ZTsKPiBA QCAtMjEyLDcgKzIxMyw3IEBAIHN0YXRpYyB1NjQgX19pbml0IGdldF92bWNvcmVfc2l6ZV9lbGYz MihjaGFyICplbGZwdHIpCj4gIAo+ICAJZWhkcl9wdHIgPSAoRWxmMzJfRWhkciAqKWVsZnB0cjsK PiAgCXBoZHJfcHRyID0gKEVsZjMyX1BoZHIqKShlbGZwdHIgKyBzaXplb2YoRWxmMzJfRWhkcikp Owo+IC0Jc2l6ZSA9IHNpemVvZihFbGYzMl9FaGRyKSArICgoZWhkcl9wdHItPmVfcGhudW0pICog c2l6ZW9mKEVsZjMyX1BoZHIpKTsKPiArCXNpemUgPSBlbGZzejsKPiAgCWZvciAoaSA9IDA7IGkg PCBlaGRyX3B0ci0+ZV9waG51bTsgaSsrKSB7Cj4gIAkJc2l6ZSArPSBwaGRyX3B0ci0+cF9tZW1z ejsKPiAgCQlwaGRyX3B0cisrOwo+IEBAIC0yODAsNyArMjgxLDcgQEAgc3RhdGljIGludCBfX2lu aXQgbWVyZ2Vfbm90ZV9oZWFkZXJzX2VsZjY0KGNoYXIgKmVsZnB0ciwgc2l6ZV90ICplbGZzeiwK PiAgCXBoZHIucF9mbGFncyAgID0gMDsKPiAgCW5vdGVfb2ZmID0gc2l6ZW9mKEVsZjY0X0VoZHIp ICsKPiAgCQkJKGVoZHJfcHRyLT5lX3BobnVtIC0gbnJfcHRub3RlICsxKSAqIHNpemVvZihFbGY2 NF9QaGRyKTsKPiAtCXBoZHIucF9vZmZzZXQgID0gbm90ZV9vZmY7Cj4gKwlwaGRyLnBfb2Zmc2V0 ICA9IHJvdW5kdXAobm90ZV9vZmYsIFBBR0VfU0laRSk7Cj4gIAlwaGRyLnBfdmFkZHIgICA9IHBo ZHIucF9wYWRkciA9IDA7Cj4gIAlwaGRyLnBfZmlsZXN6ICA9IHBoZHIucF9tZW1zeiA9IHBoZHJf c3o7Cj4gIAlwaGRyLnBfYWxpZ24gICA9IDA7Cj4gQEAgLTI5NCw2ICsyOTUsOCBAQCBzdGF0aWMg aW50IF9faW5pdCBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmNjQoY2hhciAqZWxmcHRyLCBzaXplX3Qg KmVsZnN6LAo+ICAJaSA9IChucl9wdG5vdGUgLSAxKSAqIHNpemVvZihFbGY2NF9QaGRyKTsKPiAg CSplbGZzeiA9ICplbGZzeiAtIGk7Cj4gIAltZW1tb3ZlKHRtcCwgdG1wK2ksICgoKmVsZnN6KS1z aXplb2YoRWxmNjRfRWhkciktc2l6ZW9mKEVsZjY0X1BoZHIpKSk7Cj4gKwltZW1zZXQoZWxmcHRy ICsgKmVsZnN6LCAwLCBpKTsKPiArCSplbGZzeiA9IHJvdW5kdXAoKmVsZnN6LCBQQUdFX1NJWkUp Owo+ICAKPiAgCS8qIE1vZGlmeSBlX3BobnVtIHRvIHJlZmxlY3QgbWVyZ2VkIGhlYWRlcnMuICov Cj4gIAllaGRyX3B0ci0+ZV9waG51bSA9IGVoZHJfcHRyLT5lX3BobnVtIC0gbnJfcHRub3RlICsg MTsKPiBAQCAtMzYxLDcgKzM2NCw3IEBAIHN0YXRpYyBpbnQgX19pbml0IG1lcmdlX25vdGVfaGVh ZGVyc19lbGYzMihjaGFyICplbGZwdHIsIHNpemVfdCAqZWxmc3osCj4gIAlwaGRyLnBfZmxhZ3Mg ICA9IDA7Cj4gIAlub3RlX29mZiA9IHNpemVvZihFbGYzMl9FaGRyKSArCj4gIAkJCShlaGRyX3B0 ci0+ZV9waG51bSAtIG5yX3B0bm90ZSArMSkgKiBzaXplb2YoRWxmMzJfUGhkcik7Cj4gLQlwaGRy LnBfb2Zmc2V0ICA9IG5vdGVfb2ZmOwo+ICsJcGhkci5wX29mZnNldCAgPSByb3VuZHVwKG5vdGVf b2ZmLCBQQUdFX1NJWkUpOwo+ICAJcGhkci5wX3ZhZGRyICAgPSBwaGRyLnBfcGFkZHIgPSAwOwo+ ICAJcGhkci5wX2ZpbGVzeiAgPSBwaGRyLnBfbWVtc3ogPSBwaGRyX3N6Owo+ICAJcGhkci5wX2Fs aWduICAgPSAwOwo+IEBAIC0zNzUsNiArMzc4LDggQEAgc3RhdGljIGludCBfX2luaXQgbWVyZ2Vf bm90ZV9oZWFkZXJzX2VsZjMyKGNoYXIgKmVsZnB0ciwgc2l6ZV90ICplbGZzeiwKPiAgCWkgPSAo bnJfcHRub3RlIC0gMSkgKiBzaXplb2YoRWxmMzJfUGhkcik7Cj4gIAkqZWxmc3ogPSAqZWxmc3og LSBpOwo+ICAJbWVtbW92ZSh0bXAsIHRtcCtpLCAoKCplbGZzeiktc2l6ZW9mKEVsZjMyX0VoZHIp LXNpemVvZihFbGYzMl9QaGRyKSkpOwo+ICsJbWVtc2V0KGVsZnB0ciArICplbGZzeiwgMCwgaSk7 Cj4gKwkqZWxmc3ogPSByb3VuZHVwKCplbGZzeiwgUEFHRV9TSVpFKTsKPiAgCj4gIAkvKiBNb2Rp ZnkgZV9waG51bSB0byByZWZsZWN0IG1lcmdlZCBoZWFkZXJzLiAqLwo+ICAJZWhkcl9wdHItPmVf cGhudW0gPSBlaGRyX3B0ci0+ZV9waG51bSAtIG5yX3B0bm90ZSArIDE7Cj4gQEAgLTM5OCw5ICs0 MDMsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBwcm9jZXNzX3B0bG9hZF9wcm9ncmFtX2hlYWRlcnNf ZWxmNjQoY2hhciAqZWxmcHRyLAo+ICAJcGhkcl9wdHIgPSAoRWxmNjRfUGhkciopKGVsZnB0ciAr IHNpemVvZihFbGY2NF9FaGRyKSk7IC8qIFBUX05PVEUgaGRyICovCj4gIAo+ICAJLyogRmlyc3Qg cHJvZ3JhbSBoZWFkZXIgaXMgUFRfTk9URSBoZWFkZXIuICovCj4gLQl2bWNvcmVfb2ZmID0gc2l6 ZW9mKEVsZjY0X0VoZHIpICsKPiAtCQkJKGVoZHJfcHRyLT5lX3BobnVtKSAqIHNpemVvZihFbGY2 NF9QaGRyKSArCj4gLQkJCXBoZHJfcHRyLT5wX21lbXN6OyAvKiBOb3RlIHNlY3Rpb25zICovCj4g Kwl2bWNvcmVfb2ZmID0gZWxmc3ogKyByb3VuZHVwKHBoZHJfcHRyLT5wX21lbXN6LCBQQUdFX1NJ WkUpOwo+ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBlaGRyX3B0ci0+ZV9waG51bTsgaSsrLCBwaGRy X3B0cisrKSB7Cj4gIAkJaWYgKHBoZHJfcHRyLT5wX3R5cGUgIT0gUFRfTE9BRCkKPiBAQCAtNDM1 LDkgKzQzOCw3IEBAIHN0YXRpYyBpbnQgX19pbml0IHByb2Nlc3NfcHRsb2FkX3Byb2dyYW1faGVh ZGVyc19lbGYzMihjaGFyICplbGZwdHIsCj4gIAlwaGRyX3B0ciA9IChFbGYzMl9QaGRyKikoZWxm cHRyICsgc2l6ZW9mKEVsZjMyX0VoZHIpKTsgLyogUFRfTk9URSBoZHIgKi8KPiAgCj4gIAkvKiBG aXJzdCBwcm9ncmFtIGhlYWRlciBpcyBQVF9OT1RFIGhlYWRlci4gKi8KPiAtCXZtY29yZV9vZmYg PSBzaXplb2YoRWxmMzJfRWhkcikgKwo+IC0JCQkoZWhkcl9wdHItPmVfcGhudW0pICogc2l6ZW9m KEVsZjMyX1BoZHIpICsKPiAtCQkJcGhkcl9wdHItPnBfbWVtc3o7IC8qIE5vdGUgc2VjdGlvbnMg Ki8KPiArCXZtY29yZV9vZmYgPSBlbGZzeiArIHJvdW5kdXAocGhkcl9wdHItPnBfbWVtc3osIFBB R0VfU0laRSk7Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IGVoZHJfcHRyLT5lX3BobnVtOyBpKyss IHBoZHJfcHRyKyspIHsKPiAgCQlpZiAocGhkcl9wdHItPnBfdHlwZSAhPSBQVF9MT0FEKQo+IEBA IC00NTksNyArNDYwLDcgQEAgc3RhdGljIGludCBfX2luaXQgcHJvY2Vzc19wdGxvYWRfcHJvZ3Jh bV9oZWFkZXJzX2VsZjMyKGNoYXIgKmVsZnB0ciwKPiAgfQo+ICAKPiAgLyogU2V0cyBvZmZzZXQg ZmllbGRzIG9mIHZtY29yZSBlbGVtZW50cy4gKi8KPiAtc3RhdGljIHZvaWQgX19pbml0IHNldF92 bWNvcmVfbGlzdF9vZmZzZXRzX2VsZjY0KGNoYXIgKmVsZnB0ciwKPiArc3RhdGljIHZvaWQgX19p bml0IHNldF92bWNvcmVfbGlzdF9vZmZzZXRzX2VsZjY0KGNoYXIgKmVsZnB0ciwgc2l6ZV90IGVs ZnN6LAo+ICAJCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICp2Y19saXN0KQo+ICB7Cj4gIAlsb2ZmX3Qg dm1jb3JlX29mZjsKPiBAQCAtNDY5LDggKzQ3MCw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBzZXRf dm1jb3JlX2xpc3Rfb2Zmc2V0c19lbGY2NChjaGFyICplbGZwdHIsCj4gIAllaGRyX3B0ciA9IChF bGY2NF9FaGRyICopZWxmcHRyOwo+ICAKPiAgCS8qIFNraXAgRWxmIGhlYWRlciBhbmQgcHJvZ3Jh bSBoZWFkZXJzLiAqLwo+IC0Jdm1jb3JlX29mZiA9IHNpemVvZihFbGY2NF9FaGRyKSArCj4gLQkJ CShlaGRyX3B0ci0+ZV9waG51bSkgKiBzaXplb2YoRWxmNjRfUGhkcik7Cj4gKwl2bWNvcmVfb2Zm ID0gZWxmc3o7Cj4gIAo+ICAJbGlzdF9mb3JfZWFjaF9lbnRyeShtLCB2Y19saXN0LCBsaXN0KSB7 Cj4gIAkJbS0+b2Zmc2V0ID0gdm1jb3JlX29mZjsKPiBAQCAtNDc5LDcgKzQ3OSw3IEBAIHN0YXRp YyB2b2lkIF9faW5pdCBzZXRfdm1jb3JlX2xpc3Rfb2Zmc2V0c19lbGY2NChjaGFyICplbGZwdHIs Cj4gIH0KPiAgCj4gIC8qIFNldHMgb2Zmc2V0IGZpZWxkcyBvZiB2bWNvcmUgZWxlbWVudHMuICov Cj4gLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfdm1jb3JlX2xpc3Rfb2Zmc2V0c19lbGYzMihjaGFy ICplbGZwdHIsCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfdm1jb3JlX2xpc3Rfb2Zmc2V0c19l bGYzMihjaGFyICplbGZwdHIsIHNpemVfdCBlbGZzeiwKPiAgCQkJCQkJc3RydWN0IGxpc3RfaGVh ZCAqdmNfbGlzdCkKPiAgewo+ICAJbG9mZl90IHZtY29yZV9vZmY7Cj4gQEAgLTQ4OSw4ICs0ODks NyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3ZtY29yZV9saXN0X29mZnNldHNfZWxmMzIoY2hh ciAqZWxmcHRyLAo+ICAJZWhkcl9wdHIgPSAoRWxmMzJfRWhkciAqKWVsZnB0cjsKPiAgCj4gIAkv KiBTa2lwIEVsZiBoZWFkZXIgYW5kIHByb2dyYW0gaGVhZGVycy4gKi8KPiAtCXZtY29yZV9vZmYg PSBzaXplb2YoRWxmMzJfRWhkcikgKwo+IC0JCQkoZWhkcl9wdHItPmVfcGhudW0pICogc2l6ZW9m KEVsZjMyX1BoZHIpOwo+ICsJdm1jb3JlX29mZiA9IGVsZnN6Owo+ICAKPiAgCWxpc3RfZm9yX2Vh Y2hfZW50cnkobSwgdmNfbGlzdCwgbGlzdCkgewo+ICAJCW0tPm9mZnNldCA9IHZtY29yZV9vZmY7 Cj4gQEAgLTUyNiwzMCArNTI1LDM1IEBAIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2NyYXNoX2Vs ZjY0X2hlYWRlcnModm9pZCkKPiAgCX0KPiAgCj4gIAkvKiBSZWFkIGluIGFsbCBlbGYgaGVhZGVy cy4gKi8KPiAtCWVsZmNvcmVidWZfc3ogPSBzaXplb2YoRWxmNjRfRWhkcikgKyBlaGRyLmVfcGhu dW0gKiBzaXplb2YoRWxmNjRfUGhkcik7Cj4gLQllbGZjb3JlYnVmID0ga21hbGxvYyhlbGZjb3Jl YnVmX3N6LCBHRlBfS0VSTkVMKTsKPiArCWVsZmNvcmVidWZfc3pfb3JpZyA9IHNpemVvZihFbGY2 NF9FaGRyKSArIGVoZHIuZV9waG51bSAqIHNpemVvZihFbGY2NF9QaGRyKTsKPiArCWVsZmNvcmVi dWZfc3ogPSBlbGZjb3JlYnVmX3N6X29yaWc7Cj4gKwllbGZjb3JlYnVmID0gKHZvaWQgKikgX19n ZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKPiArCQkJCQkgICAgICAgZ2V0 X29yZGVyKGVsZmNvcmVidWZfc3pfb3JpZykpOwo+ICAJaWYgKCFlbGZjb3JlYnVmKQo+ICAJCXJl dHVybiAtRU5PTUVNOwo+ICAJYWRkciA9IGVsZmNvcmVoZHJfYWRkcjsKPiAtCXJjID0gcmVhZF9m cm9tX29sZG1lbShlbGZjb3JlYnVmLCBlbGZjb3JlYnVmX3N6LCAmYWRkciwgMCk7Cj4gKwlyYyA9 IHJlYWRfZnJvbV9vbGRtZW0oZWxmY29yZWJ1ZiwgZWxmY29yZWJ1Zl9zel9vcmlnLCAmYWRkciwg MCk7Cj4gIAlpZiAocmMgPCAwKSB7Cj4gLQkJa2ZyZWUoZWxmY29yZWJ1Zik7Cj4gKwkJZnJlZV9w YWdlcygodW5zaWduZWQgbG9uZyllbGZjb3JlYnVmLAo+ICsJCQkgICBnZXRfb3JkZXIoZWxmY29y ZWJ1Zl9zel9vcmlnKSk7Cj4gIAkJcmV0dXJuIHJjOwo+ICAJfQo+ICAKPiAgCS8qIE1lcmdlIGFs bCBQVF9OT1RFIGhlYWRlcnMgaW50byBvbmUuICovCj4gIAlyYyA9IG1lcmdlX25vdGVfaGVhZGVy c19lbGY2NChlbGZjb3JlYnVmLCAmZWxmY29yZWJ1Zl9zeiwgJnZtY29yZV9saXN0KTsKPiAgCWlm IChyYykgewo+IC0JCWtmcmVlKGVsZmNvcmVidWYpOwo+ICsJCWZyZWVfcGFnZXMoKHVuc2lnbmVk IGxvbmcpZWxmY29yZWJ1ZiwKPiArCQkJICAgZ2V0X29yZGVyKGVsZmNvcmVidWZfc3pfb3JpZykp Owo+ICAJCXJldHVybiByYzsKPiAgCX0KPiAgCXJjID0gcHJvY2Vzc19wdGxvYWRfcHJvZ3JhbV9o ZWFkZXJzX2VsZjY0KGVsZmNvcmVidWYsIGVsZmNvcmVidWZfc3osCj4gIAkJCQkJCQkmdm1jb3Jl X2xpc3QpOwo+ICAJaWYgKHJjKSB7Cj4gLQkJa2ZyZWUoZWxmY29yZWJ1Zik7Cj4gKwkJZnJlZV9w YWdlcygodW5zaWduZWQgbG9uZyllbGZjb3JlYnVmLAo+ICsJCQkgICBnZXRfb3JkZXIoZWxmY29y ZWJ1Zl9zel9vcmlnKSk7Cj4gIAkJcmV0dXJuIHJjOwo+ICAJfQo+IC0Jc2V0X3ZtY29yZV9saXN0 X29mZnNldHNfZWxmNjQoZWxmY29yZWJ1ZiwgJnZtY29yZV9saXN0KTsKPiArCXNldF92bWNvcmVf bGlzdF9vZmZzZXRzX2VsZjY0KGVsZmNvcmVidWYsIGVsZmNvcmVidWZfc3osICZ2bWNvcmVfbGlz dCk7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiBAQCAtNTgxLDMwICs1ODUsMzUgQEAgc3RhdGlj IGludCBfX2luaXQgcGFyc2VfY3Jhc2hfZWxmMzJfaGVhZGVycyh2b2lkKQo+ICAJfQo+ICAKPiAg CS8qIFJlYWQgaW4gYWxsIGVsZiBoZWFkZXJzLiAqLwo+IC0JZWxmY29yZWJ1Zl9zeiA9IHNpemVv ZihFbGYzMl9FaGRyKSArIGVoZHIuZV9waG51bSAqIHNpemVvZihFbGYzMl9QaGRyKTsKPiAtCWVs ZmNvcmVidWYgPSBrbWFsbG9jKGVsZmNvcmVidWZfc3osIEdGUF9LRVJORUwpOwo+ICsJZWxmY29y ZWJ1Zl9zel9vcmlnID0gc2l6ZW9mKEVsZjMyX0VoZHIpICsgZWhkci5lX3BobnVtICogc2l6ZW9m KEVsZjMyX1BoZHIpOwo+ICsJZWxmY29yZWJ1Zl9zeiA9IGVsZmNvcmVidWZfc3pfb3JpZzsKPiAr CWVsZmNvcmVidWYgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dG UF9aRVJPLAo+ICsJCQkJCSAgICAgICBnZXRfb3JkZXIoZWxmY29yZWJ1Zl9zel9vcmlnKSk7Cj4g IAlpZiAoIWVsZmNvcmVidWYpCj4gIAkJcmV0dXJuIC1FTk9NRU07Cj4gIAlhZGRyID0gZWxmY29y ZWhkcl9hZGRyOwo+IC0JcmMgPSByZWFkX2Zyb21fb2xkbWVtKGVsZmNvcmVidWYsIGVsZmNvcmVi dWZfc3osICZhZGRyLCAwKTsKPiArCXJjID0gcmVhZF9mcm9tX29sZG1lbShlbGZjb3JlYnVmLCBl bGZjb3JlYnVmX3N6X29yaWcsICZhZGRyLCAwKTsKPiAgCWlmIChyYyA8IDApIHsKPiAtCQlrZnJl ZShlbGZjb3JlYnVmKTsKPiArCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWVsZmNvcmVidWYs Cj4gKwkJCSAgIGdldF9vcmRlcihlbGZjb3JlYnVmX3N6X29yaWcpKTsKPiAgCQlyZXR1cm4gcmM7 Cj4gIAl9Cj4gIAo+ICAJLyogTWVyZ2UgYWxsIFBUX05PVEUgaGVhZGVycyBpbnRvIG9uZS4gKi8K PiAgCXJjID0gbWVyZ2Vfbm90ZV9oZWFkZXJzX2VsZjMyKGVsZmNvcmVidWYsICZlbGZjb3JlYnVm X3N6LCAmdm1jb3JlX2xpc3QpOwo+ICAJaWYgKHJjKSB7Cj4gLQkJa2ZyZWUoZWxmY29yZWJ1Zik7 Cj4gKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyllbGZjb3JlYnVmLAo+ICsJCQkgICBnZXRf b3JkZXIoZWxmY29yZWJ1Zl9zel9vcmlnKSk7Cj4gIAkJcmV0dXJuIHJjOwo+ICAJfQo+ICAJcmMg PSBwcm9jZXNzX3B0bG9hZF9wcm9ncmFtX2hlYWRlcnNfZWxmMzIoZWxmY29yZWJ1ZiwgZWxmY29y ZWJ1Zl9zeiwKPiAgCQkJCQkJCQkmdm1jb3JlX2xpc3QpOwo+ICAJaWYgKHJjKSB7Cj4gLQkJa2Zy ZWUoZWxmY29yZWJ1Zik7Cj4gKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyllbGZjb3JlYnVm LAo+ICsJCQkgICBnZXRfb3JkZXIoZWxmY29yZWJ1Zl9zel9vcmlnKSk7Cj4gIAkJcmV0dXJuIHJj Owo+ICAJfQo+IC0Jc2V0X3ZtY29yZV9saXN0X29mZnNldHNfZWxmMzIoZWxmY29yZWJ1ZiwgJnZt Y29yZV9saXN0KTsKPiArCXNldF92bWNvcmVfbGlzdF9vZmZzZXRzX2VsZjMyKGVsZmNvcmVidWYs IGVsZmNvcmVidWZfc3osICZ2bWNvcmVfbGlzdCk7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiBA QCAtNjI5LDE0ICs2MzgsMTQgQEAgc3RhdGljIGludCBfX2luaXQgcGFyc2VfY3Jhc2hfZWxmX2hl YWRlcnModm9pZCkKPiAgCQkJcmV0dXJuIHJjOwo+ICAKPiAgCQkvKiBEZXRlcm1pbmUgdm1jb3Jl IHNpemUuICovCj4gLQkJdm1jb3JlX3NpemUgPSBnZXRfdm1jb3JlX3NpemVfZWxmNjQoZWxmY29y ZWJ1Zik7Cj4gKwkJdm1jb3JlX3NpemUgPSBnZXRfdm1jb3JlX3NpemVfZWxmNjQoZWxmY29yZWJ1 ZiwgZWxmY29yZWJ1Zl9zeik7Cj4gIAl9IGVsc2UgaWYgKGVfaWRlbnRbRUlfQ0xBU1NdID09IEVM RkNMQVNTMzIpIHsKPiAgCQlyYyA9IHBhcnNlX2NyYXNoX2VsZjMyX2hlYWRlcnMoKTsKPiAgCQlp ZiAocmMpCj4gIAkJCXJldHVybiByYzsKPiAgCj4gIAkJLyogRGV0ZXJtaW5lIHZtY29yZSBzaXpl LiAqLwo+IC0JCXZtY29yZV9zaXplID0gZ2V0X3ZtY29yZV9zaXplX2VsZjMyKGVsZmNvcmVidWYp Owo+ICsJCXZtY29yZV9zaXplID0gZ2V0X3ZtY29yZV9zaXplX2VsZjMyKGVsZmNvcmVidWYsIGVs ZmNvcmVidWZfc3opOwo+ICAJfSBlbHNlIHsKPiAgCQlwcl93YXJuKCJXYXJuaW5nOiBDb3JlIGlt YWdlIGVsZiBoZWFkZXIgaXMgbm90IHNhbmVcbiIpOwo+ICAJCXJldHVybiAtRUlOVkFMOwo+IEBA IC02ODMsNyArNjkyLDggQEAgdm9pZCB2bWNvcmVfY2xlYW51cCh2b2lkKQo+ICAJCWxpc3RfZGVs KCZtLT5saXN0KTsKPiAgCQlrZnJlZShtKTsKPiAgCX0KPiAtCWtmcmVlKGVsZmNvcmVidWYpOwo+ ICsJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyllbGZjb3JlYnVmLAo+ICsJCSAgIGdldF9vcmRl cihlbGZjb3JlYnVmX3N6X29yaWcpKTsKPiAgCWVsZmNvcmVidWYgPSBOVUxMOwo+ICB9Cj4gIEVY UE9SVF9TWU1CT0xfR1BMKHZtY29yZV9jbGVhbnVwKTsKPiAKPiAKCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwprZXhlYyBtYWlsaW5nIGxpc3QKa2V4ZWNA bGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2tleGVjCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from psmtp.com (na3sys010amx147.postini.com [74.125.245.147]) by kanga.kvack.org (Postfix) with SMTP id 647D16B0034 for ; Thu, 16 May 2013 02:08:07 -0400 (EDT) Message-ID: <5194758D.90502@cn.fujitsu.com> Date: Thu, 16 May 2013 13:58:37 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v6 2/8] vmcore: allocate buffer for ELF headers on page-size alignment References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090551.28109.73350.stgit@localhost6.localdomain6> In-Reply-To: <20130515090551.28109.73350.stgit@localhost6.localdomain6> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Sender: owner-linux-mm@kvack.org List-ID: To: HATAYAMA Daisuke Cc: vgoyal@redhat.com, ebiederm@xmission.com, akpm@linux-foundation.org, cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, jingbai.ma@hp.com, linux-mm@kvack.org, riel@redhat.com, walken@google.com, hughd@google.com, kosaki.motohiro@jp.fujitsu.com =E4=BA=8E 2013=E5=B9=B405=E6=9C=8815=E6=97=A5 17:05, HATAYAMA Daisuke =E5= =86=99=E9=81=93: > Allocate ELF headers on page-size boundary using =5F=5Fget=5Ffree=5Fpages= () > instead of kmalloc(). >=20 > Later patch will merge PT=5FNOTE entries into a single unique one and > decrease the buffer size actually used. Keep original buffer size in > variable elfcorebuf=5Fsz=5Forig to kfree the buffer later and actually > used buffer size with rounded up to page-size boundary in variable > elfcorebuf=5Fsz separately. >=20 > The size of part of the ELF buffer exported from /proc/vmcore is > elfcorebuf=5Fsz. >=20 > The merged, removed PT=5FNOTE entries, i.e. the range [elfcorebuf=5Fsz, > elfcorebuf=5Fsz=5Forig], is filled with 0. >=20 > Use size of the ELF headers as an initial offset value in > set=5Fvmcore=5Flist=5Foffsets=5Felf{64,32} and > process=5Fptload=5Fprogram=5Fheaders=5Felf{64,32} in order to indicate th= at > the offset includes the holes towards the page boundary. >=20 > Signed-off-by: HATAYAMA Daisuke > --- Acked-by: Zhang Yanfei >=20 > fs/proc/vmcore.c | 80 ++++++++++++++++++++++++++++++------------------= ------ > 1 files changed, 45 insertions(+), 35 deletions(-) >=20 > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index ab0c92e..48886e6 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -32,6 +32,7 @@ static LIST=5FHEAD(vmcore=5Flist); > /* Stores the pointer to the buffer containing kernel elf core headers. = */ > static char *elfcorebuf; > static size=5Ft elfcorebuf=5Fsz; > +static size=5Ft elfcorebuf=5Fsz=5Forig; > =20 > /* Total size of vmcore file. */ > static u64 vmcore=5Fsize; > @@ -186,7 +187,7 @@ static struct vmcore* =5F=5Finit get=5Fnew=5Felement(= void) > return kzalloc(sizeof(struct vmcore), GFP=5FKERNEL); > } > =20 > -static u64 =5F=5Finit get=5Fvmcore=5Fsize=5Felf64(char *elfptr) > +static u64 =5F=5Finit get=5Fvmcore=5Fsize=5Felf64(char *elfptr, size=5Ft= elfsz) > { > int i; > u64 size; > @@ -195,7 +196,7 @@ static u64 =5F=5Finit get=5Fvmcore=5Fsize=5Felf64(cha= r *elfptr) > =20 > ehdr=5Fptr =3D (Elf64=5FEhdr *)elfptr; > phdr=5Fptr =3D (Elf64=5FPhdr*)(elfptr + sizeof(Elf64=5FEhdr)); > - size =3D sizeof(Elf64=5FEhdr) + ((ehdr=5Fptr->e=5Fphnum) * sizeof(Elf64= =5FPhdr)); > + size =3D elfsz; > for (i =3D 0; i < ehdr=5Fptr->e=5Fphnum; i++) { > size +=3D phdr=5Fptr->p=5Fmemsz; > phdr=5Fptr++; > @@ -203,7 +204,7 @@ static u64 =5F=5Finit get=5Fvmcore=5Fsize=5Felf64(cha= r *elfptr) > return size; > } > =20 > -static u64 =5F=5Finit get=5Fvmcore=5Fsize=5Felf32(char *elfptr) > +static u64 =5F=5Finit get=5Fvmcore=5Fsize=5Felf32(char *elfptr, size=5Ft= elfsz) > { > int i; > u64 size; > @@ -212,7 +213,7 @@ static u64 =5F=5Finit get=5Fvmcore=5Fsize=5Felf32(cha= r *elfptr) > =20 > ehdr=5Fptr =3D (Elf32=5FEhdr *)elfptr; > phdr=5Fptr =3D (Elf32=5FPhdr*)(elfptr + sizeof(Elf32=5FEhdr)); > - size =3D sizeof(Elf32=5FEhdr) + ((ehdr=5Fptr->e=5Fphnum) * sizeof(Elf32= =5FPhdr)); > + size =3D elfsz; > for (i =3D 0; i < ehdr=5Fptr->e=5Fphnum; i++) { > size +=3D phdr=5Fptr->p=5Fmemsz; > phdr=5Fptr++; > @@ -280,7 +281,7 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf64(= char *elfptr, size=5Ft *elfsz, > phdr.p=5Fflags =3D 0; > note=5Foff =3D sizeof(Elf64=5FEhdr) + > (ehdr=5Fptr->e=5Fphnum - nr=5Fptnote +1) * sizeof(Elf64=5FPhdr); > - phdr.p=5Foffset =3D note=5Foff; > + phdr.p=5Foffset =3D roundup(note=5Foff, PAGE=5FSIZE); > phdr.p=5Fvaddr =3D phdr.p=5Fpaddr =3D 0; > phdr.p=5Ffilesz =3D phdr.p=5Fmemsz =3D phdr=5Fsz; > phdr.p=5Falign =3D 0; > @@ -294,6 +295,8 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf64(= char *elfptr, size=5Ft *elfsz, > i =3D (nr=5Fptnote - 1) * sizeof(Elf64=5FPhdr); > *elfsz =3D *elfsz - i; > memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64=5FEhdr)-sizeof(Elf64=5FPhdr)= )); > + memset(elfptr + *elfsz, 0, i); > + *elfsz =3D roundup(*elfsz, PAGE=5FSIZE); > =20 > /* Modify e=5Fphnum to reflect merged headers. */ > ehdr=5Fptr->e=5Fphnum =3D ehdr=5Fptr->e=5Fphnum - nr=5Fptnote + 1; > @@ -361,7 +364,7 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf32(= char *elfptr, size=5Ft *elfsz, > phdr.p=5Fflags =3D 0; > note=5Foff =3D sizeof(Elf32=5FEhdr) + > (ehdr=5Fptr->e=5Fphnum - nr=5Fptnote +1) * sizeof(Elf32=5FPhdr); > - phdr.p=5Foffset =3D note=5Foff; > + phdr.p=5Foffset =3D roundup(note=5Foff, PAGE=5FSIZE); > phdr.p=5Fvaddr =3D phdr.p=5Fpaddr =3D 0; > phdr.p=5Ffilesz =3D phdr.p=5Fmemsz =3D phdr=5Fsz; > phdr.p=5Falign =3D 0; > @@ -375,6 +378,8 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf32(= char *elfptr, size=5Ft *elfsz, > i =3D (nr=5Fptnote - 1) * sizeof(Elf32=5FPhdr); > *elfsz =3D *elfsz - i; > memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32=5FEhdr)-sizeof(Elf32=5FPhdr)= )); > + memset(elfptr + *elfsz, 0, i); > + *elfsz =3D roundup(*elfsz, PAGE=5FSIZE); > =20 > /* Modify e=5Fphnum to reflect merged headers. */ > ehdr=5Fptr->e=5Fphnum =3D ehdr=5Fptr->e=5Fphnum - nr=5Fptnote + 1; > @@ -398,9 +403,7 @@ static int =5F=5Finit process=5Fptload=5Fprogram=5Fhe= aders=5Felf64(char *elfptr, > phdr=5Fptr =3D (Elf64=5FPhdr*)(elfptr + sizeof(Elf64=5FEhdr)); /* PT=5F= NOTE hdr */ > =20 > /* First program header is PT=5FNOTE header. */ > - vmcore=5Foff =3D sizeof(Elf64=5FEhdr) + > - (ehdr=5Fptr->e=5Fphnum) * sizeof(Elf64=5FPhdr) + > - phdr=5Fptr->p=5Fmemsz; /* Note sections */ > + vmcore=5Foff =3D elfsz + roundup(phdr=5Fptr->p=5Fmemsz, PAGE=5FSIZE); > =20 > for (i =3D 0; i < ehdr=5Fptr->e=5Fphnum; i++, phdr=5Fptr++) { > if (phdr=5Fptr->p=5Ftype !=3D PT=5FLOAD) > @@ -435,9 +438,7 @@ static int =5F=5Finit process=5Fptload=5Fprogram=5Fhe= aders=5Felf32(char *elfptr, > phdr=5Fptr =3D (Elf32=5FPhdr*)(elfptr + sizeof(Elf32=5FEhdr)); /* PT=5F= NOTE hdr */ > =20 > /* First program header is PT=5FNOTE header. */ > - vmcore=5Foff =3D sizeof(Elf32=5FEhdr) + > - (ehdr=5Fptr->e=5Fphnum) * sizeof(Elf32=5FPhdr) + > - phdr=5Fptr->p=5Fmemsz; /* Note sections */ > + vmcore=5Foff =3D elfsz + roundup(phdr=5Fptr->p=5Fmemsz, PAGE=5FSIZE); > =20 > for (i =3D 0; i < ehdr=5Fptr->e=5Fphnum; i++, phdr=5Fptr++) { > if (phdr=5Fptr->p=5Ftype !=3D PT=5FLOAD) > @@ -459,7 +460,7 @@ static int =5F=5Finit process=5Fptload=5Fprogram=5Fhe= aders=5Felf32(char *elfptr, > } > =20 > /* Sets offset fields of vmcore elements. */ > -static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets=5Felf64(char *elfpt= r, > +static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets=5Felf64(char *elfpt= r, size=5Ft elfsz, > struct list=5Fhead *vc=5Flist) > { > loff=5Ft vmcore=5Foff; > @@ -469,8 +470,7 @@ static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets= =5Felf64(char *elfptr, > ehdr=5Fptr =3D (Elf64=5FEhdr *)elfptr; > =20 > /* Skip Elf header and program headers. */ > - vmcore=5Foff =3D sizeof(Elf64=5FEhdr) + > - (ehdr=5Fptr->e=5Fphnum) * sizeof(Elf64=5FPhdr); > + vmcore=5Foff =3D elfsz; > =20 > list=5Ffor=5Feach=5Fentry(m, vc=5Flist, list) { > m->offset =3D vmcore=5Foff; > @@ -479,7 +479,7 @@ static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets= =5Felf64(char *elfptr, > } > =20 > /* Sets offset fields of vmcore elements. */ > -static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets=5Felf32(char *elfpt= r, > +static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets=5Felf32(char *elfpt= r, size=5Ft elfsz, > struct list=5Fhead *vc=5Flist) > { > loff=5Ft vmcore=5Foff; > @@ -489,8 +489,7 @@ static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets= =5Felf32(char *elfptr, > ehdr=5Fptr =3D (Elf32=5FEhdr *)elfptr; > =20 > /* Skip Elf header and program headers. */ > - vmcore=5Foff =3D sizeof(Elf32=5FEhdr) + > - (ehdr=5Fptr->e=5Fphnum) * sizeof(Elf32=5FPhdr); > + vmcore=5Foff =3D elfsz; > =20 > list=5Ffor=5Feach=5Fentry(m, vc=5Flist, list) { > m->offset =3D vmcore=5Foff; > @@ -526,30 +525,35 @@ static int =5F=5Finit parse=5Fcrash=5Felf64=5Fheade= rs(void) > } > =20 > /* Read in all elf headers. */ > - elfcorebuf=5Fsz =3D sizeof(Elf64=5FEhdr) + ehdr.e=5Fphnum * sizeof(Elf6= 4=5FPhdr); > - elfcorebuf =3D kmalloc(elfcorebuf=5Fsz, GFP=5FKERNEL); > + elfcorebuf=5Fsz=5Forig =3D sizeof(Elf64=5FEhdr) + ehdr.e=5Fphnum * size= of(Elf64=5FPhdr); > + elfcorebuf=5Fsz =3D elfcorebuf=5Fsz=5Forig; > + elfcorebuf =3D (void *) =5F=5Fget=5Ffree=5Fpages(GFP=5FKERNEL | =5F=5FG= FP=5FZERO, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > if (!elfcorebuf) > return -ENOMEM; > addr =3D elfcorehdr=5Faddr; > - rc =3D read=5Ffrom=5Foldmem(elfcorebuf, elfcorebuf=5Fsz, &addr, 0); > + rc =3D read=5Ffrom=5Foldmem(elfcorebuf, elfcorebuf=5Fsz=5Forig, &addr, = 0); > if (rc < 0) { > - kfree(elfcorebuf); > + free=5Fpages((unsigned long)elfcorebuf, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > return rc; > } > =20 > /* Merge all PT=5FNOTE headers into one. */ > rc =3D merge=5Fnote=5Fheaders=5Felf64(elfcorebuf, &elfcorebuf=5Fsz, &vm= core=5Flist); > if (rc) { > - kfree(elfcorebuf); > + free=5Fpages((unsigned long)elfcorebuf, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > return rc; > } > rc =3D process=5Fptload=5Fprogram=5Fheaders=5Felf64(elfcorebuf, elfcore= buf=5Fsz, > &vmcore=5Flist); > if (rc) { > - kfree(elfcorebuf); > + free=5Fpages((unsigned long)elfcorebuf, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > return rc; > } > - set=5Fvmcore=5Flist=5Foffsets=5Felf64(elfcorebuf, &vmcore=5Flist); > + set=5Fvmcore=5Flist=5Foffsets=5Felf64(elfcorebuf, elfcorebuf=5Fsz, &vmc= ore=5Flist); > return 0; > } > =20 > @@ -581,30 +585,35 @@ static int =5F=5Finit parse=5Fcrash=5Felf32=5Fheade= rs(void) > } > =20 > /* Read in all elf headers. */ > - elfcorebuf=5Fsz =3D sizeof(Elf32=5FEhdr) + ehdr.e=5Fphnum * sizeof(Elf3= 2=5FPhdr); > - elfcorebuf =3D kmalloc(elfcorebuf=5Fsz, GFP=5FKERNEL); > + elfcorebuf=5Fsz=5Forig =3D sizeof(Elf32=5FEhdr) + ehdr.e=5Fphnum * size= of(Elf32=5FPhdr); > + elfcorebuf=5Fsz =3D elfcorebuf=5Fsz=5Forig; > + elfcorebuf =3D (void *) =5F=5Fget=5Ffree=5Fpages(GFP=5FKERNEL | =5F=5FG= FP=5FZERO, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > if (!elfcorebuf) > return -ENOMEM; > addr =3D elfcorehdr=5Faddr; > - rc =3D read=5Ffrom=5Foldmem(elfcorebuf, elfcorebuf=5Fsz, &addr, 0); > + rc =3D read=5Ffrom=5Foldmem(elfcorebuf, elfcorebuf=5Fsz=5Forig, &addr, = 0); > if (rc < 0) { > - kfree(elfcorebuf); > + free=5Fpages((unsigned long)elfcorebuf, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > return rc; > } > =20 > /* Merge all PT=5FNOTE headers into one. */ > rc =3D merge=5Fnote=5Fheaders=5Felf32(elfcorebuf, &elfcorebuf=5Fsz, &vm= core=5Flist); > if (rc) { > - kfree(elfcorebuf); > + free=5Fpages((unsigned long)elfcorebuf, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > return rc; > } > rc =3D process=5Fptload=5Fprogram=5Fheaders=5Felf32(elfcorebuf, elfcore= buf=5Fsz, > &vmcore=5Flist); > if (rc) { > - kfree(elfcorebuf); > + free=5Fpages((unsigned long)elfcorebuf, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > return rc; > } > - set=5Fvmcore=5Flist=5Foffsets=5Felf32(elfcorebuf, &vmcore=5Flist); > + set=5Fvmcore=5Flist=5Foffsets=5Felf32(elfcorebuf, elfcorebuf=5Fsz, &vmc= ore=5Flist); > return 0; > } > =20 > @@ -629,14 +638,14 @@ static int =5F=5Finit parse=5Fcrash=5Felf=5Fheaders= (void) > return rc; > =20 > /* Determine vmcore size. */ > - vmcore=5Fsize =3D get=5Fvmcore=5Fsize=5Felf64(elfcorebuf); > + vmcore=5Fsize =3D get=5Fvmcore=5Fsize=5Felf64(elfcorebuf, elfcorebuf= =5Fsz); > } else if (e=5Fident[EI=5FCLASS] =3D=3D ELFCLASS32) { > rc =3D parse=5Fcrash=5Felf32=5Fheaders(); > if (rc) > return rc; > =20 > /* Determine vmcore size. */ > - vmcore=5Fsize =3D get=5Fvmcore=5Fsize=5Felf32(elfcorebuf); > + vmcore=5Fsize =3D get=5Fvmcore=5Fsize=5Felf32(elfcorebuf, elfcorebuf= =5Fsz); > } else { > pr=5Fwarn("Warning: Core image elf header is not sane\n"); > return -EINVAL; > @@ -683,7 +692,8 @@ void vmcore=5Fcleanup(void) > list=5Fdel(&m->list); > kfree(m); > } > - kfree(elfcorebuf); > + free=5Fpages((unsigned long)elfcorebuf, > + get=5Forder(elfcorebuf=5Fsz=5Forig)); > elfcorebuf =3D NULL; > } > EXPORT=5FSYMBOL=5FGPL(vmcore=5Fcleanup); >=20 >=20 = -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755341Ab3EPGIQ (ORCPT ); Thu, 16 May 2013 02:08:16 -0400 Received: from cn.fujitsu.com ([222.73.24.84]:12192 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1754950Ab3EPGIM convert rfc822-to-8bit (ORCPT ); Thu, 16 May 2013 02:08:12 -0400 X-IronPort-AV: E=Sophos;i="4.87,682,1363104000"; d="scan'208";a="7283466" Message-ID: <5194758D.90502@cn.fujitsu.com> Date: Thu, 16 May 2013 13:58:37 +0800 From: Zhang Yanfei User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.8) Gecko/20121012 Thunderbird/10.0.8 MIME-Version: 1.0 To: HATAYAMA Daisuke CC: vgoyal@redhat.com, ebiederm@xmission.com, akpm@linux-foundation.org, cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, jingbai.ma@hp.com, linux-mm@kvack.org, riel@redhat.com, walken@google.com, hughd@google.com, kosaki.motohiro@jp.fujitsu.com Subject: Re: [PATCH v6 2/8] vmcore: allocate buffer for ELF headers on page-size alignment References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090551.28109.73350.stgit@localhost6.localdomain6> In-Reply-To: <20130515090551.28109.73350.stgit@localhost6.localdomain6> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/16 13:59:48, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/16 14:06:56 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 于 2013年05月15日 17:05, HATAYAMA Daisuke 写道: > Allocate ELF headers on page-size boundary using __get_free_pages() > instead of kmalloc(). > > Later patch will merge PT_NOTE entries into a single unique one and > decrease the buffer size actually used. Keep original buffer size in > variable elfcorebuf_sz_orig to kfree the buffer later and actually > used buffer size with rounded up to page-size boundary in variable > elfcorebuf_sz separately. > > The size of part of the ELF buffer exported from /proc/vmcore is > elfcorebuf_sz. > > The merged, removed PT_NOTE entries, i.e. the range [elfcorebuf_sz, > elfcorebuf_sz_orig], is filled with 0. > > Use size of the ELF headers as an initial offset value in > set_vmcore_list_offsets_elf{64,32} and > process_ptload_program_headers_elf{64,32} in order to indicate that > the offset includes the holes towards the page boundary. > > Signed-off-by: HATAYAMA Daisuke > --- Acked-by: Zhang Yanfei > > fs/proc/vmcore.c | 80 ++++++++++++++++++++++++++++++------------------------ > 1 files changed, 45 insertions(+), 35 deletions(-) > > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index ab0c92e..48886e6 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -32,6 +32,7 @@ static LIST_HEAD(vmcore_list); > /* Stores the pointer to the buffer containing kernel elf core headers. */ > static char *elfcorebuf; > static size_t elfcorebuf_sz; > +static size_t elfcorebuf_sz_orig; > > /* Total size of vmcore file. */ > static u64 vmcore_size; > @@ -186,7 +187,7 @@ static struct vmcore* __init get_new_element(void) > return kzalloc(sizeof(struct vmcore), GFP_KERNEL); > } > > -static u64 __init get_vmcore_size_elf64(char *elfptr) > +static u64 __init get_vmcore_size_elf64(char *elfptr, size_t elfsz) > { > int i; > u64 size; > @@ -195,7 +196,7 @@ static u64 __init get_vmcore_size_elf64(char *elfptr) > > ehdr_ptr = (Elf64_Ehdr *)elfptr; > phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); > - size = sizeof(Elf64_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr)); > + size = elfsz; > for (i = 0; i < ehdr_ptr->e_phnum; i++) { > size += phdr_ptr->p_memsz; > phdr_ptr++; > @@ -203,7 +204,7 @@ static u64 __init get_vmcore_size_elf64(char *elfptr) > return size; > } > > -static u64 __init get_vmcore_size_elf32(char *elfptr) > +static u64 __init get_vmcore_size_elf32(char *elfptr, size_t elfsz) > { > int i; > u64 size; > @@ -212,7 +213,7 @@ static u64 __init get_vmcore_size_elf32(char *elfptr) > > ehdr_ptr = (Elf32_Ehdr *)elfptr; > phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); > - size = sizeof(Elf32_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr)); > + size = elfsz; > for (i = 0; i < ehdr_ptr->e_phnum; i++) { > size += phdr_ptr->p_memsz; > phdr_ptr++; > @@ -280,7 +281,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, > phdr.p_flags = 0; > note_off = sizeof(Elf64_Ehdr) + > (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr); > - phdr.p_offset = note_off; > + phdr.p_offset = roundup(note_off, PAGE_SIZE); > phdr.p_vaddr = phdr.p_paddr = 0; > phdr.p_filesz = phdr.p_memsz = phdr_sz; > phdr.p_align = 0; > @@ -294,6 +295,8 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, > i = (nr_ptnote - 1) * sizeof(Elf64_Phdr); > *elfsz = *elfsz - i; > memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr))); > + memset(elfptr + *elfsz, 0, i); > + *elfsz = roundup(*elfsz, PAGE_SIZE); > > /* Modify e_phnum to reflect merged headers. */ > ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1; > @@ -361,7 +364,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, > phdr.p_flags = 0; > note_off = sizeof(Elf32_Ehdr) + > (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr); > - phdr.p_offset = note_off; > + phdr.p_offset = roundup(note_off, PAGE_SIZE); > phdr.p_vaddr = phdr.p_paddr = 0; > phdr.p_filesz = phdr.p_memsz = phdr_sz; > phdr.p_align = 0; > @@ -375,6 +378,8 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, > i = (nr_ptnote - 1) * sizeof(Elf32_Phdr); > *elfsz = *elfsz - i; > memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr))); > + memset(elfptr + *elfsz, 0, i); > + *elfsz = roundup(*elfsz, PAGE_SIZE); > > /* Modify e_phnum to reflect merged headers. */ > ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1; > @@ -398,9 +403,7 @@ static int __init process_ptload_program_headers_elf64(char *elfptr, > phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); /* PT_NOTE hdr */ > > /* First program header is PT_NOTE header. */ > - vmcore_off = sizeof(Elf64_Ehdr) + > - (ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr) + > - phdr_ptr->p_memsz; /* Note sections */ > + vmcore_off = elfsz + roundup(phdr_ptr->p_memsz, PAGE_SIZE); > > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > if (phdr_ptr->p_type != PT_LOAD) > @@ -435,9 +438,7 @@ static int __init process_ptload_program_headers_elf32(char *elfptr, > phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); /* PT_NOTE hdr */ > > /* First program header is PT_NOTE header. */ > - vmcore_off = sizeof(Elf32_Ehdr) + > - (ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr) + > - phdr_ptr->p_memsz; /* Note sections */ > + vmcore_off = elfsz + roundup(phdr_ptr->p_memsz, PAGE_SIZE); > > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > if (phdr_ptr->p_type != PT_LOAD) > @@ -459,7 +460,7 @@ static int __init process_ptload_program_headers_elf32(char *elfptr, > } > > /* Sets offset fields of vmcore elements. */ > -static void __init set_vmcore_list_offsets_elf64(char *elfptr, > +static void __init set_vmcore_list_offsets_elf64(char *elfptr, size_t elfsz, > struct list_head *vc_list) > { > loff_t vmcore_off; > @@ -469,8 +470,7 @@ static void __init set_vmcore_list_offsets_elf64(char *elfptr, > ehdr_ptr = (Elf64_Ehdr *)elfptr; > > /* Skip Elf header and program headers. */ > - vmcore_off = sizeof(Elf64_Ehdr) + > - (ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr); > + vmcore_off = elfsz; > > list_for_each_entry(m, vc_list, list) { > m->offset = vmcore_off; > @@ -479,7 +479,7 @@ static void __init set_vmcore_list_offsets_elf64(char *elfptr, > } > > /* Sets offset fields of vmcore elements. */ > -static void __init set_vmcore_list_offsets_elf32(char *elfptr, > +static void __init set_vmcore_list_offsets_elf32(char *elfptr, size_t elfsz, > struct list_head *vc_list) > { > loff_t vmcore_off; > @@ -489,8 +489,7 @@ static void __init set_vmcore_list_offsets_elf32(char *elfptr, > ehdr_ptr = (Elf32_Ehdr *)elfptr; > > /* Skip Elf header and program headers. */ > - vmcore_off = sizeof(Elf32_Ehdr) + > - (ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr); > + vmcore_off = elfsz; > > list_for_each_entry(m, vc_list, list) { > m->offset = vmcore_off; > @@ -526,30 +525,35 @@ static int __init parse_crash_elf64_headers(void) > } > > /* Read in all elf headers. */ > - elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); > - elfcorebuf = kmalloc(elfcorebuf_sz, GFP_KERNEL); > + elfcorebuf_sz_orig = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); > + elfcorebuf_sz = elfcorebuf_sz_orig; > + elfcorebuf = (void *) __get_free_pages(GFP_KERNEL | __GFP_ZERO, > + get_order(elfcorebuf_sz_orig)); > if (!elfcorebuf) > return -ENOMEM; > addr = elfcorehdr_addr; > - rc = read_from_oldmem(elfcorebuf, elfcorebuf_sz, &addr, 0); > + rc = read_from_oldmem(elfcorebuf, elfcorebuf_sz_orig, &addr, 0); > if (rc < 0) { > - kfree(elfcorebuf); > + free_pages((unsigned long)elfcorebuf, > + get_order(elfcorebuf_sz_orig)); > return rc; > } > > /* Merge all PT_NOTE headers into one. */ > rc = merge_note_headers_elf64(elfcorebuf, &elfcorebuf_sz, &vmcore_list); > if (rc) { > - kfree(elfcorebuf); > + free_pages((unsigned long)elfcorebuf, > + get_order(elfcorebuf_sz_orig)); > return rc; > } > rc = process_ptload_program_headers_elf64(elfcorebuf, elfcorebuf_sz, > &vmcore_list); > if (rc) { > - kfree(elfcorebuf); > + free_pages((unsigned long)elfcorebuf, > + get_order(elfcorebuf_sz_orig)); > return rc; > } > - set_vmcore_list_offsets_elf64(elfcorebuf, &vmcore_list); > + set_vmcore_list_offsets_elf64(elfcorebuf, elfcorebuf_sz, &vmcore_list); > return 0; > } > > @@ -581,30 +585,35 @@ static int __init parse_crash_elf32_headers(void) > } > > /* Read in all elf headers. */ > - elfcorebuf_sz = sizeof(Elf32_Ehdr) + ehdr.e_phnum * sizeof(Elf32_Phdr); > - elfcorebuf = kmalloc(elfcorebuf_sz, GFP_KERNEL); > + elfcorebuf_sz_orig = sizeof(Elf32_Ehdr) + ehdr.e_phnum * sizeof(Elf32_Phdr); > + elfcorebuf_sz = elfcorebuf_sz_orig; > + elfcorebuf = (void *) __get_free_pages(GFP_KERNEL | __GFP_ZERO, > + get_order(elfcorebuf_sz_orig)); > if (!elfcorebuf) > return -ENOMEM; > addr = elfcorehdr_addr; > - rc = read_from_oldmem(elfcorebuf, elfcorebuf_sz, &addr, 0); > + rc = read_from_oldmem(elfcorebuf, elfcorebuf_sz_orig, &addr, 0); > if (rc < 0) { > - kfree(elfcorebuf); > + free_pages((unsigned long)elfcorebuf, > + get_order(elfcorebuf_sz_orig)); > return rc; > } > > /* Merge all PT_NOTE headers into one. */ > rc = merge_note_headers_elf32(elfcorebuf, &elfcorebuf_sz, &vmcore_list); > if (rc) { > - kfree(elfcorebuf); > + free_pages((unsigned long)elfcorebuf, > + get_order(elfcorebuf_sz_orig)); > return rc; > } > rc = process_ptload_program_headers_elf32(elfcorebuf, elfcorebuf_sz, > &vmcore_list); > if (rc) { > - kfree(elfcorebuf); > + free_pages((unsigned long)elfcorebuf, > + get_order(elfcorebuf_sz_orig)); > return rc; > } > - set_vmcore_list_offsets_elf32(elfcorebuf, &vmcore_list); > + set_vmcore_list_offsets_elf32(elfcorebuf, elfcorebuf_sz, &vmcore_list); > return 0; > } > > @@ -629,14 +638,14 @@ static int __init parse_crash_elf_headers(void) > return rc; > > /* Determine vmcore size. */ > - vmcore_size = get_vmcore_size_elf64(elfcorebuf); > + vmcore_size = get_vmcore_size_elf64(elfcorebuf, elfcorebuf_sz); > } else if (e_ident[EI_CLASS] == ELFCLASS32) { > rc = parse_crash_elf32_headers(); > if (rc) > return rc; > > /* Determine vmcore size. */ > - vmcore_size = get_vmcore_size_elf32(elfcorebuf); > + vmcore_size = get_vmcore_size_elf32(elfcorebuf, elfcorebuf_sz); > } else { > pr_warn("Warning: Core image elf header is not sane\n"); > return -EINVAL; > @@ -683,7 +692,8 @@ void vmcore_cleanup(void) > list_del(&m->list); > kfree(m); > } > - kfree(elfcorebuf); > + free_pages((unsigned long)elfcorebuf, > + get_order(elfcorebuf_sz_orig)); > elfcorebuf = NULL; > } > EXPORT_SYMBOL_GPL(vmcore_cleanup); > >