From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Mon, 13 May 2019 12:15:02 +0200 From: Cornelia Huck Subject: Re: [PATCH 08/10] virtio/s390: add indirection to indicators access Message-ID: <20190513121502.34d3dc62.cohuck@redhat.com> In-Reply-To: <89074bc5-78ee-a2e3-0546-791a465f83bd@linux.ibm.com> References: <20190426183245.37939-1-pasic@linux.ibm.com> <20190426183245.37939-9-pasic@linux.ibm.com> <716d47ca-016f-e8f4-6d78-7746a7d9f6ba@linux.ibm.com> <20190509202600.4fd6aebe.pasic@linux.ibm.com> <20190510135421.5363f14a.pasic@linux.ibm.com> <89074bc5-78ee-a2e3-0546-791a465f83bd@linux.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Sender: kvm-owner@vger.kernel.org List-Archive: List-Post: To: Pierre Morel Cc: Halil Pasic , kvm@vger.kernel.org, linux-s390@vger.kernel.org, Martin Schwidefsky , Sebastian Ott , virtualization@lists.linux-foundation.org, "Michael S. Tsirkin" , Christoph Hellwig , Thomas Huth , Christian Borntraeger , Viktor Mihajlovski , Vasily Gorbik , Janosch Frank , Claudio Imbrenda , Farhan Ali , Eric Farman List-ID: On Fri, 10 May 2019 17:36:05 +0200 Pierre Morel wrote: > On 10/05/2019 13:54, Halil Pasic wrote: > > On Fri, 10 May 2019 09:43:08 +0200 > > Pierre Morel wrote: > > > >> On 09/05/2019 20:26, Halil Pasic wrote: > >>> On Thu, 9 May 2019 14:01:01 +0200 > >>> Pierre Morel wrote: > >>> > >>>> On 08/05/2019 16:31, Pierre Morel wrote: > >>>>> On 26/04/2019 20:32, Halil Pasic wrote: > >>>>>> This will come in handy soon when we pull out the indicators from > >>>>>> virtio_ccw_device to a memory area that is shared with the hypervisor > >>>>>> (in particular for protected virtualization guests). > >>>>>> > >>>>>> Signed-off-by: Halil Pasic > >>>>>> --- > >>>>>>   drivers/s390/virtio/virtio_ccw.c | 40 > >>>>>> +++++++++++++++++++++++++--------------- > >>>>>>   1 file changed, 25 insertions(+), 15 deletions(-) > >>>>>> > >>>>>> diff --git a/drivers/s390/virtio/virtio_ccw.c > >>>>>> b/drivers/s390/virtio/virtio_ccw.c > >>>>>> index bb7a92316fc8..1f3e7d56924f 100644 > >>>>>> --- a/drivers/s390/virtio/virtio_ccw.c > >>>>>> +++ b/drivers/s390/virtio/virtio_ccw.c > >>>>>> @@ -68,6 +68,16 @@ struct virtio_ccw_device { > >>>>>>       void *airq_info; > >>>>>>   }; > >>>>>> +static inline unsigned long *indicators(struct virtio_ccw_device *vcdev) > >>>>>> +{ > >>>>>> +    return &vcdev->indicators; > >>>>>> +} > >>>>>> + > >>>>>> +static inline unsigned long *indicators2(struct virtio_ccw_device > >>>>>> *vcdev) > >>>>>> +{ > >>>>>> +    return &vcdev->indicators2; > >>>>>> +} > >>>>>> + > >>>>>>   struct vq_info_block_legacy { > >>>>>>       __u64 queue; > >>>>>>       __u32 align; > >>>>>> @@ -337,17 +347,17 @@ static void virtio_ccw_drop_indicator(struct > >>>>>> virtio_ccw_device *vcdev, > >>>>>>           ccw->cda = (__u32)(unsigned long) thinint_area; > >>>>>>       } else { > >>>>>>           /* payload is the address of the indicators */ > >>>>>> -        indicatorp = kmalloc(sizeof(&vcdev->indicators), > >>>>>> +        indicatorp = kmalloc(sizeof(indicators(vcdev)), > >>>>>>                        GFP_DMA | GFP_KERNEL); > >>>>>>           if (!indicatorp) > >>>>>>               return; > >>>>>>           *indicatorp = 0; > >>>>>>           ccw->cmd_code = CCW_CMD_SET_IND; > >>>>>> -        ccw->count = sizeof(&vcdev->indicators); > >>>>>> +        ccw->count = sizeof(indicators(vcdev)); > >>>>> > >>>>> This looks strange to me. Was already weird before. > >>>>> Lucky we are indicators are long... > >>>>> may be just sizeof(long) > >>>> > >>> > >>> I'm not sure I understand where are you coming from... > >>> > >>> With CCW_CMD_SET_IND we tell the hypervisor the guest physical address > >>> at which the so called classic indicators. There is a comment that > >>> makes this obvious. The argument of the sizeof was and remained a > >>> pointer type. AFAIU this is what bothers you. > >>>> > >>>> AFAIK the size of the indicators (AIV/AIS) is not restricted by the > >>>> architecture. > >>> > >>> The size of vcdev->indicators is restricted or defined by the virtio > >>> specification. Please have a look at '4.3.2.6.1 Setting Up Classic Queue > >>> Indicators' here: > >>> https://docs.oasis-open.org/virtio/virtio/v1.1/cs01/virtio-v1.1-cs01.html#x1-1630002 > >>> > >>> Since with Linux on s390 only 64 bit is supported, both the sizes are in > >>> line with the specification. Using u64 would semantically match the spec > >>> better, modulo pre virtio 1.0 which ain't specified. I did not want to > >>> do changes that are not necessary for what I'm trying to accomplish. If > >>> we want we can change these to u64 with a patch on top. > >> > >> I mean you are changing these line already, so why not doing it right > >> while at it? > >> > > > > This patch is about adding the indirection so we can move the member > > painlessly. Mixing in different stuff would be a bad practice. > > > > BTW I just explained that it ain't wrong, so I really do not understand > > what do you mean by 'why not doing it right'. Can you please explain? > > > > I did not wanted to discuss a long time on this and gave my R-B, so > meaning that I am OK with this patch. > > But if you ask, yes I can, it seems quite obvious. > When you build a CCW you give the pointer to CCW->cda and you give the > size of the transfer in CCW->count. > > Here the count is initialized with the sizeof of the pointer used to > initialize CCW->cda with. But the cda points to the pointer address, so the size of the pointer is actually the correct value here, isn't it? > Lukily we work on a 64 bits machine with 64 bits pointers and the size > of the pointed object is 64 bits wide so... the resulting count is right. > But it is not the correct way to do it. I think it is, but this interface really is confusing. > That is all. Not a big concern, you do not need to change it, as you > said it can be done in another patch. > > > Did you agree with the rest of my comment? I mean there was more to it. > > > > I understood from your comments that the indicators in Linux are 64bits > wide so all OK. > > Regards > Pierre > > > > > > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Cornelia Huck Subject: Re: [PATCH 08/10] virtio/s390: add indirection to indicators access Date: Mon, 13 May 2019 12:15:02 +0200 Message-ID: <20190513121502.34d3dc62.cohuck@redhat.com> References: <20190426183245.37939-1-pasic@linux.ibm.com> <20190426183245.37939-9-pasic@linux.ibm.com> <716d47ca-016f-e8f4-6d78-7746a7d9f6ba@linux.ibm.com> <20190509202600.4fd6aebe.pasic@linux.ibm.com> <20190510135421.5363f14a.pasic@linux.ibm.com> <89074bc5-78ee-a2e3-0546-791a465f83bd@linux.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <89074bc5-78ee-a2e3-0546-791a465f83bd@linux.ibm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org To: Pierre Morel Cc: Vasily Gorbik , linux-s390@vger.kernel.org, Thomas Huth , Claudio Imbrenda , kvm@vger.kernel.org, Sebastian Ott , "Michael S. Tsirkin" , Farhan Ali , Eric Farman , virtualization@lists.linux-foundation.org, Halil Pasic , Christoph Hellwig , Martin Schwidefsky , Viktor Mihajlovski , Janosch Frank List-Id: virtualization@lists.linuxfoundation.org T24gRnJpLCAxMCBNYXkgMjAxOSAxNzozNjowNSArMDIwMApQaWVycmUgTW9yZWwgPHBtb3JlbEBs aW51eC5pYm0uY29tPiB3cm90ZToKCj4gT24gMTAvMDUvMjAxOSAxMzo1NCwgSGFsaWwgUGFzaWMg d3JvdGU6Cj4gPiBPbiBGcmksIDEwIE1heSAyMDE5IDA5OjQzOjA4ICswMjAwCj4gPiBQaWVycmUg TW9yZWwgPHBtb3JlbEBsaW51eC5pYm0uY29tPiB3cm90ZToKPiA+ICAgCj4gPj4gT24gMDkvMDUv MjAxOSAyMDoyNiwgSGFsaWwgUGFzaWMgd3JvdGU6ICAKPiA+Pj4gT24gVGh1LCA5IE1heSAyMDE5 IDE0OjAxOjAxICswMjAwCj4gPj4+IFBpZXJyZSBNb3JlbCA8cG1vcmVsQGxpbnV4LmlibS5jb20+ IHdyb3RlOgo+ID4+PiAgCj4gPj4+PiBPbiAwOC8wNS8yMDE5IDE2OjMxLCBQaWVycmUgTW9yZWwg d3JvdGU6ICAKPiA+Pj4+PiBPbiAyNi8wNC8yMDE5IDIwOjMyLCBIYWxpbCBQYXNpYyB3cm90ZTog IAo+ID4+Pj4+PiBUaGlzIHdpbGwgY29tZSBpbiBoYW5keSBzb29uIHdoZW4gd2UgcHVsbCBvdXQg dGhlIGluZGljYXRvcnMgZnJvbQo+ID4+Pj4+PiB2aXJ0aW9fY2N3X2RldmljZSB0byBhIG1lbW9y eSBhcmVhIHRoYXQgaXMgc2hhcmVkIHdpdGggdGhlIGh5cGVydmlzb3IKPiA+Pj4+Pj4gKGluIHBh cnRpY3VsYXIgZm9yIHByb3RlY3RlZCB2aXJ0dWFsaXphdGlvbiBndWVzdHMpLgo+ID4+Pj4+Pgo+ ID4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBIYWxpbCBQYXNpYyA8cGFzaWNAbGludXguaWJtLmNvbT4K PiA+Pj4+Pj4gLS0tCj4gPj4+Pj4+ICAgwqAgZHJpdmVycy9zMzkwL3ZpcnRpby92aXJ0aW9fY2N3 LmMgfCA0MAo+ID4+Pj4+PiArKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0t Cj4gPj4+Pj4+ICAgwqAgMSBmaWxlIGNoYW5nZWQsIDI1IGluc2VydGlvbnMoKyksIDE1IGRlbGV0 aW9ucygtKQo+ID4+Pj4+Pgo+ID4+Pj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3ZpcnRp by92aXJ0aW9fY2N3LmMKPiA+Pj4+Pj4gYi9kcml2ZXJzL3MzOTAvdmlydGlvL3ZpcnRpb19jY3cu Ywo+ID4+Pj4+PiBpbmRleCBiYjdhOTIzMTZmYzguLjFmM2U3ZDU2OTI0ZiAxMDA2NDQKPiA+Pj4+ Pj4gLS0tIGEvZHJpdmVycy9zMzkwL3ZpcnRpby92aXJ0aW9fY2N3LmMKPiA+Pj4+Pj4gKysrIGIv ZHJpdmVycy9zMzkwL3ZpcnRpby92aXJ0aW9fY2N3LmMKPiA+Pj4+Pj4gQEAgLTY4LDYgKzY4LDE2 IEBAIHN0cnVjdCB2aXJ0aW9fY2N3X2RldmljZSB7Cj4gPj4+Pj4+ICAgwqDCoMKgwqDCoCB2b2lk ICphaXJxX2luZm87Cj4gPj4+Pj4+ICAgwqAgfTsKPiA+Pj4+Pj4gK3N0YXRpYyBpbmxpbmUgdW5z aWduZWQgbG9uZyAqaW5kaWNhdG9ycyhzdHJ1Y3QgdmlydGlvX2Njd19kZXZpY2UgKnZjZGV2KQo+ ID4+Pj4+PiArewo+ID4+Pj4+PiArwqDCoMKgIHJldHVybiAmdmNkZXYtPmluZGljYXRvcnM7Cj4g Pj4+Pj4+ICt9Cj4gPj4+Pj4+ICsKPiA+Pj4+Pj4gK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9u ZyAqaW5kaWNhdG9yczIoc3RydWN0IHZpcnRpb19jY3dfZGV2aWNlCj4gPj4+Pj4+ICp2Y2RldikK PiA+Pj4+Pj4gK3sKPiA+Pj4+Pj4gK8KgwqDCoCByZXR1cm4gJnZjZGV2LT5pbmRpY2F0b3JzMjsK PiA+Pj4+Pj4gK30KPiA+Pj4+Pj4gKwo+ID4+Pj4+PiAgIMKgIHN0cnVjdCB2cV9pbmZvX2Jsb2Nr X2xlZ2FjeSB7Cj4gPj4+Pj4+ICAgwqDCoMKgwqDCoCBfX3U2NCBxdWV1ZTsKPiA+Pj4+Pj4gICDC oMKgwqDCoMKgIF9fdTMyIGFsaWduOwo+ID4+Pj4+PiBAQCAtMzM3LDE3ICszNDcsMTcgQEAgc3Rh dGljIHZvaWQgdmlydGlvX2Njd19kcm9wX2luZGljYXRvcihzdHJ1Y3QKPiA+Pj4+Pj4gdmlydGlv X2Njd19kZXZpY2UgKnZjZGV2LAo+ID4+Pj4+PiAgIMKgwqDCoMKgwqDCoMKgwqDCoCBjY3ctPmNk YSA9IChfX3UzMikodW5zaWduZWQgbG9uZykgdGhpbmludF9hcmVhOwo+ID4+Pj4+PiAgIMKgwqDC oMKgwqAgfSBlbHNlIHsKPiA+Pj4+Pj4gICDCoMKgwqDCoMKgwqDCoMKgwqAgLyogcGF5bG9hZCBp cyB0aGUgYWRkcmVzcyBvZiB0aGUgaW5kaWNhdG9ycyAqLwo+ID4+Pj4+PiAtwqDCoMKgwqDCoMKg wqAgaW5kaWNhdG9ycCA9IGttYWxsb2Moc2l6ZW9mKCZ2Y2Rldi0+aW5kaWNhdG9ycyksCj4gPj4+ Pj4+ICvCoMKgwqDCoMKgwqDCoCBpbmRpY2F0b3JwID0ga21hbGxvYyhzaXplb2YoaW5kaWNhdG9y cyh2Y2RldikpLAo+ID4+Pj4+PiAgIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKPiA+Pj4+Pj4gICDCoMKgwqDCoMKgwqDC oMKgwqAgaWYgKCFpbmRpY2F0b3JwKQo+ID4+Pj4+PiAgIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJldHVybjsKPiA+Pj4+Pj4gICDCoMKgwqDCoMKgwqDCoMKgwqAgKmluZGljYXRvcnAgPSAw Owo+ID4+Pj4+PiAgIMKgwqDCoMKgwqDCoMKgwqDCoCBjY3ctPmNtZF9jb2RlID0gQ0NXX0NNRF9T RVRfSU5EOwo+ID4+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgY2N3LT5jb3VudCA9IHNpemVvZigmdmNk ZXYtPmluZGljYXRvcnMpOwo+ID4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgY2N3LT5jb3VudCA9IHNp emVvZihpbmRpY2F0b3JzKHZjZGV2KSk7ICAKPiA+Pj4+Pgo+ID4+Pj4+IFRoaXMgbG9va3Mgc3Ry YW5nZSB0byBtZS4gV2FzIGFscmVhZHkgd2VpcmQgYmVmb3JlLgo+ID4+Pj4+IEx1Y2t5IHdlIGFy ZSBpbmRpY2F0b3JzIGFyZSBsb25nLi4uCj4gPj4+Pj4gbWF5IGJlIGp1c3Qgc2l6ZW9mKGxvbmcp ICAKPiA+Pj4+ICAKPiA+Pj4KPiA+Pj4gSSdtIG5vdCBzdXJlIEkgdW5kZXJzdGFuZCB3aGVyZSBh cmUgeW91IGNvbWluZyBmcm9tLi4uCj4gPj4+Cj4gPj4+IFdpdGggQ0NXX0NNRF9TRVRfSU5EIHdl IHRlbGwgdGhlIGh5cGVydmlzb3IgdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MKPiA+Pj4gYXQg d2hpY2ggdGhlIHNvIGNhbGxlZCBjbGFzc2ljIGluZGljYXRvcnMuIFRoZXJlIGlzIGEgY29tbWVu dCB0aGF0Cj4gPj4+IG1ha2VzIHRoaXMgb2J2aW91cy4gVGhlIGFyZ3VtZW50IG9mIHRoZSBzaXpl b2Ygd2FzIGFuZCByZW1haW5lZCBhCj4gPj4+IHBvaW50ZXIgdHlwZS4gQUZBSVUgdGhpcyBpcyB3 aGF0IGJvdGhlcnMgeW91LiAgCj4gPj4+Pgo+ID4+Pj4gQUZBSUsgdGhlIHNpemUgb2YgdGhlIGlu ZGljYXRvcnMgKEFJVi9BSVMpIGlzIG5vdCByZXN0cmljdGVkIGJ5IHRoZQo+ID4+Pj4gYXJjaGl0 ZWN0dXJlLiAgCj4gPj4+Cj4gPj4+IFRoZSBzaXplIG9mIHZjZGV2LT5pbmRpY2F0b3JzIGlzIHJl c3RyaWN0ZWQgb3IgZGVmaW5lZCBieSB0aGUgdmlydGlvCj4gPj4+IHNwZWNpZmljYXRpb24uIFBs ZWFzZSBoYXZlIGEgbG9vayBhdCAnNC4zLjIuNi4xIFNldHRpbmcgVXAgQ2xhc3NpYyBRdWV1ZQo+ ID4+PiBJbmRpY2F0b3JzJyBoZXJlOgo+ID4+PiBodHRwczovL2RvY3Mub2FzaXMtb3Blbi5vcmcv dmlydGlvL3ZpcnRpby92MS4xL2NzMDEvdmlydGlvLXYxLjEtY3MwMS5odG1sI3gxLTE2MzAwMDIK PiA+Pj4KPiA+Pj4gU2luY2Ugd2l0aCBMaW51eCBvbiBzMzkwIG9ubHkgNjQgYml0IGlzIHN1cHBv cnRlZCwgYm90aCB0aGUgc2l6ZXMgYXJlIGluCj4gPj4+IGxpbmUgd2l0aCB0aGUgc3BlY2lmaWNh dGlvbi4gVXNpbmcgdTY0IHdvdWxkIHNlbWFudGljYWxseSBtYXRjaCB0aGUgc3BlYwo+ID4+PiBi ZXR0ZXIsIG1vZHVsbyBwcmUgdmlydGlvIDEuMCB3aGljaCBhaW4ndCBzcGVjaWZpZWQuIEkgZGlk IG5vdCB3YW50IHRvCj4gPj4+IGRvIGNoYW5nZXMgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeSBmb3Ig d2hhdCBJJ20gdHJ5aW5nIHRvIGFjY29tcGxpc2guIElmCj4gPj4+IHdlIHdhbnQgd2UgY2FuIGNo YW5nZSB0aGVzZSB0byB1NjQgd2l0aCBhIHBhdGNoIG9uIHRvcC4gIAo+ID4+Cj4gPj4gSSBtZWFu IHlvdSBhcmUgY2hhbmdpbmcgdGhlc2UgbGluZSBhbHJlYWR5LCBzbyB3aHkgbm90IGRvaW5nIGl0 IHJpZ2h0Cj4gPj4gd2hpbGUgYXQgaXQ/Cj4gPj4gIAo+ID4gCj4gPiBUaGlzIHBhdGNoIGlzIGFi b3V0IGFkZGluZyB0aGUgaW5kaXJlY3Rpb24gc28gd2UgY2FuIG1vdmUgdGhlIG1lbWJlcgo+ID4g cGFpbmxlc3NseS4gTWl4aW5nIGluIGRpZmZlcmVudCBzdHVmZiB3b3VsZCBiZSBhIGJhZCBwcmFj dGljZS4KPiA+IAo+ID4gQlRXIEkganVzdCBleHBsYWluZWQgdGhhdCBpdCBhaW4ndCB3cm9uZywg c28gSSByZWFsbHkgZG8gbm90IHVuZGVyc3RhbmQKPiA+IHdoYXQgZG8geW91IG1lYW4gYnkgICd3 aHkgbm90IGRvaW5nIGl0IHJpZ2h0Jy4gQ2FuIHlvdSBwbGVhc2UgZXhwbGFpbj8KPiA+ICAgCj4g Cj4gSSBkaWQgbm90IHdhbnRlZCB0byBkaXNjdXNzIGEgbG9uZyB0aW1lIG9uIHRoaXMgYW5kIGdh dmUgbXkgUi1CLCBzbyAKPiBtZWFuaW5nIHRoYXQgSSBhbSBPSyB3aXRoIHRoaXMgcGF0Y2guCj4g Cj4gQnV0IGlmIHlvdSBhc2ssIHllcyBJIGNhbiwgaXQgc2VlbXMgcXVpdGUgb2J2aW91cy4KPiBX aGVuIHlvdSBidWlsZCBhIENDVyB5b3UgZ2l2ZSB0aGUgcG9pbnRlciB0byBDQ1ctPmNkYSBhbmQg eW91IGdpdmUgdGhlIAo+IHNpemUgb2YgdGhlIHRyYW5zZmVyIGluIENDVy0+Y291bnQuCj4gCj4g SGVyZSB0aGUgY291bnQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc2l6ZW9mIG9mIHRoZSBwb2lu dGVyIHVzZWQgdG8gCj4gaW5pdGlhbGl6ZSBDQ1ctPmNkYSB3aXRoLgoKQnV0IHRoZSBjZGEgcG9p bnRzIHRvIHRoZSBwb2ludGVyIGFkZHJlc3MsIHNvIHRoZSBzaXplIG9mIHRoZSBwb2ludGVyCmlz IGFjdHVhbGx5IHRoZSBjb3JyZWN0IHZhbHVlIGhlcmUsIGlzbid0IGl0PwoKPiBMdWtpbHkgd2Ug d29yayBvbiBhIDY0IGJpdHMgbWFjaGluZSB3aXRoIDY0IGJpdHMgcG9pbnRlcnMgYW5kIHRoZSBz aXplIAo+IG9mIHRoZSBwb2ludGVkIG9iamVjdCBpcyA2NCBiaXRzIHdpZGUgc28uLi4gdGhlIHJl c3VsdGluZyBjb3VudCBpcyByaWdodC4KPiBCdXQgaXQgaXMgbm90IHRoZSBjb3JyZWN0IHdheSB0 byBkbyBpdC4KCkkgdGhpbmsgaXQgaXMsIGJ1dCB0aGlzIGludGVyZmFjZSByZWFsbHkgaXMgY29u ZnVzaW5nLgoKPiBUaGF0IGlzIGFsbC4gTm90IGEgYmlnIGNvbmNlcm4sIHlvdSBkbyBub3QgbmVl ZCB0byBjaGFuZ2UgaXQsIGFzIHlvdSAKPiBzYWlkIGl0IGNhbiBiZSBkb25lIGluIGFub3RoZXIg cGF0Y2guCj4gCj4gPiBEaWQgeW91IGFncmVlIHdpdGggdGhlIHJlc3Qgb2YgbXkgY29tbWVudD8g SSBtZWFuIHRoZXJlIHdhcyBtb3JlIHRvIGl0Lgo+ID4gICAKPiAKPiBJIHVuZGVyc3Rvb2QgZnJv bSB5b3VyIGNvbW1lbnRzIHRoYXQgdGhlIGluZGljYXRvcnMgaW4gTGludXggYXJlIDY0Yml0cyAK PiB3aWRlIHNvIGFsbCBPSy4KPiAKPiBSZWdhcmRzCj4gUGllcnJlCj4gCj4gCj4gCj4gCj4gCj4g CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpWaXJ0dWFs aXphdGlvbiBtYWlsaW5nIGxpc3QKVmlydHVhbGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlv bi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8v dmlydHVhbGl6YXRpb24=