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 1Uct7k-0002fj-Qc for kexec@lists.infradead.org; Thu, 16 May 2013 08:01:18 +0000 Message-ID: <519489EA.7000209@cn.fujitsu.com> Date: Thu, 16 May 2013 15:25:30 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v6 8/8] vmcore: support mmap() on /proc/vmcore References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090626.28109.95938.stgit@localhost6.localdomain6> In-Reply-To: <20130515090626.28109.95938.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 aGlzIHBhdGNoIGludHJvZHVjZXMgbW1hcF92bWNvcmUoKS4KPiAKPiBEb24ndCBwZXJtaXQgd3Jp dGFibGUgbm9yIGV4ZWN1dGFibGUgbWFwcGluZyBldmVuIHdpdGggbXByb3RlY3QoKQo+IGJlY2F1 c2UgdGhpcyBtbWFwKCkgaXMgYWltZWQgYXQgcmVhZGluZyBjcmFzaCBkdW1wIG1lbW9yeS4KPiBO b24td3JpdGFibGUgbWFwcGluZyBpcyBhbHNvIHJlcXVpcmVtZW50IG9mIHJlbWFwX3Bmbl9yYW5n ZSgpIHdoZW4KPiBtYXBwaW5nIGxpbmVhciBwYWdlcyBvbiBub24tY29uc2VjdXRpdmUgcGh5c2lj YWwgcGFnZXM7IHNlZQo+IGlzX2Nvd19tYXBwaW5nKCkuCj4gCj4gU2V0IFZNX01JWEVETUFQIGZs YWcgdG8gcmVtYXAgbWVtb3J5IGJ5IHJlbWFwX3Bmbl9yYW5nZSBhbmQgYnkKPiByZW1hcF92bWFs bG9jX3JhbmdlX3BlcnRpYWwgYXQgdGhlIHNhbWUgdGltZSBmb3IgYSBzaW5nbGUKPiB2bWEuIGRv X211bm1hcCgpIGNhbiBjb3JyZWN0bHkgY2xlYW4gcGFydGlhbGx5IHJlbWFwcGVkIHZtYSB3aXRo IHR3bwo+IGZ1bmN0aW9ucyBpbiBhYm5vcm1hbCBjYXNlLiBTZWUgemFwX3B0ZV9yYW5nZSgpLCB2 bV9ub3JtYWxfcGFnZSgpIGFuZAo+IHRoZWlyIGNvbW1lbnRzIGZvciBkZXRhaWxzLgo+IAo+IE9u IHg4Ni0zMiBQQUUga2VybmVscywgbW1hcCgpIHN1cHBvcnRzIGF0IG1vc3QgMTZUQiBtZW1vcnkg b25seS4gVGhpcwo+IGxpbWl0YXRpb24gY29tZXMgZnJvbSB0aGUgZmFjdCB0aGF0IHRoZSB0aGly ZCBhcmd1bWVudCBvZgo+IHJlbWFwX3Bmbl9yYW5nZSgpLCBwZm4sIGlzIG9mIDMyLWJpdCBsZW5n dGggb24geDg2LTMyOiB1bnNpZ25lZCBsb25nLgo+IAo+IFNpZ25lZC1vZmYtYnk6IEhBVEFZQU1B IERhaXN1a2UgPGQuaGF0YXlhbWFAanAuZnVqaXRzdS5jb20+Cj4gLS0tCgpBc3N1bWluZyB0aGF0 IHBhdGNoIDQgJiA1IG9mIHRoaXMgc2VyaWVzIGFyZSBvazoKCkFja2VkLWJ5OiBaaGFuZyBZYW5m ZWkgPHpoYW5neWFuZmVpQGNuLmZ1aml0c3UuY29tPgoKPiAKPiAgZnMvcHJvYy92bWNvcmUuYyB8 ICAgODYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gIDEgZmlsZXMgY2hhbmdlZCwgODYgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkK PiAKPiBkaWZmIC0tZ2l0IGEvZnMvcHJvYy92bWNvcmUuYyBiL2ZzL3Byb2Mvdm1jb3JlLmMKPiBp bmRleCA3ZjIwNDFjLi4yYzcyNDg3IDEwMDY0NAo+IC0tLSBhL2ZzL3Byb2Mvdm1jb3JlLmMKPiAr KysgYi9mcy9wcm9jL3ZtY29yZS5jCj4gQEAgLTIwLDYgKzIwLDcgQEAKPiAgI2luY2x1ZGUgPGxp bnV4L2luaXQuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KPiAgI2luY2x1ZGUg PGxpbnV4L2xpc3QuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KPiAgI2luY2x1ZGUg PGFzbS91YWNjZXNzLmg+Cj4gICNpbmNsdWRlIDxhc20vaW8uaD4KPiAgI2luY2x1ZGUgImludGVy bmFsLmgiCj4gQEAgLTIwMCw5ICsyMDEsOTQgQEAgc3RhdGljIHNzaXplX3QgcmVhZF92bWNvcmUo c3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCj4gIAlyZXR1cm4gYWNjOwo+ ICB9Cj4gIAo+ICtzdGF0aWMgaW50IG1tYXBfdm1jb3JlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1 Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKPiArewo+ICsJc2l6ZV90IHNpemUgPSB2bWEtPnZtX2Vu ZCAtIHZtYS0+dm1fc3RhcnQ7Cj4gKwl1NjQgc3RhcnQsIGVuZCwgbGVuLCB0c3o7Cj4gKwlzdHJ1 Y3Qgdm1jb3JlICptOwo+ICsKPiArCXN0YXJ0ID0gKHU2NCl2bWEtPnZtX3Bnb2ZmIDw8IFBBR0Vf U0hJRlQ7Cj4gKwllbmQgPSBzdGFydCArIHNpemU7Cj4gKwo+ICsJaWYgKHNpemUgPiB2bWNvcmVf c2l6ZSB8fCBlbmQgPiB2bWNvcmVfc2l6ZSkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlp ZiAodm1hLT52bV9mbGFncyAmIChWTV9XUklURSB8IFZNX0VYRUMpKQo+ICsJCXJldHVybiAtRVBF Uk07Cj4gKwo+ICsJdm1hLT52bV9mbGFncyAmPSB+KFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQyk7 Cj4gKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX01JWEVETUFQOwo+ICsKPiArCWxlbiA9IDA7Cj4gKwo+ ICsJaWYgKHN0YXJ0IDwgZWxmY29yZWJ1Zl9zeikgewo+ICsJCXU2NCBwZm47Cj4gKwo+ICsJCXRz eiA9IGVsZmNvcmVidWZfc3ogLSBzdGFydDsKPiArCQlpZiAoc2l6ZSA8IHRzeikKPiArCQkJdHN6 ID0gc2l6ZTsKPiArCQlwZm4gPSBfX3BhKGVsZmNvcmVidWYgKyBzdGFydCkgPj4gUEFHRV9TSElG VDsKPiArCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgcGZuLCB0c3os Cj4gKwkJCQkgICAgdm1hLT52bV9wYWdlX3Byb3QpKQo+ICsJCQlyZXR1cm4gLUVBR0FJTjsKPiAr CQlzaXplIC09IHRzejsKPiArCQlzdGFydCArPSB0c3o7Cj4gKwkJbGVuICs9IHRzejsKPiArCj4g KwkJaWYgKHNpemUgPT0gMCkKPiArCQkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJaWYgKHN0YXJ0 IDwgZWxmY29yZWJ1Zl9zeiArIGVsZm5vdGVzX3N6KSB7Cj4gKwkJdm9pZCAqa2FkZHI7Cj4gKwo+ ICsJCXRzeiA9IGVsZmNvcmVidWZfc3ogKyBlbGZub3Rlc19zeiAtIHN0YXJ0Owo+ICsJCWlmIChz aXplIDwgdHN6KQo+ICsJCQl0c3ogPSBzaXplOwo+ICsJCWthZGRyID0gZWxmbm90ZXNfYnVmICsg c3RhcnQgLSBlbGZjb3JlYnVmX3N6Owo+ICsJCWlmIChyZW1hcF92bWFsbG9jX3JhbmdlX3BhcnRp YWwodm1hLCB2bWEtPnZtX3N0YXJ0ICsgbGVuLAo+ICsJCQkJCQlrYWRkciwgdHN6KSkgewo+ICsJ CQlkb19tdW5tYXAodm1hLT52bV9tbSwgdm1hLT52bV9zdGFydCwgbGVuKTsKPiArCQkJcmV0dXJu IC1FQUdBSU47Cj4gKwkJfQo+ICsJCXNpemUgLT0gdHN6Owo+ICsJCXN0YXJ0ICs9IHRzejsKPiAr CQlsZW4gKz0gdHN6Owo+ICsKPiArCQlpZiAoc2l6ZSA9PSAwKQo+ICsJCQlyZXR1cm4gMDsKPiAr CX0KPiArCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZ2bWNvcmVfbGlzdCwgbGlzdCkgewo+ ICsJCWlmIChzdGFydCA8IG0tPm9mZnNldCArIG0tPnNpemUpIHsKPiArCQkJdTY0IHBhZGRyID0g MDsKPiArCj4gKwkJCXRzeiA9IG0tPm9mZnNldCArIG0tPnNpemUgLSBzdGFydDsKPiArCQkJaWYg KHNpemUgPCB0c3opCj4gKwkJCQl0c3ogPSBzaXplOwo+ICsJCQlwYWRkciA9IG0tPnBhZGRyICsg c3RhcnQgLSBtLT5vZmZzZXQ7Cj4gKwkJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZt X3N0YXJ0ICsgbGVuLAo+ICsJCQkJCSAgICBwYWRkciA+PiBQQUdFX1NISUZULCB0c3osCj4gKwkJ CQkJICAgIHZtYS0+dm1fcGFnZV9wcm90KSkgewo+ICsJCQkJZG9fbXVubWFwKHZtYS0+dm1fbW0s IHZtYS0+dm1fc3RhcnQsIGxlbik7Cj4gKwkJCQlyZXR1cm4gLUVBR0FJTjsKPiArCQkJfQo+ICsJ CQlzaXplIC09IHRzejsKPiArCQkJc3RhcnQgKz0gdHN6Owo+ICsJCQlsZW4gKz0gdHN6Owo+ICsK PiArCQkJaWYgKHNpemUgPT0gMCkKPiArCQkJCXJldHVybiAwOwo+ICsJCX0KPiArCX0KPiArCj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlv bnMgcHJvY192bWNvcmVfb3BlcmF0aW9ucyA9IHsKPiAgCS5yZWFkCQk9IHJlYWRfdm1jb3JlLAo+ ICAJLmxsc2VlawkJPSBkZWZhdWx0X2xsc2VlaywKPiArCS5tbWFwCQk9IG1tYXBfdm1jb3JlLAo+ ICB9Owo+ICAKPiAgc3RhdGljIHN0cnVjdCB2bWNvcmUqIF9faW5pdCBnZXRfbmV3X2VsZW1lbnQo dm9pZCkKPiAKPiAKPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwo+IGtleGVjIG1haWxpbmcgbGlzdAo+IGtleGVjQGxpc3RzLmluZnJhZGVhZC5vcmcKPiBo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2tleGVjCj4gCgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Ka2V4ZWMgbWFpbGlu ZyBsaXN0CmtleGVjQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9rZXhlYwo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from psmtp.com (na3sys010amx154.postini.com [74.125.245.154]) by kanga.kvack.org (Postfix) with SMTP id 472766B0032 for ; Thu, 16 May 2013 04:00:56 -0400 (EDT) Message-ID: <519489EA.7000209@cn.fujitsu.com> Date: Thu, 16 May 2013 15:25:30 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v6 8/8] vmcore: support mmap() on /proc/vmcore References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090626.28109.95938.stgit@localhost6.localdomain6> In-Reply-To: <20130515090626.28109.95938.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, riel@redhat.com, hughd@google.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, lisa.mitchell@hp.com, linux-mm@kvack.org, kosaki.motohiro@jp.fujitsu.com, kumagai-atsushi@mxc.nes.nec.co.jp, walken@google.com, cpw@sgi.com, jingbai.ma@hp.com =E4=BA=8E 2013=E5=B9=B405=E6=9C=8815=E6=97=A5 17:06, HATAYAMA Daisuke =E5= =86=99=E9=81=93: > This patch introduces mmap=5Fvmcore(). >=20 > Don't permit writable nor executable mapping even with mprotect() > because this mmap() is aimed at reading crash dump memory. > Non-writable mapping is also requirement of remap=5Fpfn=5Frange() when > mapping linear pages on non-consecutive physical pages; see > is=5Fcow=5Fmapping(). >=20 > Set VM=5FMIXEDMAP flag to remap memory by remap=5Fpfn=5Frange and by > remap=5Fvmalloc=5Frange=5Fpertial at the same time for a single > vma. do=5Fmunmap() can correctly clean partially remapped vma with two > functions in abnormal case. See zap=5Fpte=5Frange(), vm=5Fnormal=5Fpage()= and > their comments for details. >=20 > On x86-32 PAE kernels, mmap() supports at most 16TB memory only. This > limitation comes from the fact that the third argument of > remap=5Fpfn=5Frange(), pfn, is of 32-bit length on x86-32: unsigned long. >=20 > Signed-off-by: HATAYAMA Daisuke > --- Assuming that patch 4 & 5 of this series are ok: Acked-by: Zhang Yanfei >=20 > fs/proc/vmcore.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++= ++++++ > 1 files changed, 86 insertions(+), 0 deletions(-) >=20 > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index 7f2041c..2c72487 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -20,6 +20,7 @@ > #include > #include > #include > +#include > #include > #include > #include "internal.h" > @@ -200,9 +201,94 @@ static ssize=5Ft read=5Fvmcore(struct file *file, ch= ar =5F=5Fuser *buffer, > return acc; > } > =20 > +static int mmap=5Fvmcore(struct file *file, struct vm=5Farea=5Fstruct *v= ma) > +{ > + size=5Ft size =3D vma->vm=5Fend - vma->vm=5Fstart; > + u64 start, end, len, tsz; > + struct vmcore *m; > + > + start =3D (u64)vma->vm=5Fpgoff << PAGE=5FSHIFT; > + end =3D start + size; > + > + if (size > vmcore=5Fsize || end > vmcore=5Fsize) > + return -EINVAL; > + > + if (vma->vm=5Fflags & (VM=5FWRITE | VM=5FEXEC)) > + return -EPERM; > + > + vma->vm=5Fflags &=3D ~(VM=5FMAYWRITE | VM=5FMAYEXEC); > + vma->vm=5Fflags |=3D VM=5FMIXEDMAP; > + > + len =3D 0; > + > + if (start < elfcorebuf=5Fsz) { > + u64 pfn; > + > + tsz =3D elfcorebuf=5Fsz - start; > + if (size < tsz) > + tsz =3D size; > + pfn =3D =5F=5Fpa(elfcorebuf + start) >> PAGE=5FSHIFT; > + if (remap=5Fpfn=5Frange(vma, vma->vm=5Fstart, pfn, tsz, > + vma->vm=5Fpage=5Fprot)) > + return -EAGAIN; > + size -=3D tsz; > + start +=3D tsz; > + len +=3D tsz; > + > + if (size =3D=3D 0) > + return 0; > + } > + > + if (start < elfcorebuf=5Fsz + elfnotes=5Fsz) { > + void *kaddr; > + > + tsz =3D elfcorebuf=5Fsz + elfnotes=5Fsz - start; > + if (size < tsz) > + tsz =3D size; > + kaddr =3D elfnotes=5Fbuf + start - elfcorebuf=5Fsz; > + if (remap=5Fvmalloc=5Frange=5Fpartial(vma, vma->vm=5Fstart + len, > + kaddr, tsz)) { > + do=5Fmunmap(vma->vm=5Fmm, vma->vm=5Fstart, len); > + return -EAGAIN; > + } > + size -=3D tsz; > + start +=3D tsz; > + len +=3D tsz; > + > + if (size =3D=3D 0) > + return 0; > + } > + > + list=5Ffor=5Feach=5Fentry(m, &vmcore=5Flist, list) { > + if (start < m->offset + m->size) { > + u64 paddr =3D 0; > + > + tsz =3D m->offset + m->size - start; > + if (size < tsz) > + tsz =3D size; > + paddr =3D m->paddr + start - m->offset; > + if (remap=5Fpfn=5Frange(vma, vma->vm=5Fstart + len, > + paddr >> PAGE=5FSHIFT, tsz, > + vma->vm=5Fpage=5Fprot)) { > + do=5Fmunmap(vma->vm=5Fmm, vma->vm=5Fstart, len); > + return -EAGAIN; > + } > + size -=3D tsz; > + start +=3D tsz; > + len +=3D tsz; > + > + if (size =3D=3D 0) > + return 0; > + } > + } > + > + return 0; > +} > + > static const struct file=5Foperations proc=5Fvmcore=5Foperations =3D { > .read =3D read=5Fvmcore, > .llseek =3D default=5Fllseek, > + .mmap =3D mmap=5Fvmcore, > }; > =20 > static struct vmcore* =5F=5Finit get=5Fnew=5Felement(void) >=20 >=20 > =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F= =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F > kexec mailing list > kexec@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec >=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 S1756416Ab3EPIBA (ORCPT ); Thu, 16 May 2013 04:01:00 -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 S1755603Ab3EPIA6 convert rfc822-to-8bit (ORCPT ); Thu, 16 May 2013 04:00:58 -0400 X-IronPort-AV: E=Sophos;i="4.87,683,1363104000"; d="scan'208";a="7284470" Message-ID: <519489EA.7000209@cn.fujitsu.com> Date: Thu, 16 May 2013 15:25:30 +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, riel@redhat.com, hughd@google.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, lisa.mitchell@hp.com, linux-mm@kvack.org, kosaki.motohiro@jp.fujitsu.com, kumagai-atsushi@mxc.nes.nec.co.jp, walken@google.com, cpw@sgi.com, jingbai.ma@hp.com Subject: Re: [PATCH v6 8/8] vmcore: support mmap() on /proc/vmcore References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090626.28109.95938.stgit@localhost6.localdomain6> In-Reply-To: <20130515090626.28109.95938.stgit@localhost6.localdomain6> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/16 15:26:40, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/16 15:27:14 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 写道: > This patch introduces mmap_vmcore(). > > Don't permit writable nor executable mapping even with mprotect() > because this mmap() is aimed at reading crash dump memory. > Non-writable mapping is also requirement of remap_pfn_range() when > mapping linear pages on non-consecutive physical pages; see > is_cow_mapping(). > > Set VM_MIXEDMAP flag to remap memory by remap_pfn_range and by > remap_vmalloc_range_pertial at the same time for a single > vma. do_munmap() can correctly clean partially remapped vma with two > functions in abnormal case. See zap_pte_range(), vm_normal_page() and > their comments for details. > > On x86-32 PAE kernels, mmap() supports at most 16TB memory only. This > limitation comes from the fact that the third argument of > remap_pfn_range(), pfn, is of 32-bit length on x86-32: unsigned long. > > Signed-off-by: HATAYAMA Daisuke > --- Assuming that patch 4 & 5 of this series are ok: Acked-by: Zhang Yanfei > > fs/proc/vmcore.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 86 insertions(+), 0 deletions(-) > > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index 7f2041c..2c72487 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -20,6 +20,7 @@ > #include > #include > #include > +#include > #include > #include > #include "internal.h" > @@ -200,9 +201,94 @@ static ssize_t read_vmcore(struct file *file, char __user *buffer, > return acc; > } > > +static int mmap_vmcore(struct file *file, struct vm_area_struct *vma) > +{ > + size_t size = vma->vm_end - vma->vm_start; > + u64 start, end, len, tsz; > + struct vmcore *m; > + > + start = (u64)vma->vm_pgoff << PAGE_SHIFT; > + end = start + size; > + > + if (size > vmcore_size || end > vmcore_size) > + return -EINVAL; > + > + if (vma->vm_flags & (VM_WRITE | VM_EXEC)) > + return -EPERM; > + > + vma->vm_flags &= ~(VM_MAYWRITE | VM_MAYEXEC); > + vma->vm_flags |= VM_MIXEDMAP; > + > + len = 0; > + > + if (start < elfcorebuf_sz) { > + u64 pfn; > + > + tsz = elfcorebuf_sz - start; > + if (size < tsz) > + tsz = size; > + pfn = __pa(elfcorebuf + start) >> PAGE_SHIFT; > + if (remap_pfn_range(vma, vma->vm_start, pfn, tsz, > + vma->vm_page_prot)) > + return -EAGAIN; > + size -= tsz; > + start += tsz; > + len += tsz; > + > + if (size == 0) > + return 0; > + } > + > + if (start < elfcorebuf_sz + elfnotes_sz) { > + void *kaddr; > + > + tsz = elfcorebuf_sz + elfnotes_sz - start; > + if (size < tsz) > + tsz = size; > + kaddr = elfnotes_buf + start - elfcorebuf_sz; > + if (remap_vmalloc_range_partial(vma, vma->vm_start + len, > + kaddr, tsz)) { > + do_munmap(vma->vm_mm, vma->vm_start, len); > + return -EAGAIN; > + } > + size -= tsz; > + start += tsz; > + len += tsz; > + > + if (size == 0) > + return 0; > + } > + > + list_for_each_entry(m, &vmcore_list, list) { > + if (start < m->offset + m->size) { > + u64 paddr = 0; > + > + tsz = m->offset + m->size - start; > + if (size < tsz) > + tsz = size; > + paddr = m->paddr + start - m->offset; > + if (remap_pfn_range(vma, vma->vm_start + len, > + paddr >> PAGE_SHIFT, tsz, > + vma->vm_page_prot)) { > + do_munmap(vma->vm_mm, vma->vm_start, len); > + return -EAGAIN; > + } > + size -= tsz; > + start += tsz; > + len += tsz; > + > + if (size == 0) > + return 0; > + } > + } > + > + return 0; > +} > + > static const struct file_operations proc_vmcore_operations = { > .read = read_vmcore, > .llseek = default_llseek, > + .mmap = mmap_vmcore, > }; > > static struct vmcore* __init get_new_element(void) > > > _______________________________________________ > kexec mailing list > kexec@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec >