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 1UcsdP-0001z7-1b for kexec@lists.infradead.org; Thu, 16 May 2013 07:29:59 +0000 Message-ID: <51948872.5090402@cn.fujitsu.com> Date: Thu, 16 May 2013 15:19:14 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v6 6/8] vmcore: allocate ELF note segment in the 2nd kernel vmalloc memory References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090614.28109.26492.stgit@localhost6.localdomain6> In-Reply-To: <20130515090614.28109.26492.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 5LqOIDIwMTPlubQwNeaciDE15pelIDE3OjA2LCBIQVRBWUFNQSBEYWlzdWtlIOWGmemBkzoKPiBU aGUgcmVhc29ucyB3aHkgd2UgZG9uJ3QgYWxsb2NhdGUgRUxGIG5vdGUgc2VnbWVudCBpbiB0aGUg MXN0IGtlcm5lbAo+IChvbGQgbWVtb3J5KSBvbiBwYWdlIGJvdW5kYXJ5IGlzIHRvIGtlZXAgYmFj a3dhcmQgY29tcGF0aWJpbGl0eSBmb3IKPiBvbGQga2VybmVscywgYW5kIHRoYXQgaWYgZG9pbmcg c28sIHdlIHdhc3RlIG5vdCBhIGxpdHRsZSBtZW1vcnkgZHVlIHRvCj4gcm91bmQtdXAgb3BlcmF0 aW9uIHRvIGZpdCB0aGUgbWVtb3J5IHRvIHBhZ2UgYm91bmRhcnkgc2luY2UgbW9zdCBvZgo+IHRo ZSBidWZmZXJzIGFyZSBpbiBwZXItY3B1IGFyZWEuCj4gCj4gRUxGIG5vdGVzIGFyZSBwZXItY3B1 LCBzbyB0b3RhbCBzaXplIG9mIEVMRiBub3RlIHNlZ21lbnRzIGRlcGVuZHMgb24KPiBudW1iZXIg b2YgQ1BVcy4gVGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2YgQ1BVcyBvbiB4ODZfNjQgaXMg NTE5MiwKPiBhbmQgdGhlcmUncyBhbHJlYWR5IHN5c3RlbSB3aXRoIDQxOTIgQ1BVcyBpbiBTR0ks IHdoZXJlIHRvdGFsIHNpemUKPiBhbW91bnRzIHRvIDFNQi4gVGhpcyBjYW4gYmUgbGFyZ2VyIGlu IHRoZSBuZWFyIGZ1dHVyZSBvciBwb3NzaWJseSBldmVuCj4gbm93IG9uIGFub3RoZXIgYXJjaGl0 ZWN0dXJlIHRoYXQgaGFzIGxhcmdlciBzaXplIG9mIG5vdGUgcGVyIGEgc2luZ2xlCj4gY3B1LiBU aHVzLCB0byBhdm9pZCB0aGUgY2FzZSB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgbGFyZ2Ug YmxvY2sKPiBmYWlscywgd2UgYWxsb2NhdGUgdm1jb3JlIG9iamVjdHMgb24gdm1hbGxvYyBtZW1v cnkuCj4gCj4gVGhpcyBwYXRjaCBhZGRzIGVsZm5vdGVzX2J1ZiBhbmQgZWxmbm90ZXNfc3ogdmFy aWFibGVzIHRvIGtlZXAgcG9pbnRlcgo+IHRvIHRoZSBFTEYgbm90ZSBzZWdtZW50IGJ1ZmZlciBh bmQgaXRzIHNpemUuIFRoZXJlJ3Mgbm8gbG9uZ2VyIHRoZQo+IHZtY29yZSBvYmplY3QgdGhhdCBj b3JyZXNwb25kcyB0byB0aGUgRUxGIG5vdGUgc2VnbWVudCBpbgo+IHZtY29yZV9saXN0LiBBY2Nv cmRpbmdseSwgcmVhZF92bWNvcmUoKSBoYXMgbmV3IGNhc2UgZm9yIEVMRiBub3RlCj4gc2VnbWVu dCBhbmQgc2V0X3ZtY29yZV9saXN0X29mZnNldHNfZWxmezY0LDMyfSgpIGFuZCBvdGhlciBoZWxw ZXIKPiBmdW5jdGlvbnMgc3RhcnRzIGNhbGN1bGF0aW5nIG9mZnNldCBmcm9tIHN1bSBvZiBzaXpl IG9mIEVMRiBoZWFkZXJzCj4gYW5kIHNpemUgb2YgRUxGIG5vdGUgc2VnbWVudC4KPiAKPiBTaWdu ZWQtb2ZmLWJ5OiBIQVRBWUFNQSBEYWlzdWtlIDxkLmhhdGF5YW1hQGpwLmZ1aml0c3UuY29tPgo+ IC0tLQoKQWNrZWQtYnk6IFpoYW5nIFlhbmZlaSA8emhhbmd5YW5mZWlAY24uZnVqaXRzdS5jb20+ Cgo+IAo+ICBmcy9wcm9jL3ZtY29yZS5jIHwgIDI3MyArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0KPiAgMSBmaWxlcyBjaGFuZ2VkLCAyMDkgaW5z ZXJ0aW9ucygrKSwgNjQgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvdm1j b3JlLmMgYi9mcy9wcm9jL3ZtY29yZS5jCj4gaW5kZXggNmNmN2ZiZC4uNGUxMjFmZGEgMTAwNjQ0 Cj4gLS0tIGEvZnMvcHJvYy92bWNvcmUuYwo+ICsrKyBiL2ZzL3Byb2Mvdm1jb3JlLmMKPiBAQCAt MzQsNiArMzQsOSBAQCBzdGF0aWMgY2hhciAqZWxmY29yZWJ1ZjsKPiAgc3RhdGljIHNpemVfdCBl bGZjb3JlYnVmX3N6Owo+ICBzdGF0aWMgc2l6ZV90IGVsZmNvcmVidWZfc3pfb3JpZzsKPiAgCj4g K3N0YXRpYyBjaGFyICplbGZub3Rlc19idWY7Cj4gK3N0YXRpYyBzaXplX3QgZWxmbm90ZXNfc3o7 Cj4gKwo+ICAvKiBUb3RhbCBzaXplIG9mIHZtY29yZSBmaWxlLiAqLwo+ICBzdGF0aWMgdTY0IHZt Y29yZV9zaXplOwo+ICAKPiBAQCAtMTU0LDYgKzE1NywyNiBAQCBzdGF0aWMgc3NpemVfdCByZWFk X3ZtY29yZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKPiAgCQkJcmV0 dXJuIGFjYzsKPiAgCX0KPiAgCj4gKwkvKiBSZWFkIEVsZiBub3RlIHNlZ21lbnQgKi8KPiArCWlm ICgqZnBvcyA8IGVsZmNvcmVidWZfc3ogKyBlbGZub3Rlc19zeikgewo+ICsJCXZvaWQgKmthZGRy Owo+ICsKPiArCQl0c3ogPSBlbGZjb3JlYnVmX3N6ICsgZWxmbm90ZXNfc3ogLSAqZnBvczsKPiAr CQlpZiAoYnVmbGVuIDwgdHN6KQo+ICsJCQl0c3ogPSBidWZsZW47Cj4gKwkJa2FkZHIgPSBlbGZu b3Rlc19idWYgKyAqZnBvcyAtIGVsZmNvcmVidWZfc3o7Cj4gKwkJaWYgKGNvcHlfdG9fdXNlcihi dWZmZXIsIGthZGRyLCB0c3opKQo+ICsJCQlyZXR1cm4gLUVGQVVMVDsKPiArCQlidWZsZW4gLT0g dHN6Owo+ICsJCSpmcG9zICs9IHRzejsKPiArCQlidWZmZXIgKz0gdHN6Owo+ICsJCWFjYyArPSB0 c3o7Cj4gKwo+ICsJCS8qIGxlYXZlIG5vdyBpZiBmaWxsZWQgYnVmZmVyIGFscmVhZHkgKi8KPiAr CQlpZiAoYnVmbGVuID09IDApCj4gKwkJCXJldHVybiBhY2M7Cj4gKwl9Cj4gKwo+ICAJbGlzdF9m b3JfZWFjaF9lbnRyeShtLCAmdm1jb3JlX2xpc3QsIGxpc3QpIHsKPiAgCQlpZiAoKmZwb3MgPCBt LT5vZmZzZXQgKyBtLT5zaXplKSB7Cj4gIAkJCXRzeiA9IG0tPm9mZnNldCArIG0tPnNpemUgLSAq ZnBvczsKPiBAQCAtMjIxLDIzICsyNDQsMzMgQEAgc3RhdGljIHU2NCBfX2luaXQgZ2V0X3ZtY29y ZV9zaXplX2VsZjMyKGNoYXIgKmVsZnB0ciwgc2l6ZV90IGVsZnN6KQo+ICAJcmV0dXJuIHNpemU7 Cj4gIH0KPiAgCj4gLS8qIE1lcmdlcyBhbGwgdGhlIFBUX05PVEUgaGVhZGVycyBpbnRvIG9uZS4g Ki8KPiAtc3RhdGljIGludCBfX2luaXQgbWVyZ2Vfbm90ZV9oZWFkZXJzX2VsZjY0KGNoYXIgKmVs ZnB0ciwgc2l6ZV90ICplbGZzeiwKPiAtCQkJCQkJc3RydWN0IGxpc3RfaGVhZCAqdmNfbGlzdCkK PiArLyoqCj4gKyAqIHByb2Nlc3Nfbm90ZV9oZWFkZXJzX2VsZjY0IC0gUGVyZm9ybSBhIHZhcmll dHkgb2YgcHJvY2Vzc2luZyBvbiBFTEYKPiArICogbm90ZSBzZWdtZW50cyBhY2NvcmRpbmcgdG8g dGhlIGNvbWJpbmF0aW9uIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy4KPiArICoKPiArICogQGVoZHJf cHRyICAtIEVMRiBoZWFkZXIgYnVmZmVyCj4gKyAqIEBucl9ub3RlcyAgLSB0aGUgbnVtYmVyIG9m IHByb2dyYW0gaGVhZGVyIGVudHJpZXMgb2YgUFRfTk9URSB0eXBlCj4gKyAqIEBub3Rlc19zeiAg LSB0b3RhbCBzaXplIG9mIEVMRiBub3RlIHNlZ21lbnQKPiArICogQG5vdGVzX2J1ZiAtIGJ1ZmZl ciBpbnRvIHdoaWNoIEVMRiBub3RlIHNlZ21lbnQgaXMgY29waWVkCj4gKyAqCj4gKyAqIEFzc3Vt ZSBAZWhkcl9wdHIgaXMgYWx3YXlzIG5vdCBOVUxMLiBJZiBAbnJfbm90ZXMgaXMgbm90IE5VTEws IHRoZW4KPiArICogdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzIG9mIFBUX05P VEUgdHlwZSBpcyBhc3NpZ25lZCB0bwo+ICsgKiBAbnJfbm90ZXMuIElmIEBub3Rlc19zeiBpcyBu b3QgTlVMTCwgdGhlbiB0b3RhbCBzaXplIG9mIEVMRiBub3RlCj4gKyAqIHNlZ21lbnQsIGhlYWRl ciBwYXJ0IHBsdXMgZGF0YSBwYXJ0LCBpcyBhc3NpZ25lZCB0byBAbm90ZXNfc3ouIElmCj4gKyAq IEBub3Rlc19idWYgaXMgbm90IE5VTEwsIHRoZW4gRUxGIG5vdGUgc2VnbWVudCBpcyBjb3BpZWQg aW50bwo+ICsgKiBAbm90ZXNfYnVmLgo+ICsgKi8KPiArc3RhdGljIGludCBfX2luaXQgcHJvY2Vz c19ub3RlX2hlYWRlcnNfZWxmNjQoY29uc3QgRWxmNjRfRWhkciAqZWhkcl9wdHIsCj4gKwkJCQkJ ICAgICBpbnQgKm5yX25vdGVzLCB1NjQgKm5vdGVzX3N6LAo+ICsJCQkJCSAgICAgY2hhciAqbm90 ZXNfYnVmKQo+ICB7Cj4gIAlpbnQgaSwgbnJfcHRub3RlPTAsIHJjPTA7Cj4gLQljaGFyICp0bXA7 Cj4gLQlFbGY2NF9FaGRyICplaGRyX3B0cjsKPiAtCUVsZjY0X1BoZHIgcGhkciwgKnBoZHJfcHRy Owo+ICsJRWxmNjRfUGhkciAqcGhkcl9wdHIgPSAoRWxmNjRfUGhkciopKGVoZHJfcHRyICsgMSk7 Cj4gIAlFbGY2NF9OaGRyICpuaGRyX3B0cjsKPiAtCXU2NCBwaGRyX3N6ID0gMCwgbm90ZV9vZmY7 Cj4gKwl1NjQgcGhkcl9zeiA9IDA7Cj4gIAo+IC0JZWhkcl9wdHIgPSAoRWxmNjRfRWhkciAqKWVs ZnB0cjsKPiAtCXBoZHJfcHRyID0gKEVsZjY0X1BoZHIqKShlbGZwdHIgKyBzaXplb2YoRWxmNjRf RWhkcikpOwo+ICAJZm9yIChpID0gMDsgaSA8IGVoZHJfcHRyLT5lX3BobnVtOyBpKyssIHBoZHJf cHRyKyspIHsKPiAtCQlpbnQgajsKPiAgCQl2b2lkICpub3Rlc19zZWN0aW9uOwo+IC0JCXN0cnVj dCB2bWNvcmUgKm5ldzsKPiAgCQl1NjQgb2Zmc2V0LCBtYXhfc3osIHN6LCByZWFsX3N6ID0gMDsK PiAgCQlpZiAocGhkcl9wdHItPnBfdHlwZSAhPSBQVF9OT1RFKQo+ICAJCQljb250aW51ZTsKPiBA QCAtMjUzLDcgKzI4Niw3IEBAIHN0YXRpYyBpbnQgX19pbml0IG1lcmdlX25vdGVfaGVhZGVyc19l bGY2NChjaGFyICplbGZwdHIsIHNpemVfdCAqZWxmc3osCj4gIAkJCXJldHVybiByYzsKPiAgCQl9 Cj4gIAkJbmhkcl9wdHIgPSBub3Rlc19zZWN0aW9uOwo+IC0JCWZvciAoaiA9IDA7IGogPCBtYXhf c3o7IGogKz0gc3opIHsKPiArCQl3aGlsZSAocmVhbF9zeiA8IG1heF9zeikgewo+ICAJCQlpZiAo bmhkcl9wdHItPm5fbmFtZXN6ID09IDApCj4gIAkJCQlicmVhazsKPiAgCQkJc3ogPSBzaXplb2Yo RWxmNjRfTmhkcikgKwo+IEBAIC0yNjIsMjAgKzI5NSw2OCBAQCBzdGF0aWMgaW50IF9faW5pdCBt ZXJnZV9ub3RlX2hlYWRlcnNfZWxmNjQoY2hhciAqZWxmcHRyLCBzaXplX3QgKmVsZnN6LAo+ICAJ CQlyZWFsX3N6ICs9IHN6Owo+ICAJCQluaGRyX3B0ciA9IChFbGY2NF9OaGRyKikoKGNoYXIqKW5o ZHJfcHRyICsgc3opOwo+ICAJCX0KPiAtCj4gLQkJLyogQWRkIHRoaXMgY29udGlndW91cyBjaHVu ayBvZiBub3RlcyBzZWN0aW9uIHRvIHZtY29yZSBsaXN0LiovCj4gLQkJbmV3ID0gZ2V0X25ld19l bGVtZW50KCk7Cj4gLQkJaWYgKCFuZXcpIHsKPiAtCQkJa2ZyZWUobm90ZXNfc2VjdGlvbik7Cj4g LQkJCXJldHVybiAtRU5PTUVNOwo+ICsJCWlmIChub3Rlc19idWYpIHsKPiArCQkJb2Zmc2V0ID0g cGhkcl9wdHItPnBfb2Zmc2V0Owo+ICsJCQlyYyA9IHJlYWRfZnJvbV9vbGRtZW0obm90ZXNfYnVm ICsgcGhkcl9zeiwgcmVhbF9zeiwKPiArCQkJCQkgICAgICAmb2Zmc2V0LCAwKTsKPiArCQkJaWYg KHJjIDwgMCkgewo+ICsJCQkJa2ZyZWUobm90ZXNfc2VjdGlvbik7Cj4gKwkJCQlyZXR1cm4gcmM7 Cj4gKwkJCX0KPiAgCQl9Cj4gLQkJbmV3LT5wYWRkciA9IHBoZHJfcHRyLT5wX29mZnNldDsKPiAt CQluZXctPnNpemUgPSByZWFsX3N6Owo+IC0JCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgdmNf bGlzdCk7Cj4gIAkJcGhkcl9zeiArPSByZWFsX3N6Owo+ICAJCWtmcmVlKG5vdGVzX3NlY3Rpb24p Owo+ICAJfQo+ICAKPiArCWlmIChucl9ub3RlcykKPiArCQkqbnJfbm90ZXMgPSBucl9wdG5vdGU7 Cj4gKwlpZiAobm90ZXNfc3opCj4gKwkJKm5vdGVzX3N6ID0gcGhkcl9zejsKPiArCj4gKwlyZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBfX2luaXQgZ2V0X25vdGVfbnVtYmVyX2FuZF9z aXplX2VsZjY0KGNvbnN0IEVsZjY0X0VoZHIgKmVoZHJfcHRyLAo+ICsJCQkJCQkgaW50ICpucl9w dG5vdGUsIHU2NCAqcGhkcl9zeikKPiArewo+ICsJcmV0dXJuIHByb2Nlc3Nfbm90ZV9oZWFkZXJz X2VsZjY0KGVoZHJfcHRyLCBucl9wdG5vdGUsIHBoZHJfc3osIE5VTEwpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IF9faW5pdCBjb3B5X25vdGVzX2VsZjY0KGNvbnN0IEVsZjY0X0VoZHIgKmVoZHJf cHRyLCBjaGFyICpub3Rlc19idWYpCj4gK3sKPiArCXJldHVybiBwcm9jZXNzX25vdGVfaGVhZGVy c19lbGY2NChlaGRyX3B0ciwgTlVMTCwgTlVMTCwgbm90ZXNfYnVmKTsKPiArfQo+ICsKPiArLyog TWVyZ2VzIGFsbCB0aGUgUFRfTk9URSBoZWFkZXJzIGludG8gb25lLiAqLwo+ICtzdGF0aWMgaW50 IF9faW5pdCBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmNjQoY2hhciAqZWxmcHRyLCBzaXplX3QgKmVs ZnN6LAo+ICsJCQkJCSAgIGNoYXIgKipub3Rlc19idWYsIHNpemVfdCAqbm90ZXNfc3opCj4gK3sK PiArCWludCBpLCBucl9wdG5vdGU9MCwgcmM9MDsKPiArCWNoYXIgKnRtcDsKPiArCUVsZjY0X0Vo ZHIgKmVoZHJfcHRyOwo+ICsJRWxmNjRfUGhkciBwaGRyOwo+ICsJdTY0IHBoZHJfc3ogPSAwLCBu b3RlX29mZjsKPiArCXN0cnVjdCB2bV9zdHJ1Y3QgKnZtOwo+ICsKPiArCWVoZHJfcHRyID0gKEVs ZjY0X0VoZHIgKillbGZwdHI7Cj4gKwo+ICsJcmMgPSBnZXRfbm90ZV9udW1iZXJfYW5kX3NpemVf ZWxmNjQoZWhkcl9wdHIsICZucl9wdG5vdGUsICZwaGRyX3N6KTsKPiArCWlmIChyYyA8IDApCj4g KwkJcmV0dXJuIHJjOwo+ICsKPiArCSpub3Rlc19zeiA9IHJvdW5kdXAocGhkcl9zeiwgUEFHRV9T SVpFKTsKPiArCSpub3Rlc19idWYgPSB2emFsbG9jKCpub3Rlc19zeik7Cj4gKwlpZiAoISpub3Rl c19idWYpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJdm0gPSBmaW5kX3ZtX2FyZWEoKm5v dGVzX2J1Zik7Cj4gKwlCVUdfT04oIXZtKTsKPiArCXZtLT5mbGFncyB8PSBWTV9VU0VSTUFQOwo+ ICsKPiArCXJjID0gY29weV9ub3Rlc19lbGY2NChlaGRyX3B0ciwgKm5vdGVzX2J1Zik7Cj4gKwlp ZiAocmMgPCAwKQo+ICsJCXJldHVybiByYzsKPiArCj4gIAkvKiBQcmVwYXJlIG1lcmdlZCBQVF9O T1RFIHByb2dyYW0gaGVhZGVyLiAqLwo+ICAJcGhkci5wX3R5cGUgICAgPSBQVF9OT1RFOwo+ICAJ cGhkci5wX2ZsYWdzICAgPSAwOwo+IEBAIC0zMDQsMjMgKzM4NSwzMyBAQCBzdGF0aWMgaW50IF9f aW5pdCBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmNjQoY2hhciAqZWxmcHRyLCBzaXplX3QgKmVsZnN6 LAo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gLS8qIE1lcmdlcyBhbGwgdGhlIFBUX05PVEUgaGVh ZGVycyBpbnRvIG9uZS4gKi8KPiAtc3RhdGljIGludCBfX2luaXQgbWVyZ2Vfbm90ZV9oZWFkZXJz X2VsZjMyKGNoYXIgKmVsZnB0ciwgc2l6ZV90ICplbGZzeiwKPiAtCQkJCQkJc3RydWN0IGxpc3Rf aGVhZCAqdmNfbGlzdCkKPiArLyoqCj4gKyAqIHByb2Nlc3Nfbm90ZV9oZWFkZXJzX2VsZjMyIC0g UGVyZm9ybSBhIHZhcmlldHkgb2YgcHJvY2Vzc2luZyBvbiBFTEYKPiArICogbm90ZSBzZWdtZW50 cyBhY2NvcmRpbmcgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy4KPiAr ICoKPiArICogQGVoZHJfcHRyICAtIEVMRiBoZWFkZXIgYnVmZmVyCj4gKyAqIEBucl9ub3RlcyAg LSB0aGUgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIGVudHJpZXMgb2YgUFRfTk9URSB0eXBlCj4g KyAqIEBub3Rlc19zeiAgLSB0b3RhbCBzaXplIG9mIEVMRiBub3RlIHNlZ21lbnQKPiArICogQG5v dGVzX2J1ZiAtIGJ1ZmZlciBpbnRvIHdoaWNoIEVMRiBub3RlIHNlZ21lbnQgaXMgY29waWVkCj4g KyAqCj4gKyAqIEFzc3VtZSBAZWhkcl9wdHIgaXMgYWx3YXlzIG5vdCBOVUxMLiBJZiBAbnJfbm90 ZXMgaXMgbm90IE5VTEwsIHRoZW4KPiArICogdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciBl bnRyaWVzIG9mIFBUX05PVEUgdHlwZSBpcyBhc3NpZ25lZCB0bwo+ICsgKiBAbnJfbm90ZXMuIElm IEBub3Rlc19zeiBpcyBub3QgTlVMTCwgdGhlbiB0b3RhbCBzaXplIG9mIEVMRiBub3RlCj4gKyAq IHNlZ21lbnQsIGhlYWRlciBwYXJ0IHBsdXMgZGF0YSBwYXJ0LCBpcyBhc3NpZ25lZCB0byBAbm90 ZXNfc3ouIElmCj4gKyAqIEBub3Rlc19idWYgaXMgbm90IE5VTEwsIHRoZW4gRUxGIG5vdGUgc2Vn bWVudCBpcyBjb3BpZWQgaW50bwo+ICsgKiBAbm90ZXNfYnVmLgo+ICsgKi8KPiArc3RhdGljIGlu dCBfX2luaXQgcHJvY2Vzc19ub3RlX2hlYWRlcnNfZWxmMzIoY29uc3QgRWxmMzJfRWhkciAqZWhk cl9wdHIsCj4gKwkJCQkJICAgICBpbnQgKm5yX25vdGVzLCB1NjQgKm5vdGVzX3N6LAo+ICsJCQkJ CSAgICAgY2hhciAqbm90ZXNfYnVmKQo+ICB7Cj4gIAlpbnQgaSwgbnJfcHRub3RlPTAsIHJjPTA7 Cj4gLQljaGFyICp0bXA7Cj4gLQlFbGYzMl9FaGRyICplaGRyX3B0cjsKPiAtCUVsZjMyX1BoZHIg cGhkciwgKnBoZHJfcHRyOwo+ICsJRWxmMzJfUGhkciAqcGhkcl9wdHIgPSAoRWxmMzJfUGhkciop KGVoZHJfcHRyICsgMSk7Cj4gIAlFbGYzMl9OaGRyICpuaGRyX3B0cjsKPiAtCXU2NCBwaGRyX3N6 ID0gMCwgbm90ZV9vZmY7Cj4gKwl1NjQgcGhkcl9zeiA9IDA7Cj4gIAo+IC0JZWhkcl9wdHIgPSAo RWxmMzJfRWhkciAqKWVsZnB0cjsKPiAtCXBoZHJfcHRyID0gKEVsZjMyX1BoZHIqKShlbGZwdHIg KyBzaXplb2YoRWxmMzJfRWhkcikpOwo+ICAJZm9yIChpID0gMDsgaSA8IGVoZHJfcHRyLT5lX3Bo bnVtOyBpKyssIHBoZHJfcHRyKyspIHsKPiAtCQlpbnQgajsKPiAgCQl2b2lkICpub3Rlc19zZWN0 aW9uOwo+IC0JCXN0cnVjdCB2bWNvcmUgKm5ldzsKPiAgCQl1NjQgb2Zmc2V0LCBtYXhfc3osIHN6 LCByZWFsX3N6ID0gMDsKPiAgCQlpZiAocGhkcl9wdHItPnBfdHlwZSAhPSBQVF9OT1RFKQo+ICAJ CQljb250aW51ZTsKPiBAQCAtMzM2LDcgKzQyNyw3IEBAIHN0YXRpYyBpbnQgX19pbml0IG1lcmdl X25vdGVfaGVhZGVyc19lbGYzMihjaGFyICplbGZwdHIsIHNpemVfdCAqZWxmc3osCj4gIAkJCXJl dHVybiByYzsKPiAgCQl9Cj4gIAkJbmhkcl9wdHIgPSBub3Rlc19zZWN0aW9uOwo+IC0JCWZvciAo aiA9IDA7IGogPCBtYXhfc3o7IGogKz0gc3opIHsKPiArCQl3aGlsZSAocmVhbF9zeiA8IG1heF9z eikgewo+ICAJCQlpZiAobmhkcl9wdHItPm5fbmFtZXN6ID09IDApCj4gIAkJCQlicmVhazsKPiAg CQkJc3ogPSBzaXplb2YoRWxmMzJfTmhkcikgKwo+IEBAIC0zNDUsMjAgKzQzNiw2OCBAQCBzdGF0 aWMgaW50IF9faW5pdCBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmMzIoY2hhciAqZWxmcHRyLCBzaXpl X3QgKmVsZnN6LAo+ICAJCQlyZWFsX3N6ICs9IHN6Owo+ICAJCQluaGRyX3B0ciA9IChFbGYzMl9O aGRyKikoKGNoYXIqKW5oZHJfcHRyICsgc3opOwo+ICAJCX0KPiAtCj4gLQkJLyogQWRkIHRoaXMg Y29udGlndW91cyBjaHVuayBvZiBub3RlcyBzZWN0aW9uIHRvIHZtY29yZSBsaXN0LiovCj4gLQkJ bmV3ID0gZ2V0X25ld19lbGVtZW50KCk7Cj4gLQkJaWYgKCFuZXcpIHsKPiAtCQkJa2ZyZWUobm90 ZXNfc2VjdGlvbik7Cj4gLQkJCXJldHVybiAtRU5PTUVNOwo+ICsJCWlmIChub3Rlc19idWYpIHsK PiArCQkJb2Zmc2V0ID0gcGhkcl9wdHItPnBfb2Zmc2V0Owo+ICsJCQlyYyA9IHJlYWRfZnJvbV9v bGRtZW0obm90ZXNfYnVmICsgcGhkcl9zeiwgcmVhbF9zeiwKPiArCQkJCQkgICAgICAmb2Zmc2V0 LCAwKTsKPiArCQkJaWYgKHJjIDwgMCkgewo+ICsJCQkJa2ZyZWUobm90ZXNfc2VjdGlvbik7Cj4g KwkJCQlyZXR1cm4gcmM7Cj4gKwkJCX0KPiAgCQl9Cj4gLQkJbmV3LT5wYWRkciA9IHBoZHJfcHRy LT5wX29mZnNldDsKPiAtCQluZXctPnNpemUgPSByZWFsX3N6Owo+IC0JCWxpc3RfYWRkX3RhaWwo Jm5ldy0+bGlzdCwgdmNfbGlzdCk7Cj4gIAkJcGhkcl9zeiArPSByZWFsX3N6Owo+ICAJCWtmcmVl KG5vdGVzX3NlY3Rpb24pOwo+ICAJfQo+ICAKPiArCWlmIChucl9ub3RlcykKPiArCQkqbnJfbm90 ZXMgPSBucl9wdG5vdGU7Cj4gKwlpZiAobm90ZXNfc3opCj4gKwkJKm5vdGVzX3N6ID0gcGhkcl9z ejsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBfX2luaXQgZ2V0X25v dGVfbnVtYmVyX2FuZF9zaXplX2VsZjMyKGNvbnN0IEVsZjMyX0VoZHIgKmVoZHJfcHRyLAo+ICsJ CQkJCQkgaW50ICpucl9wdG5vdGUsIHU2NCAqcGhkcl9zeikKPiArewo+ICsJcmV0dXJuIHByb2Nl c3Nfbm90ZV9oZWFkZXJzX2VsZjMyKGVoZHJfcHRyLCBucl9wdG5vdGUsIHBoZHJfc3osIE5VTEwp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9faW5pdCBjb3B5X25vdGVzX2VsZjMyKGNvbnN0IEVs ZjMyX0VoZHIgKmVoZHJfcHRyLCBjaGFyICpub3Rlc19idWYpCj4gK3sKPiArCXJldHVybiBwcm9j ZXNzX25vdGVfaGVhZGVyc19lbGYzMihlaGRyX3B0ciwgTlVMTCwgTlVMTCwgbm90ZXNfYnVmKTsK PiArfQo+ICsKPiArLyogTWVyZ2VzIGFsbCB0aGUgUFRfTk9URSBoZWFkZXJzIGludG8gb25lLiAq Lwo+ICtzdGF0aWMgaW50IF9faW5pdCBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmMzIoY2hhciAqZWxm cHRyLCBzaXplX3QgKmVsZnN6LAo+ICsJCQkJCSAgIGNoYXIgKipub3Rlc19idWYsIHNpemVfdCAq bm90ZXNfc3opCj4gK3sKPiArCWludCBpLCBucl9wdG5vdGU9MCwgcmM9MDsKPiArCWNoYXIgKnRt cDsKPiArCUVsZjMyX0VoZHIgKmVoZHJfcHRyOwo+ICsJRWxmMzJfUGhkciBwaGRyOwo+ICsJdTY0 IHBoZHJfc3ogPSAwLCBub3RlX29mZjsKPiArCXN0cnVjdCB2bV9zdHJ1Y3QgKnZtOwo+ICsKPiAr CWVoZHJfcHRyID0gKEVsZjMyX0VoZHIgKillbGZwdHI7Cj4gKwo+ICsJcmMgPSBnZXRfbm90ZV9u dW1iZXJfYW5kX3NpemVfZWxmMzIoZWhkcl9wdHIsICZucl9wdG5vdGUsICZwaGRyX3N6KTsKPiAr CWlmIChyYyA8IDApCj4gKwkJcmV0dXJuIHJjOwo+ICsKPiArCSpub3Rlc19zeiA9IHJvdW5kdXAo cGhkcl9zeiwgUEFHRV9TSVpFKTsKPiArCSpub3Rlc19idWYgPSB2emFsbG9jKCpub3Rlc19zeik7 Cj4gKwlpZiAoISpub3Rlc19idWYpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJdm0gPSBm aW5kX3ZtX2FyZWEoKm5vdGVzX2J1Zik7Cj4gKwlCVUdfT04oIXZtKTsKPiArCXZtLT5mbGFncyB8 PSBWTV9VU0VSTUFQOwo+ICsKPiArCXJjID0gY29weV9ub3Rlc19lbGYzMihlaGRyX3B0ciwgKm5v dGVzX2J1Zik7Cj4gKwlpZiAocmMgPCAwKQo+ICsJCXJldHVybiByYzsKPiArCj4gIAkvKiBQcmVw YXJlIG1lcmdlZCBQVF9OT1RFIHByb2dyYW0gaGVhZGVyLiAqLwo+ICAJcGhkci5wX3R5cGUgICAg PSBQVF9OT1RFOwo+ICAJcGhkci5wX2ZsYWdzICAgPSAwOwo+IEBAIC0zOTEsNiArNTMwLDcgQEAg c3RhdGljIGludCBfX2luaXQgbWVyZ2Vfbm90ZV9oZWFkZXJzX2VsZjMyKGNoYXIgKmVsZnB0ciwg c2l6ZV90ICplbGZzeiwKPiAgICogdGhlIG5ldyBvZmZzZXQgZmllbGRzIG9mIGV4cG9ydGVkIHBy b2dyYW0gaGVhZGVycy4gKi8KPiAgc3RhdGljIGludCBfX2luaXQgcHJvY2Vzc19wdGxvYWRfcHJv Z3JhbV9oZWFkZXJzX2VsZjY0KGNoYXIgKmVsZnB0ciwKPiAgCQkJCQkJc2l6ZV90IGVsZnN6LAo+ ICsJCQkJCQlzaXplX3QgZWxmbm90ZXNfc3osCj4gIAkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnZj X2xpc3QpCj4gIHsKPiAgCWludCBpOwo+IEBAIC00MDIsOCArNTQyLDggQEAgc3RhdGljIGludCBf X2luaXQgcHJvY2Vzc19wdGxvYWRfcHJvZ3JhbV9oZWFkZXJzX2VsZjY0KGNoYXIgKmVsZnB0ciwK PiAgCWVoZHJfcHRyID0gKEVsZjY0X0VoZHIgKillbGZwdHI7Cj4gIAlwaGRyX3B0ciA9IChFbGY2 NF9QaGRyKikoZWxmcHRyICsgc2l6ZW9mKEVsZjY0X0VoZHIpKTsgLyogUFRfTk9URSBoZHIgKi8K PiAgCj4gLQkvKiBGaXJzdCBwcm9ncmFtIGhlYWRlciBpcyBQVF9OT1RFIGhlYWRlci4gKi8KPiAt CXZtY29yZV9vZmYgPSBlbGZzeiArIHJvdW5kdXAocGhkcl9wdHItPnBfbWVtc3osIFBBR0VfU0la RSk7Cj4gKwkvKiBTa2lwIEVsZiBoZWFkZXIsIHByb2dyYW0gaGVhZGVycyBhbmQgRWxmIG5vdGUg c2VnbWVudC4gKi8KPiArCXZtY29yZV9vZmYgPSBlbGZzeiArIGVsZm5vdGVzX3N6Owo+ICAKPiAg CWZvciAoaSA9IDA7IGkgPCBlaGRyX3B0ci0+ZV9waG51bTsgaSsrLCBwaGRyX3B0cisrKSB7Cj4g IAkJdTY0IHBhZGRyLCBzdGFydCwgZW5kLCBzaXplOwo+IEBAIC00MzMsNiArNTczLDcgQEAgc3Rh dGljIGludCBfX2luaXQgcHJvY2Vzc19wdGxvYWRfcHJvZ3JhbV9oZWFkZXJzX2VsZjY0KGNoYXIg KmVsZnB0ciwKPiAgCj4gIHN0YXRpYyBpbnQgX19pbml0IHByb2Nlc3NfcHRsb2FkX3Byb2dyYW1f aGVhZGVyc19lbGYzMihjaGFyICplbGZwdHIsCj4gIAkJCQkJCXNpemVfdCBlbGZzeiwKPiArCQkJ CQkJc2l6ZV90IGVsZm5vdGVzX3N6LAo+ICAJCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICp2Y19saXN0 KQo+ICB7Cj4gIAlpbnQgaTsKPiBAQCAtNDQ0LDggKzU4NSw4IEBAIHN0YXRpYyBpbnQgX19pbml0 IHByb2Nlc3NfcHRsb2FkX3Byb2dyYW1faGVhZGVyc19lbGYzMihjaGFyICplbGZwdHIsCj4gIAll aGRyX3B0ciA9IChFbGYzMl9FaGRyICopZWxmcHRyOwo+ICAJcGhkcl9wdHIgPSAoRWxmMzJfUGhk ciopKGVsZnB0ciArIHNpemVvZihFbGYzMl9FaGRyKSk7IC8qIFBUX05PVEUgaGRyICovCj4gIAo+ IC0JLyogRmlyc3QgcHJvZ3JhbSBoZWFkZXIgaXMgUFRfTk9URSBoZWFkZXIuICovCj4gLQl2bWNv cmVfb2ZmID0gZWxmc3ogKyByb3VuZHVwKHBoZHJfcHRyLT5wX21lbXN6LCBQQUdFX1NJWkUpOwo+ ICsJLyogU2tpcCBFbGYgaGVhZGVyLCBwcm9ncmFtIGhlYWRlcnMgYW5kIEVsZiBub3RlIHNlZ21l bnQuICovCj4gKwl2bWNvcmVfb2ZmID0gZWxmc3ogKyBlbGZub3Rlc19zejsKPiAgCj4gIAlmb3Ig KGkgPSAwOyBpIDwgZWhkcl9wdHItPmVfcGhudW07IGkrKywgcGhkcl9wdHIrKykgewo+ICAJCXU2 NCBwYWRkciwgc3RhcnQsIGVuZCwgc2l6ZTsKPiBAQCAtNDc0LDE3ICs2MTUsMTUgQEAgc3RhdGlj IGludCBfX2luaXQgcHJvY2Vzc19wdGxvYWRfcHJvZ3JhbV9oZWFkZXJzX2VsZjMyKGNoYXIgKmVs ZnB0ciwKPiAgfQo+ICAKPiAgLyogU2V0cyBvZmZzZXQgZmllbGRzIG9mIHZtY29yZSBlbGVtZW50 cy4gKi8KPiAtc3RhdGljIHZvaWQgX19pbml0IHNldF92bWNvcmVfbGlzdF9vZmZzZXRzX2VsZjY0 KGNoYXIgKmVsZnB0ciwgc2l6ZV90IGVsZnN6LAo+ICtzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3Zt Y29yZV9saXN0X29mZnNldHNfZWxmNjQoc2l6ZV90IGVsZnN6LAo+ICsJCQkJCQlzaXplX3QgZWxm bm90ZXNfc3osCj4gIAkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnZjX2xpc3QpCj4gIHsKPiAgCWxv ZmZfdCB2bWNvcmVfb2ZmOwo+IC0JRWxmNjRfRWhkciAqZWhkcl9wdHI7Cj4gIAlzdHJ1Y3Qgdm1j b3JlICptOwo+ICAKPiAtCWVoZHJfcHRyID0gKEVsZjY0X0VoZHIgKillbGZwdHI7Cj4gLQo+IC0J LyogU2tpcCBFbGYgaGVhZGVyIGFuZCBwcm9ncmFtIGhlYWRlcnMuICovCj4gLQl2bWNvcmVfb2Zm ID0gZWxmc3o7Cj4gKwkvKiBTa2lwIEVsZiBoZWFkZXIsIHByb2dyYW0gaGVhZGVycyBhbmQgRWxm IG5vdGUgc2VnbWVudC4gKi8KPiArCXZtY29yZV9vZmYgPSBlbGZzeiArIGVsZm5vdGVzX3N6Owo+ ICAKPiAgCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgdmNfbGlzdCwgbGlzdCkgewo+ICAJCW0tPm9m ZnNldCA9IHZtY29yZV9vZmY7Cj4gQEAgLTQ5MywxNyArNjMyLDE1IEBAIHN0YXRpYyB2b2lkIF9f aW5pdCBzZXRfdm1jb3JlX2xpc3Rfb2Zmc2V0c19lbGY2NChjaGFyICplbGZwdHIsIHNpemVfdCBl bGZzeiwKPiAgfQo+ICAKPiAgLyogU2V0cyBvZmZzZXQgZmllbGRzIG9mIHZtY29yZSBlbGVtZW50 cy4gKi8KPiAtc3RhdGljIHZvaWQgX19pbml0IHNldF92bWNvcmVfbGlzdF9vZmZzZXRzX2VsZjMy KGNoYXIgKmVsZnB0ciwgc2l6ZV90IGVsZnN6LAo+ICtzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3Zt Y29yZV9saXN0X29mZnNldHNfZWxmMzIoc2l6ZV90IGVsZnN6LAo+ICsJCQkJCQlzaXplX3QgZWxm bm90ZXNfc3osCj4gIAkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnZjX2xpc3QpCj4gIHsKPiAgCWxv ZmZfdCB2bWNvcmVfb2ZmOwo+IC0JRWxmMzJfRWhkciAqZWhkcl9wdHI7Cj4gIAlzdHJ1Y3Qgdm1j b3JlICptOwo+ICAKPiAtCWVoZHJfcHRyID0gKEVsZjMyX0VoZHIgKillbGZwdHI7Cj4gLQo+IC0J LyogU2tpcCBFbGYgaGVhZGVyIGFuZCBwcm9ncmFtIGhlYWRlcnMuICovCj4gLQl2bWNvcmVfb2Zm ID0gZWxmc3o7Cj4gKwkvKiBTa2lwIEVsZiBoZWFkZXIsIHByb2dyYW0gaGVhZGVycyBhbmQgRWxm IG5vdGUgc2VnbWVudC4gKi8KPiArCXZtY29yZV9vZmYgPSBlbGZzeiArIGVsZm5vdGVzX3N6Owo+ ICAKPiAgCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgdmNfbGlzdCwgbGlzdCkgewo+ICAJCW0tPm9m ZnNldCA9IHZtY29yZV9vZmY7Cj4gQEAgLTU1NCwyMCArNjkxLDIzIEBAIHN0YXRpYyBpbnQgX19p bml0IHBhcnNlX2NyYXNoX2VsZjY0X2hlYWRlcnModm9pZCkKPiAgCX0KPiAgCj4gIAkvKiBNZXJn ZSBhbGwgUFRfTk9URSBoZWFkZXJzIGludG8gb25lLiAqLwo+IC0JcmMgPSBtZXJnZV9ub3RlX2hl YWRlcnNfZWxmNjQoZWxmY29yZWJ1ZiwgJmVsZmNvcmVidWZfc3osICZ2bWNvcmVfbGlzdCk7Cj4g KwlyYyA9IG1lcmdlX25vdGVfaGVhZGVyc19lbGY2NChlbGZjb3JlYnVmLCAmZWxmY29yZWJ1Zl9z eiwKPiArCQkJCSAgICAgICZlbGZub3Rlc19idWYsICZlbGZub3Rlc19zeik7Cj4gIAlpZiAocmMp IHsKPiAgCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWVsZmNvcmVidWYsCj4gIAkJCSAgIGdl dF9vcmRlcihlbGZjb3JlYnVmX3N6X29yaWcpKTsKPiAgCQlyZXR1cm4gcmM7Cj4gIAl9Cj4gIAly YyA9IHByb2Nlc3NfcHRsb2FkX3Byb2dyYW1faGVhZGVyc19lbGY2NChlbGZjb3JlYnVmLCBlbGZj b3JlYnVmX3N6LAo+IC0JCQkJCQkJJnZtY29yZV9saXN0KTsKPiArCQkJCQkJICBlbGZub3Rlc19z eiwKPiArCQkJCQkJICAmdm1jb3JlX2xpc3QpOwo+ICAJaWYgKHJjKSB7Cj4gIAkJZnJlZV9wYWdl cygodW5zaWduZWQgbG9uZyllbGZjb3JlYnVmLAo+ICAJCQkgICBnZXRfb3JkZXIoZWxmY29yZWJ1 Zl9zel9vcmlnKSk7Cj4gIAkJcmV0dXJuIHJjOwo+ICAJfQo+IC0Jc2V0X3ZtY29yZV9saXN0X29m ZnNldHNfZWxmNjQoZWxmY29yZWJ1ZiwgZWxmY29yZWJ1Zl9zeiwgJnZtY29yZV9saXN0KTsKPiAr CXNldF92bWNvcmVfbGlzdF9vZmZzZXRzX2VsZjY0KGVsZmNvcmVidWZfc3osIGVsZm5vdGVzX3N6 LAo+ICsJCQkJICAgICAgJnZtY29yZV9saXN0KTsKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+IEBA IC02MTQsMjAgKzc1NCwyMyBAQCBzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9jcmFzaF9lbGYzMl9o ZWFkZXJzKHZvaWQpCj4gIAl9Cj4gIAo+ICAJLyogTWVyZ2UgYWxsIFBUX05PVEUgaGVhZGVycyBp bnRvIG9uZS4gKi8KPiAtCXJjID0gbWVyZ2Vfbm90ZV9oZWFkZXJzX2VsZjMyKGVsZmNvcmVidWYs ICZlbGZjb3JlYnVmX3N6LCAmdm1jb3JlX2xpc3QpOwo+ICsJcmMgPSBtZXJnZV9ub3RlX2hlYWRl cnNfZWxmMzIoZWxmY29yZWJ1ZiwgJmVsZmNvcmVidWZfc3osCj4gKwkJCQkgICAgICAmZWxmbm90 ZXNfYnVmLCAmZWxmbm90ZXNfc3opOwo+ICAJaWYgKHJjKSB7Cj4gIAkJZnJlZV9wYWdlcygodW5z aWduZWQgbG9uZyllbGZjb3JlYnVmLAo+ICAJCQkgICBnZXRfb3JkZXIoZWxmY29yZWJ1Zl9zel9v cmlnKSk7Cj4gIAkJcmV0dXJuIHJjOwo+ICAJfQo+ICAJcmMgPSBwcm9jZXNzX3B0bG9hZF9wcm9n cmFtX2hlYWRlcnNfZWxmMzIoZWxmY29yZWJ1ZiwgZWxmY29yZWJ1Zl9zeiwKPiAtCQkJCQkJCQkm dm1jb3JlX2xpc3QpOwo+ICsJCQkJCQkgIGVsZm5vdGVzX3N6LAo+ICsJCQkJCQkgICZ2bWNvcmVf bGlzdCk7Cj4gIAlpZiAocmMpIHsKPiAgCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWVsZmNv cmVidWYsCj4gIAkJCSAgIGdldF9vcmRlcihlbGZjb3JlYnVmX3N6X29yaWcpKTsKPiAgCQlyZXR1 cm4gcmM7Cj4gIAl9Cj4gLQlzZXRfdm1jb3JlX2xpc3Rfb2Zmc2V0c19lbGYzMihlbGZjb3JlYnVm LCBlbGZjb3JlYnVmX3N6LCAmdm1jb3JlX2xpc3QpOwo+ICsJc2V0X3ZtY29yZV9saXN0X29mZnNl dHNfZWxmMzIoZWxmY29yZWJ1Zl9zeiwgZWxmbm90ZXNfc3osCj4gKwkJCQkgICAgICAmdm1jb3Jl X2xpc3QpOwo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gQEAgLTcwNiw2ICs4NDksOCBAQCB2b2lk IHZtY29yZV9jbGVhbnVwKHZvaWQpCj4gIAkJbGlzdF9kZWwoJm0tPmxpc3QpOwo+ICAJCWtmcmVl KG0pOwo+ICAJfQo+ICsJdmZyZWUoZWxmbm90ZXNfYnVmKTsKPiArCWVsZm5vdGVzX2J1ZiA9IE5V TEw7Cj4gIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWVsZmNvcmVidWYsCj4gIAkJICAgZ2V0 X29yZGVyKGVsZmNvcmVidWZfc3pfb3JpZykpOwo+ICAJZWxmY29yZWJ1ZiA9IE5VTEw7Cj4gCj4g CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Ka2V4ZWMg bWFpbGluZyBsaXN0CmtleGVjQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9rZXhlYwo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from psmtp.com (na3sys010amx128.postini.com [74.125.245.128]) by kanga.kvack.org (Postfix) with SMTP id 2E97E6B0034 for ; Thu, 16 May 2013 03:29:31 -0400 (EDT) Message-ID: <51948872.5090402@cn.fujitsu.com> Date: Thu, 16 May 2013 15:19:14 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v6 6/8] vmcore: allocate ELF note segment in the 2nd kernel vmalloc memory References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090614.28109.26492.stgit@localhost6.localdomain6> In-Reply-To: <20130515090614.28109.26492.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:06, HATAYAMA Daisuke =E5= =86=99=E9=81=93: > The reasons why we don't allocate ELF note segment in the 1st kernel > (old memory) on page boundary is to keep backward compatibility for > old kernels, and that if doing so, we waste not a little memory due to > round-up operation to fit the memory to page boundary since most of > the buffers are in per-cpu area. >=20 > ELF notes are per-cpu, so total size of ELF note segments depends on > number of CPUs. The current maximum number of CPUs on x86=5F64 is 5192, > and there's already system with 4192 CPUs in SGI, where total size > amounts to 1MB. This can be larger in the near future or possibly even > now on another architecture that has larger size of note per a single > cpu. Thus, to avoid the case where memory allocation for large block > fails, we allocate vmcore objects on vmalloc memory. >=20 > This patch adds elfnotes=5Fbuf and elfnotes=5Fsz variables to keep pointer > to the ELF note segment buffer and its size. There's no longer the > vmcore object that corresponds to the ELF note segment in > vmcore=5Flist. Accordingly, read=5Fvmcore() has new case for ELF note > segment and set=5Fvmcore=5Flist=5Foffsets=5Felf{64,32}() and other helper > functions starts calculating offset from sum of size of ELF headers > and size of ELF note segment. >=20 > Signed-off-by: HATAYAMA Daisuke > --- Acked-by: Zhang Yanfei >=20 > fs/proc/vmcore.c | 273 +++++++++++++++++++++++++++++++++++++++++-------= ------ > 1 files changed, 209 insertions(+), 64 deletions(-) >=20 > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index 6cf7fbd..4e121fda 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -34,6 +34,9 @@ static char *elfcorebuf; > static size=5Ft elfcorebuf=5Fsz; > static size=5Ft elfcorebuf=5Fsz=5Forig; > =20 > +static char *elfnotes=5Fbuf; > +static size=5Ft elfnotes=5Fsz; > + > /* Total size of vmcore file. */ > static u64 vmcore=5Fsize; > =20 > @@ -154,6 +157,26 @@ static ssize=5Ft read=5Fvmcore(struct file *file, ch= ar =5F=5Fuser *buffer, > return acc; > } > =20 > + /* Read Elf note segment */ > + if (*fpos < elfcorebuf=5Fsz + elfnotes=5Fsz) { > + void *kaddr; > + > + tsz =3D elfcorebuf=5Fsz + elfnotes=5Fsz - *fpos; > + if (buflen < tsz) > + tsz =3D buflen; > + kaddr =3D elfnotes=5Fbuf + *fpos - elfcorebuf=5Fsz; > + if (copy=5Fto=5Fuser(buffer, kaddr, tsz)) > + return -EFAULT; > + buflen -=3D tsz; > + *fpos +=3D tsz; > + buffer +=3D tsz; > + acc +=3D tsz; > + > + /* leave now if filled buffer already */ > + if (buflen =3D=3D 0) > + return acc; > + } > + > list=5Ffor=5Feach=5Fentry(m, &vmcore=5Flist, list) { > if (*fpos < m->offset + m->size) { > tsz =3D m->offset + m->size - *fpos; > @@ -221,23 +244,33 @@ static u64 =5F=5Finit get=5Fvmcore=5Fsize=5Felf32(c= har *elfptr, size=5Ft elfsz) > return size; > } > =20 > -/* Merges all the PT=5FNOTE headers into one. */ > -static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf64(char *elfptr, size= =5Ft *elfsz, > - struct list=5Fhead *vc=5Flist) > +/** > + * process=5Fnote=5Fheaders=5Felf64 - Perform a variety of processing on= ELF > + * note segments according to the combination of function arguments. > + * > + * @ehdr=5Fptr - ELF header buffer > + * @nr=5Fnotes - the number of program header entries of PT=5FNOTE type > + * @notes=5Fsz - total size of ELF note segment > + * @notes=5Fbuf - buffer into which ELF note segment is copied > + * > + * Assume @ehdr=5Fptr is always not NULL. If @nr=5Fnotes is not NULL, th= en > + * the number of program header entries of PT=5FNOTE type is assigned to > + * @nr=5Fnotes. If @notes=5Fsz is not NULL, then total size of ELF note > + * segment, header part plus data part, is assigned to @notes=5Fsz. If > + * @notes=5Fbuf is not NULL, then ELF note segment is copied into > + * @notes=5Fbuf. > + */ > +static int =5F=5Finit process=5Fnote=5Fheaders=5Felf64(const Elf64=5FEhd= r *ehdr=5Fptr, > + int *nr=5Fnotes, u64 *notes=5Fsz, > + char *notes=5Fbuf) > { > int i, nr=5Fptnote=3D0, rc=3D0; > - char *tmp; > - Elf64=5FEhdr *ehdr=5Fptr; > - Elf64=5FPhdr phdr, *phdr=5Fptr; > + Elf64=5FPhdr *phdr=5Fptr =3D (Elf64=5FPhdr*)(ehdr=5Fptr + 1); > Elf64=5FNhdr *nhdr=5Fptr; > - u64 phdr=5Fsz =3D 0, note=5Foff; > + u64 phdr=5Fsz =3D 0; > =20 > - ehdr=5Fptr =3D (Elf64=5FEhdr *)elfptr; > - phdr=5Fptr =3D (Elf64=5FPhdr*)(elfptr + sizeof(Elf64=5FEhdr)); > for (i =3D 0; i < ehdr=5Fptr->e=5Fphnum; i++, phdr=5Fptr++) { > - int j; > void *notes=5Fsection; > - struct vmcore *new; > u64 offset, max=5Fsz, sz, real=5Fsz =3D 0; > if (phdr=5Fptr->p=5Ftype !=3D PT=5FNOTE) > continue; > @@ -253,7 +286,7 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf64(= char *elfptr, size=5Ft *elfsz, > return rc; > } > nhdr=5Fptr =3D notes=5Fsection; > - for (j =3D 0; j < max=5Fsz; j +=3D sz) { > + while (real=5Fsz < max=5Fsz) { > if (nhdr=5Fptr->n=5Fnamesz =3D=3D 0) > break; > sz =3D sizeof(Elf64=5FNhdr) + > @@ -262,20 +295,68 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf6= 4(char *elfptr, size=5Ft *elfsz, > real=5Fsz +=3D sz; > nhdr=5Fptr =3D (Elf64=5FNhdr*)((char*)nhdr=5Fptr + sz); > } > - > - /* Add this contiguous chunk of notes section to vmcore list.*/ > - new =3D get=5Fnew=5Felement(); > - if (!new) { > - kfree(notes=5Fsection); > - return -ENOMEM; > + if (notes=5Fbuf) { > + offset =3D phdr=5Fptr->p=5Foffset; > + rc =3D read=5Ffrom=5Foldmem(notes=5Fbuf + phdr=5Fsz, real=5Fsz, > + &offset, 0); > + if (rc < 0) { > + kfree(notes=5Fsection); > + return rc; > + } > } > - new->paddr =3D phdr=5Fptr->p=5Foffset; > - new->size =3D real=5Fsz; > - list=5Fadd=5Ftail(&new->list, vc=5Flist); > phdr=5Fsz +=3D real=5Fsz; > kfree(notes=5Fsection); > } > =20 > + if (nr=5Fnotes) > + *nr=5Fnotes =3D nr=5Fptnote; > + if (notes=5Fsz) > + *notes=5Fsz =3D phdr=5Fsz; > + > + return 0; > +} > + > +static int =5F=5Finit get=5Fnote=5Fnumber=5Fand=5Fsize=5Felf64(const Elf= 64=5FEhdr *ehdr=5Fptr, > + int *nr=5Fptnote, u64 *phdr=5Fsz) > +{ > + return process=5Fnote=5Fheaders=5Felf64(ehdr=5Fptr, nr=5Fptnote, phdr= =5Fsz, NULL); > +} > + > +static int =5F=5Finit copy=5Fnotes=5Felf64(const Elf64=5FEhdr *ehdr=5Fpt= r, char *notes=5Fbuf) > +{ > + return process=5Fnote=5Fheaders=5Felf64(ehdr=5Fptr, NULL, NULL, notes= =5Fbuf); > +} > + > +/* Merges all the PT=5FNOTE headers into one. */ > +static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf64(char *elfptr, size= =5Ft *elfsz, > + char **notes=5Fbuf, size=5Ft *notes=5Fsz) > +{ > + int i, nr=5Fptnote=3D0, rc=3D0; > + char *tmp; > + Elf64=5FEhdr *ehdr=5Fptr; > + Elf64=5FPhdr phdr; > + u64 phdr=5Fsz =3D 0, note=5Foff; > + struct vm=5Fstruct *vm; > + > + ehdr=5Fptr =3D (Elf64=5FEhdr *)elfptr; > + > + rc =3D get=5Fnote=5Fnumber=5Fand=5Fsize=5Felf64(ehdr=5Fptr, &nr=5Fptnot= e, &phdr=5Fsz); > + if (rc < 0) > + return rc; > + > + *notes=5Fsz =3D roundup(phdr=5Fsz, PAGE=5FSIZE); > + *notes=5Fbuf =3D vzalloc(*notes=5Fsz); > + if (!*notes=5Fbuf) > + return -ENOMEM; > + > + vm =3D find=5Fvm=5Farea(*notes=5Fbuf); > + BUG=5FON(!vm); > + vm->flags |=3D VM=5FUSERMAP; > + > + rc =3D copy=5Fnotes=5Felf64(ehdr=5Fptr, *notes=5Fbuf); > + if (rc < 0) > + return rc; > + > /* Prepare merged PT=5FNOTE program header. */ > phdr.p=5Ftype =3D PT=5FNOTE; > phdr.p=5Fflags =3D 0; > @@ -304,23 +385,33 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf6= 4(char *elfptr, size=5Ft *elfsz, > return 0; > } > =20 > -/* Merges all the PT=5FNOTE headers into one. */ > -static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf32(char *elfptr, size= =5Ft *elfsz, > - struct list=5Fhead *vc=5Flist) > +/** > + * process=5Fnote=5Fheaders=5Felf32 - Perform a variety of processing on= ELF > + * note segments according to the combination of function arguments. > + * > + * @ehdr=5Fptr - ELF header buffer > + * @nr=5Fnotes - the number of program header entries of PT=5FNOTE type > + * @notes=5Fsz - total size of ELF note segment > + * @notes=5Fbuf - buffer into which ELF note segment is copied > + * > + * Assume @ehdr=5Fptr is always not NULL. If @nr=5Fnotes is not NULL, th= en > + * the number of program header entries of PT=5FNOTE type is assigned to > + * @nr=5Fnotes. If @notes=5Fsz is not NULL, then total size of ELF note > + * segment, header part plus data part, is assigned to @notes=5Fsz. If > + * @notes=5Fbuf is not NULL, then ELF note segment is copied into > + * @notes=5Fbuf. > + */ > +static int =5F=5Finit process=5Fnote=5Fheaders=5Felf32(const Elf32=5FEhd= r *ehdr=5Fptr, > + int *nr=5Fnotes, u64 *notes=5Fsz, > + char *notes=5Fbuf) > { > int i, nr=5Fptnote=3D0, rc=3D0; > - char *tmp; > - Elf32=5FEhdr *ehdr=5Fptr; > - Elf32=5FPhdr phdr, *phdr=5Fptr; > + Elf32=5FPhdr *phdr=5Fptr =3D (Elf32=5FPhdr*)(ehdr=5Fptr + 1); > Elf32=5FNhdr *nhdr=5Fptr; > - u64 phdr=5Fsz =3D 0, note=5Foff; > + u64 phdr=5Fsz =3D 0; > =20 > - ehdr=5Fptr =3D (Elf32=5FEhdr *)elfptr; > - phdr=5Fptr =3D (Elf32=5FPhdr*)(elfptr + sizeof(Elf32=5FEhdr)); > for (i =3D 0; i < ehdr=5Fptr->e=5Fphnum; i++, phdr=5Fptr++) { > - int j; > void *notes=5Fsection; > - struct vmcore *new; > u64 offset, max=5Fsz, sz, real=5Fsz =3D 0; > if (phdr=5Fptr->p=5Ftype !=3D PT=5FNOTE) > continue; > @@ -336,7 +427,7 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf32(= char *elfptr, size=5Ft *elfsz, > return rc; > } > nhdr=5Fptr =3D notes=5Fsection; > - for (j =3D 0; j < max=5Fsz; j +=3D sz) { > + while (real=5Fsz < max=5Fsz) { > if (nhdr=5Fptr->n=5Fnamesz =3D=3D 0) > break; > sz =3D sizeof(Elf32=5FNhdr) + > @@ -345,20 +436,68 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf3= 2(char *elfptr, size=5Ft *elfsz, > real=5Fsz +=3D sz; > nhdr=5Fptr =3D (Elf32=5FNhdr*)((char*)nhdr=5Fptr + sz); > } > - > - /* Add this contiguous chunk of notes section to vmcore list.*/ > - new =3D get=5Fnew=5Felement(); > - if (!new) { > - kfree(notes=5Fsection); > - return -ENOMEM; > + if (notes=5Fbuf) { > + offset =3D phdr=5Fptr->p=5Foffset; > + rc =3D read=5Ffrom=5Foldmem(notes=5Fbuf + phdr=5Fsz, real=5Fsz, > + &offset, 0); > + if (rc < 0) { > + kfree(notes=5Fsection); > + return rc; > + } > } > - new->paddr =3D phdr=5Fptr->p=5Foffset; > - new->size =3D real=5Fsz; > - list=5Fadd=5Ftail(&new->list, vc=5Flist); > phdr=5Fsz +=3D real=5Fsz; > kfree(notes=5Fsection); > } > =20 > + if (nr=5Fnotes) > + *nr=5Fnotes =3D nr=5Fptnote; > + if (notes=5Fsz) > + *notes=5Fsz =3D phdr=5Fsz; > + > + return 0; > +} > + > +static int =5F=5Finit get=5Fnote=5Fnumber=5Fand=5Fsize=5Felf32(const Elf= 32=5FEhdr *ehdr=5Fptr, > + int *nr=5Fptnote, u64 *phdr=5Fsz) > +{ > + return process=5Fnote=5Fheaders=5Felf32(ehdr=5Fptr, nr=5Fptnote, phdr= =5Fsz, NULL); > +} > + > +static int =5F=5Finit copy=5Fnotes=5Felf32(const Elf32=5FEhdr *ehdr=5Fpt= r, char *notes=5Fbuf) > +{ > + return process=5Fnote=5Fheaders=5Felf32(ehdr=5Fptr, NULL, NULL, notes= =5Fbuf); > +} > + > +/* Merges all the PT=5FNOTE headers into one. */ > +static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf32(char *elfptr, size= =5Ft *elfsz, > + char **notes=5Fbuf, size=5Ft *notes=5Fsz) > +{ > + int i, nr=5Fptnote=3D0, rc=3D0; > + char *tmp; > + Elf32=5FEhdr *ehdr=5Fptr; > + Elf32=5FPhdr phdr; > + u64 phdr=5Fsz =3D 0, note=5Foff; > + struct vm=5Fstruct *vm; > + > + ehdr=5Fptr =3D (Elf32=5FEhdr *)elfptr; > + > + rc =3D get=5Fnote=5Fnumber=5Fand=5Fsize=5Felf32(ehdr=5Fptr, &nr=5Fptnot= e, &phdr=5Fsz); > + if (rc < 0) > + return rc; > + > + *notes=5Fsz =3D roundup(phdr=5Fsz, PAGE=5FSIZE); > + *notes=5Fbuf =3D vzalloc(*notes=5Fsz); > + if (!*notes=5Fbuf) > + return -ENOMEM; > + > + vm =3D find=5Fvm=5Farea(*notes=5Fbuf); > + BUG=5FON(!vm); > + vm->flags |=3D VM=5FUSERMAP; > + > + rc =3D copy=5Fnotes=5Felf32(ehdr=5Fptr, *notes=5Fbuf); > + if (rc < 0) > + return rc; > + > /* Prepare merged PT=5FNOTE program header. */ > phdr.p=5Ftype =3D PT=5FNOTE; > phdr.p=5Fflags =3D 0; > @@ -391,6 +530,7 @@ static int =5F=5Finit merge=5Fnote=5Fheaders=5Felf32(= char *elfptr, size=5Ft *elfsz, > * the new offset fields of exported program headers. */ > static int =5F=5Finit process=5Fptload=5Fprogram=5Fheaders=5Felf64(char = *elfptr, > size=5Ft elfsz, > + size=5Ft elfnotes=5Fsz, > struct list=5Fhead *vc=5Flist) > { > int i; > @@ -402,8 +542,8 @@ static int =5F=5Finit process=5Fptload=5Fprogram=5Fhe= aders=5Felf64(char *elfptr, > ehdr=5Fptr =3D (Elf64=5FEhdr *)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 elfsz + roundup(phdr=5Fptr->p=5Fmemsz, PAGE=5FSIZE); > + /* Skip Elf header, program headers and Elf note segment. */ > + vmcore=5Foff =3D elfsz + elfnotes=5Fsz; > =20 > for (i =3D 0; i < ehdr=5Fptr->e=5Fphnum; i++, phdr=5Fptr++) { > u64 paddr, start, end, size; > @@ -433,6 +573,7 @@ static int =5F=5Finit process=5Fptload=5Fprogram=5Fhe= aders=5Felf64(char *elfptr, > =20 > static int =5F=5Finit process=5Fptload=5Fprogram=5Fheaders=5Felf32(char = *elfptr, > size=5Ft elfsz, > + size=5Ft elfnotes=5Fsz, > struct list=5Fhead *vc=5Flist) > { > int i; > @@ -444,8 +585,8 @@ static int =5F=5Finit process=5Fptload=5Fprogram=5Fhe= aders=5Felf32(char *elfptr, > ehdr=5Fptr =3D (Elf32=5FEhdr *)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 elfsz + roundup(phdr=5Fptr->p=5Fmemsz, PAGE=5FSIZE); > + /* Skip Elf header, program headers and Elf note segment. */ > + vmcore=5Foff =3D elfsz + elfnotes=5Fsz; > =20 > for (i =3D 0; i < ehdr=5Fptr->e=5Fphnum; i++, phdr=5Fptr++) { > u64 paddr, start, end, size; > @@ -474,17 +615,15 @@ static int =5F=5Finit process=5Fptload=5Fprogram=5F= headers=5Felf32(char *elfptr, > } > =20 > /* Sets offset fields of vmcore elements. */ > -static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets=5Felf64(char *elfpt= r, size=5Ft elfsz, > +static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets=5Felf64(size=5Ft el= fsz, > + size=5Ft elfnotes=5Fsz, > struct list=5Fhead *vc=5Flist) > { > loff=5Ft vmcore=5Foff; > - Elf64=5FEhdr *ehdr=5Fptr; > struct vmcore *m; > =20 > - ehdr=5Fptr =3D (Elf64=5FEhdr *)elfptr; > - > - /* Skip Elf header and program headers. */ > - vmcore=5Foff =3D elfsz; > + /* Skip Elf header, program headers and Elf note segment. */ > + vmcore=5Foff =3D elfsz + elfnotes=5Fsz; > =20 > list=5Ffor=5Feach=5Fentry(m, vc=5Flist, list) { > m->offset =3D vmcore=5Foff; > @@ -493,17 +632,15 @@ static void =5F=5Finit set=5Fvmcore=5Flist=5Foffset= s=5Felf64(char *elfptr, size=5Ft elfsz, > } > =20 > /* Sets offset fields of vmcore elements. */ > -static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets=5Felf32(char *elfpt= r, size=5Ft elfsz, > +static void =5F=5Finit set=5Fvmcore=5Flist=5Foffsets=5Felf32(size=5Ft el= fsz, > + size=5Ft elfnotes=5Fsz, > struct list=5Fhead *vc=5Flist) > { > loff=5Ft vmcore=5Foff; > - Elf32=5FEhdr *ehdr=5Fptr; > struct vmcore *m; > =20 > - ehdr=5Fptr =3D (Elf32=5FEhdr *)elfptr; > - > - /* Skip Elf header and program headers. */ > - vmcore=5Foff =3D elfsz; > + /* Skip Elf header, program headers and Elf note segment. */ > + vmcore=5Foff =3D elfsz + elfnotes=5Fsz; > =20 > list=5Ffor=5Feach=5Fentry(m, vc=5Flist, list) { > m->offset =3D vmcore=5Foff; > @@ -554,20 +691,23 @@ static int =5F=5Finit parse=5Fcrash=5Felf64=5Fheade= rs(void) > } > =20 > /* Merge all PT=5FNOTE headers into one. */ > - rc =3D merge=5Fnote=5Fheaders=5Felf64(elfcorebuf, &elfcorebuf=5Fsz, &vm= core=5Flist); > + rc =3D merge=5Fnote=5Fheaders=5Felf64(elfcorebuf, &elfcorebuf=5Fsz, > + &elfnotes=5Fbuf, &elfnotes=5Fsz); > if (rc) { > 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); > + elfnotes=5Fsz, > + &vmcore=5Flist); > if (rc) { > free=5Fpages((unsigned long)elfcorebuf, > get=5Forder(elfcorebuf=5Fsz=5Forig)); > return rc; > } > - set=5Fvmcore=5Flist=5Foffsets=5Felf64(elfcorebuf, elfcorebuf=5Fsz, &vmc= ore=5Flist); > + set=5Fvmcore=5Flist=5Foffsets=5Felf64(elfcorebuf=5Fsz, elfnotes=5Fsz, > + &vmcore=5Flist); > return 0; > } > =20 > @@ -614,20 +754,23 @@ static int =5F=5Finit parse=5Fcrash=5Felf32=5Fheade= rs(void) > } > =20 > /* Merge all PT=5FNOTE headers into one. */ > - rc =3D merge=5Fnote=5Fheaders=5Felf32(elfcorebuf, &elfcorebuf=5Fsz, &vm= core=5Flist); > + rc =3D merge=5Fnote=5Fheaders=5Felf32(elfcorebuf, &elfcorebuf=5Fsz, > + &elfnotes=5Fbuf, &elfnotes=5Fsz); > if (rc) { > 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); > + elfnotes=5Fsz, > + &vmcore=5Flist); > if (rc) { > free=5Fpages((unsigned long)elfcorebuf, > get=5Forder(elfcorebuf=5Fsz=5Forig)); > return rc; > } > - set=5Fvmcore=5Flist=5Foffsets=5Felf32(elfcorebuf, elfcorebuf=5Fsz, &vmc= ore=5Flist); > + set=5Fvmcore=5Flist=5Foffsets=5Felf32(elfcorebuf=5Fsz, elfnotes=5Fsz, > + &vmcore=5Flist); > return 0; > } > =20 > @@ -706,6 +849,8 @@ void vmcore=5Fcleanup(void) > list=5Fdel(&m->list); > kfree(m); > } > + vfree(elfnotes=5Fbuf); > + elfnotes=5Fbuf =3D NULL; > free=5Fpages((unsigned long)elfcorebuf, > get=5Forder(elfcorebuf=5Fsz=5Forig)); > elfcorebuf =3D NULL; >=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 S1756463Ab3EPIBE (ORCPT ); Thu, 16 May 2013 04:01:04 -0400 Received: from cn.fujitsu.com ([222.73.24.84]:27733 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1756387Ab3EPIBA convert rfc822-to-8bit (ORCPT ); Thu, 16 May 2013 04:01:00 -0400 X-IronPort-AV: E=Sophos;i="4.87,683,1363104000"; d="scan'208";a="7284472" Message-ID: <51948872.5090402@cn.fujitsu.com> Date: Thu, 16 May 2013 15:19:14 +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 6/8] vmcore: allocate ELF note segment in the 2nd kernel vmalloc memory References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090614.28109.26492.stgit@localhost6.localdomain6> In-Reply-To: <20130515090614.28109.26492.stgit@localhost6.localdomain6> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/16 15:20:25, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/16 15:20:49 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:06, HATAYAMA Daisuke 写道: > The reasons why we don't allocate ELF note segment in the 1st kernel > (old memory) on page boundary is to keep backward compatibility for > old kernels, and that if doing so, we waste not a little memory due to > round-up operation to fit the memory to page boundary since most of > the buffers are in per-cpu area. > > ELF notes are per-cpu, so total size of ELF note segments depends on > number of CPUs. The current maximum number of CPUs on x86_64 is 5192, > and there's already system with 4192 CPUs in SGI, where total size > amounts to 1MB. This can be larger in the near future or possibly even > now on another architecture that has larger size of note per a single > cpu. Thus, to avoid the case where memory allocation for large block > fails, we allocate vmcore objects on vmalloc memory. > > This patch adds elfnotes_buf and elfnotes_sz variables to keep pointer > to the ELF note segment buffer and its size. There's no longer the > vmcore object that corresponds to the ELF note segment in > vmcore_list. Accordingly, read_vmcore() has new case for ELF note > segment and set_vmcore_list_offsets_elf{64,32}() and other helper > functions starts calculating offset from sum of size of ELF headers > and size of ELF note segment. > > Signed-off-by: HATAYAMA Daisuke > --- Acked-by: Zhang Yanfei > > fs/proc/vmcore.c | 273 +++++++++++++++++++++++++++++++++++++++++------------- > 1 files changed, 209 insertions(+), 64 deletions(-) > > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index 6cf7fbd..4e121fda 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -34,6 +34,9 @@ static char *elfcorebuf; > static size_t elfcorebuf_sz; > static size_t elfcorebuf_sz_orig; > > +static char *elfnotes_buf; > +static size_t elfnotes_sz; > + > /* Total size of vmcore file. */ > static u64 vmcore_size; > > @@ -154,6 +157,26 @@ static ssize_t read_vmcore(struct file *file, char __user *buffer, > return acc; > } > > + /* Read Elf note segment */ > + if (*fpos < elfcorebuf_sz + elfnotes_sz) { > + void *kaddr; > + > + tsz = elfcorebuf_sz + elfnotes_sz - *fpos; > + if (buflen < tsz) > + tsz = buflen; > + kaddr = elfnotes_buf + *fpos - elfcorebuf_sz; > + if (copy_to_user(buffer, kaddr, tsz)) > + return -EFAULT; > + buflen -= tsz; > + *fpos += tsz; > + buffer += tsz; > + acc += tsz; > + > + /* leave now if filled buffer already */ > + if (buflen == 0) > + return acc; > + } > + > list_for_each_entry(m, &vmcore_list, list) { > if (*fpos < m->offset + m->size) { > tsz = m->offset + m->size - *fpos; > @@ -221,23 +244,33 @@ static u64 __init get_vmcore_size_elf32(char *elfptr, size_t elfsz) > return size; > } > > -/* Merges all the PT_NOTE headers into one. */ > -static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, > - struct list_head *vc_list) > +/** > + * process_note_headers_elf64 - Perform a variety of processing on ELF > + * note segments according to the combination of function arguments. > + * > + * @ehdr_ptr - ELF header buffer > + * @nr_notes - the number of program header entries of PT_NOTE type > + * @notes_sz - total size of ELF note segment > + * @notes_buf - buffer into which ELF note segment is copied > + * > + * Assume @ehdr_ptr is always not NULL. If @nr_notes is not NULL, then > + * the number of program header entries of PT_NOTE type is assigned to > + * @nr_notes. If @notes_sz is not NULL, then total size of ELF note > + * segment, header part plus data part, is assigned to @notes_sz. If > + * @notes_buf is not NULL, then ELF note segment is copied into > + * @notes_buf. > + */ > +static int __init process_note_headers_elf64(const Elf64_Ehdr *ehdr_ptr, > + int *nr_notes, u64 *notes_sz, > + char *notes_buf) > { > int i, nr_ptnote=0, rc=0; > - char *tmp; > - Elf64_Ehdr *ehdr_ptr; > - Elf64_Phdr phdr, *phdr_ptr; > + Elf64_Phdr *phdr_ptr = (Elf64_Phdr*)(ehdr_ptr + 1); > Elf64_Nhdr *nhdr_ptr; > - u64 phdr_sz = 0, note_off; > + u64 phdr_sz = 0; > > - ehdr_ptr = (Elf64_Ehdr *)elfptr; > - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > - int j; > void *notes_section; > - struct vmcore *new; > u64 offset, max_sz, sz, real_sz = 0; > if (phdr_ptr->p_type != PT_NOTE) > continue; > @@ -253,7 +286,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, > return rc; > } > nhdr_ptr = notes_section; > - for (j = 0; j < max_sz; j += sz) { > + while (real_sz < max_sz) { > if (nhdr_ptr->n_namesz == 0) > break; > sz = sizeof(Elf64_Nhdr) + > @@ -262,20 +295,68 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, > real_sz += sz; > nhdr_ptr = (Elf64_Nhdr*)((char*)nhdr_ptr + sz); > } > - > - /* Add this contiguous chunk of notes section to vmcore list.*/ > - new = get_new_element(); > - if (!new) { > - kfree(notes_section); > - return -ENOMEM; > + if (notes_buf) { > + offset = phdr_ptr->p_offset; > + rc = read_from_oldmem(notes_buf + phdr_sz, real_sz, > + &offset, 0); > + if (rc < 0) { > + kfree(notes_section); > + return rc; > + } > } > - new->paddr = phdr_ptr->p_offset; > - new->size = real_sz; > - list_add_tail(&new->list, vc_list); > phdr_sz += real_sz; > kfree(notes_section); > } > > + if (nr_notes) > + *nr_notes = nr_ptnote; > + if (notes_sz) > + *notes_sz = phdr_sz; > + > + return 0; > +} > + > +static int __init get_note_number_and_size_elf64(const Elf64_Ehdr *ehdr_ptr, > + int *nr_ptnote, u64 *phdr_sz) > +{ > + return process_note_headers_elf64(ehdr_ptr, nr_ptnote, phdr_sz, NULL); > +} > + > +static int __init copy_notes_elf64(const Elf64_Ehdr *ehdr_ptr, char *notes_buf) > +{ > + return process_note_headers_elf64(ehdr_ptr, NULL, NULL, notes_buf); > +} > + > +/* Merges all the PT_NOTE headers into one. */ > +static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, > + char **notes_buf, size_t *notes_sz) > +{ > + int i, nr_ptnote=0, rc=0; > + char *tmp; > + Elf64_Ehdr *ehdr_ptr; > + Elf64_Phdr phdr; > + u64 phdr_sz = 0, note_off; > + struct vm_struct *vm; > + > + ehdr_ptr = (Elf64_Ehdr *)elfptr; > + > + rc = get_note_number_and_size_elf64(ehdr_ptr, &nr_ptnote, &phdr_sz); > + if (rc < 0) > + return rc; > + > + *notes_sz = roundup(phdr_sz, PAGE_SIZE); > + *notes_buf = vzalloc(*notes_sz); > + if (!*notes_buf) > + return -ENOMEM; > + > + vm = find_vm_area(*notes_buf); > + BUG_ON(!vm); > + vm->flags |= VM_USERMAP; > + > + rc = copy_notes_elf64(ehdr_ptr, *notes_buf); > + if (rc < 0) > + return rc; > + > /* Prepare merged PT_NOTE program header. */ > phdr.p_type = PT_NOTE; > phdr.p_flags = 0; > @@ -304,23 +385,33 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, > return 0; > } > > -/* Merges all the PT_NOTE headers into one. */ > -static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, > - struct list_head *vc_list) > +/** > + * process_note_headers_elf32 - Perform a variety of processing on ELF > + * note segments according to the combination of function arguments. > + * > + * @ehdr_ptr - ELF header buffer > + * @nr_notes - the number of program header entries of PT_NOTE type > + * @notes_sz - total size of ELF note segment > + * @notes_buf - buffer into which ELF note segment is copied > + * > + * Assume @ehdr_ptr is always not NULL. If @nr_notes is not NULL, then > + * the number of program header entries of PT_NOTE type is assigned to > + * @nr_notes. If @notes_sz is not NULL, then total size of ELF note > + * segment, header part plus data part, is assigned to @notes_sz. If > + * @notes_buf is not NULL, then ELF note segment is copied into > + * @notes_buf. > + */ > +static int __init process_note_headers_elf32(const Elf32_Ehdr *ehdr_ptr, > + int *nr_notes, u64 *notes_sz, > + char *notes_buf) > { > int i, nr_ptnote=0, rc=0; > - char *tmp; > - Elf32_Ehdr *ehdr_ptr; > - Elf32_Phdr phdr, *phdr_ptr; > + Elf32_Phdr *phdr_ptr = (Elf32_Phdr*)(ehdr_ptr + 1); > Elf32_Nhdr *nhdr_ptr; > - u64 phdr_sz = 0, note_off; > + u64 phdr_sz = 0; > > - ehdr_ptr = (Elf32_Ehdr *)elfptr; > - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > - int j; > void *notes_section; > - struct vmcore *new; > u64 offset, max_sz, sz, real_sz = 0; > if (phdr_ptr->p_type != PT_NOTE) > continue; > @@ -336,7 +427,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, > return rc; > } > nhdr_ptr = notes_section; > - for (j = 0; j < max_sz; j += sz) { > + while (real_sz < max_sz) { > if (nhdr_ptr->n_namesz == 0) > break; > sz = sizeof(Elf32_Nhdr) + > @@ -345,20 +436,68 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, > real_sz += sz; > nhdr_ptr = (Elf32_Nhdr*)((char*)nhdr_ptr + sz); > } > - > - /* Add this contiguous chunk of notes section to vmcore list.*/ > - new = get_new_element(); > - if (!new) { > - kfree(notes_section); > - return -ENOMEM; > + if (notes_buf) { > + offset = phdr_ptr->p_offset; > + rc = read_from_oldmem(notes_buf + phdr_sz, real_sz, > + &offset, 0); > + if (rc < 0) { > + kfree(notes_section); > + return rc; > + } > } > - new->paddr = phdr_ptr->p_offset; > - new->size = real_sz; > - list_add_tail(&new->list, vc_list); > phdr_sz += real_sz; > kfree(notes_section); > } > > + if (nr_notes) > + *nr_notes = nr_ptnote; > + if (notes_sz) > + *notes_sz = phdr_sz; > + > + return 0; > +} > + > +static int __init get_note_number_and_size_elf32(const Elf32_Ehdr *ehdr_ptr, > + int *nr_ptnote, u64 *phdr_sz) > +{ > + return process_note_headers_elf32(ehdr_ptr, nr_ptnote, phdr_sz, NULL); > +} > + > +static int __init copy_notes_elf32(const Elf32_Ehdr *ehdr_ptr, char *notes_buf) > +{ > + return process_note_headers_elf32(ehdr_ptr, NULL, NULL, notes_buf); > +} > + > +/* Merges all the PT_NOTE headers into one. */ > +static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, > + char **notes_buf, size_t *notes_sz) > +{ > + int i, nr_ptnote=0, rc=0; > + char *tmp; > + Elf32_Ehdr *ehdr_ptr; > + Elf32_Phdr phdr; > + u64 phdr_sz = 0, note_off; > + struct vm_struct *vm; > + > + ehdr_ptr = (Elf32_Ehdr *)elfptr; > + > + rc = get_note_number_and_size_elf32(ehdr_ptr, &nr_ptnote, &phdr_sz); > + if (rc < 0) > + return rc; > + > + *notes_sz = roundup(phdr_sz, PAGE_SIZE); > + *notes_buf = vzalloc(*notes_sz); > + if (!*notes_buf) > + return -ENOMEM; > + > + vm = find_vm_area(*notes_buf); > + BUG_ON(!vm); > + vm->flags |= VM_USERMAP; > + > + rc = copy_notes_elf32(ehdr_ptr, *notes_buf); > + if (rc < 0) > + return rc; > + > /* Prepare merged PT_NOTE program header. */ > phdr.p_type = PT_NOTE; > phdr.p_flags = 0; > @@ -391,6 +530,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, > * the new offset fields of exported program headers. */ > static int __init process_ptload_program_headers_elf64(char *elfptr, > size_t elfsz, > + size_t elfnotes_sz, > struct list_head *vc_list) > { > int i; > @@ -402,8 +542,8 @@ static int __init process_ptload_program_headers_elf64(char *elfptr, > ehdr_ptr = (Elf64_Ehdr *)elfptr; > phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); /* PT_NOTE hdr */ > > - /* First program header is PT_NOTE header. */ > - vmcore_off = elfsz + roundup(phdr_ptr->p_memsz, PAGE_SIZE); > + /* Skip Elf header, program headers and Elf note segment. */ > + vmcore_off = elfsz + elfnotes_sz; > > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > u64 paddr, start, end, size; > @@ -433,6 +573,7 @@ static int __init process_ptload_program_headers_elf64(char *elfptr, > > static int __init process_ptload_program_headers_elf32(char *elfptr, > size_t elfsz, > + size_t elfnotes_sz, > struct list_head *vc_list) > { > int i; > @@ -444,8 +585,8 @@ static int __init process_ptload_program_headers_elf32(char *elfptr, > ehdr_ptr = (Elf32_Ehdr *)elfptr; > phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); /* PT_NOTE hdr */ > > - /* First program header is PT_NOTE header. */ > - vmcore_off = elfsz + roundup(phdr_ptr->p_memsz, PAGE_SIZE); > + /* Skip Elf header, program headers and Elf note segment. */ > + vmcore_off = elfsz + elfnotes_sz; > > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > u64 paddr, start, end, size; > @@ -474,17 +615,15 @@ 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, size_t elfsz, > +static void __init set_vmcore_list_offsets_elf64(size_t elfsz, > + size_t elfnotes_sz, > struct list_head *vc_list) > { > loff_t vmcore_off; > - Elf64_Ehdr *ehdr_ptr; > struct vmcore *m; > > - ehdr_ptr = (Elf64_Ehdr *)elfptr; > - > - /* Skip Elf header and program headers. */ > - vmcore_off = elfsz; > + /* Skip Elf header, program headers and Elf note segment. */ > + vmcore_off = elfsz + elfnotes_sz; > > list_for_each_entry(m, vc_list, list) { > m->offset = vmcore_off; > @@ -493,17 +632,15 @@ static void __init set_vmcore_list_offsets_elf64(char *elfptr, size_t elfsz, > } > > /* Sets offset fields of vmcore elements. */ > -static void __init set_vmcore_list_offsets_elf32(char *elfptr, size_t elfsz, > +static void __init set_vmcore_list_offsets_elf32(size_t elfsz, > + size_t elfnotes_sz, > struct list_head *vc_list) > { > loff_t vmcore_off; > - Elf32_Ehdr *ehdr_ptr; > struct vmcore *m; > > - ehdr_ptr = (Elf32_Ehdr *)elfptr; > - > - /* Skip Elf header and program headers. */ > - vmcore_off = elfsz; > + /* Skip Elf header, program headers and Elf note segment. */ > + vmcore_off = elfsz + elfnotes_sz; > > list_for_each_entry(m, vc_list, list) { > m->offset = vmcore_off; > @@ -554,20 +691,23 @@ static int __init parse_crash_elf64_headers(void) > } > > /* Merge all PT_NOTE headers into one. */ > - rc = merge_note_headers_elf64(elfcorebuf, &elfcorebuf_sz, &vmcore_list); > + rc = merge_note_headers_elf64(elfcorebuf, &elfcorebuf_sz, > + &elfnotes_buf, &elfnotes_sz); > if (rc) { > free_pages((unsigned long)elfcorebuf, > get_order(elfcorebuf_sz_orig)); > return rc; > } > rc = process_ptload_program_headers_elf64(elfcorebuf, elfcorebuf_sz, > - &vmcore_list); > + elfnotes_sz, > + &vmcore_list); > if (rc) { > free_pages((unsigned long)elfcorebuf, > get_order(elfcorebuf_sz_orig)); > return rc; > } > - set_vmcore_list_offsets_elf64(elfcorebuf, elfcorebuf_sz, &vmcore_list); > + set_vmcore_list_offsets_elf64(elfcorebuf_sz, elfnotes_sz, > + &vmcore_list); > return 0; > } > > @@ -614,20 +754,23 @@ static int __init parse_crash_elf32_headers(void) > } > > /* Merge all PT_NOTE headers into one. */ > - rc = merge_note_headers_elf32(elfcorebuf, &elfcorebuf_sz, &vmcore_list); > + rc = merge_note_headers_elf32(elfcorebuf, &elfcorebuf_sz, > + &elfnotes_buf, &elfnotes_sz); > if (rc) { > free_pages((unsigned long)elfcorebuf, > get_order(elfcorebuf_sz_orig)); > return rc; > } > rc = process_ptload_program_headers_elf32(elfcorebuf, elfcorebuf_sz, > - &vmcore_list); > + elfnotes_sz, > + &vmcore_list); > if (rc) { > free_pages((unsigned long)elfcorebuf, > get_order(elfcorebuf_sz_orig)); > return rc; > } > - set_vmcore_list_offsets_elf32(elfcorebuf, elfcorebuf_sz, &vmcore_list); > + set_vmcore_list_offsets_elf32(elfcorebuf_sz, elfnotes_sz, > + &vmcore_list); > return 0; > } > > @@ -706,6 +849,8 @@ void vmcore_cleanup(void) > list_del(&m->list); > kfree(m); > } > + vfree(elfnotes_buf); > + elfnotes_buf = NULL; > free_pages((unsigned long)elfcorebuf, > get_order(elfcorebuf_sz_orig)); > elfcorebuf = NULL; > >