Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1227380 > unrolled thread

Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram

Started byScott Wood <scottwood@freescale.com>
First post2015-09-17 22:30 +0200
Last post2015-09-18 04:40 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage  muram Scott Wood <scottwood@freescale.com> - 2015-09-17 22:30 +0200
    RE: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram Zhao Qiang <qiang.zhao@freescale.com> - 2015-09-18 04:40 +0200

#1227380 — Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram

FromScott Wood <scottwood@freescale.com>
Date2015-09-17 22:30 +0200
SubjectRe: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram
Message-ID<q9NYD-68Q-27@gated-at.bofh.it>
On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote:
> diff --git a/arch/powerpc/sysdev/qe_lib/qe_common.c 
> b/arch/powerpc/sysdev/qe_lib/qe_common.c
> new file mode 100644
> index 0000000..1213458
> --- /dev/null
> +++ b/arch/powerpc/sysdev/qe_lib/qe_common.c
> @@ -0,0 +1,242 @@
> +/*
> + * Freescale QE common code
> + *
> + * Author: Zhao Qiang  <qiang.zhao@freescale.com>
> + *
> + * Copyright 2015 Freescale Semiconductor, Inc.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#include <linux/genalloc.h>
> +#include <linux/list.h>
> +#include <linux/init.h>
> +#include <linux/of_device.h>
> +#include <linux/spinlock.h>
> +#include <linux/export.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/slab.h>
> +
> +#include <linux/io.h>
> +#include <asm/qe.h>
> +
> +static struct gen_pool *muram_pool;
> +static struct genpool_data_align muram_pool_data;
> +static struct genpool_data_fixed muram_pool_data_fixed;
> +static spinlock_t qe_muram_lock;
> +static u8 __iomem *muram_vbase;
> +static phys_addr_t muram_pbase;
> +
> +struct muram_block {
> +     struct list_head head;
> +     unsigned long start;
> +     int size;
> +};
> +
> +static LIST_HEAD(muram_block_list);
> +
> +/* max address size we deal with */
> +#define OF_MAX_ADDR_CELLS    4
> +#define GENPOOL_OFFSET               4096
> +
> +int qe_muram_init(void)
> +{
> +     struct device_node *np;
> +     struct resource r;
> +     u32 zero[OF_MAX_ADDR_CELLS] = {};
> +     resource_size_t max = 0;
> +     int i = 0;
> +     int ret = 0;
> +
> +     if (muram_pbase)
> +             return 0;
> +
> +     np = of_find_compatible_node(NULL, NULL, "fsl,qe-muram-data");
> +     if (!np) {
> +             /* try legacy bindings */
> +             np = of_find_node_by_name(NULL, "data-only");
> +             if (!np) {
> +                     pr_err("Cannot find CPM muram data node");
> +                     ret = -ENODEV;
> +                     goto out;
> +             }
> +     }
> +
> +     muram_pool = gen_pool_create(1, -1);
> +     muram_pbase = of_translate_address(np, zero);
> +     if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) {
> +             pr_err("Cannot translate zero through CPM muram node");
> +             ret = -ENODEV;
> +             goto err;
> +     }
> +
> +     while (of_address_to_resource(np, i++, &r) == 0) {
> +             if (r.end > max)
> +                     max = r.end;
> +             ret = gen_pool_add(muram_pool, r.start - muram_pbase +
> +                                GENPOOL_OFFSET, resource_size(&r), -1);
> +             if (ret) {
> +                             pr_err("QE: couldn't add muram to pool!\n");
> +                             goto err;
> +                     }
> +
> +     }
> +
> +     muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1);
> +     if (!muram_vbase) {
> +             pr_err("Cannot map QE muram");
> +             ret = -ENOMEM;
> +             goto err;
> +     }
> +     goto out;
> +err:
> +     gen_pool_destroy(muram_pool);
> +out:
> +     of_node_put(np);
> +     return ret;
> +}
> +
> +/*
> + * qe_muram_alloc - allocate the requested size worth of multi-user ram
> + * @size: number of bytes to allocate
> + * @align: requested alignment, in bytes
> + *
> + * This function returns an offset into the muram area.
> + */
> +unsigned long qe_muram_alloc(unsigned long size, unsigned long align)
> +{
> +     unsigned long start;
> +     unsigned long flags;
> +     struct muram_block *entry;
> +
> +     spin_lock_irqsave(&qe_muram_lock, flags);
> +     muram_pool_data.align = align;
> +     gen_pool_set_algo(muram_pool, gen_pool_first_fit_align,
> +                       &muram_pool_data);
> +     start = gen_pool_alloc(muram_pool, size);
> +     if (!start)
> +             goto out2;
> +     start = start - GENPOOL_OFFSET;
> +     memset(qe_muram_addr(start), 0, size);
> +     entry = kmalloc(sizeof(*entry), GFP_KERNEL);
> +     if (!entry)
> +             goto out1;
> +     entry->start = start;
> +     entry->size = size;
> +     list_add(&entry->head, &muram_block_list);
> +     spin_unlock_irqrestore(&qe_muram_lock, flags);
> +
> +     return start;
> +out1:
> +     gen_pool_free(muram_pool, start, size);
> +out2:
> +     spin_unlock_irqrestore(&qe_muram_lock, flags);
> +     return (unsigned long) -ENOMEM;
> +}
> +EXPORT_SYMBOL(qe_muram_alloc);
> +
> +/*
> + * qe_muram_alloc_fixed - reserve a specific region of multi-user ram
> + * @size: number of bytes to allocate
> + * @offset: offset of allocation start address
> + *
> + * This function returns an offset into the muram area.
> + */
> +unsigned long qe_muram_alloc_fixed(unsigned long offset, unsigned long 
> size)
> +{
> +
> +     unsigned long start;
> +     unsigned long flags;
> +     unsigned long size_alloc = size;
> +     struct muram_block *entry;
> +     int end_bit;
> +     int order = muram_pool -> min_alloc_order;
> +
> +     spin_lock_irqsave(&qe_muram_lock, flags);
> +     end_bit = (offset >> order) + ((size + (1UL << order) - 1) >> order);
> +     if ((offset + size) > (end_bit << order))
> +             size_alloc = size + (1UL << order);
> +
> +     muram_pool_data_fixed.offset = offset + GENPOOL_OFFSET;
> +     gen_pool_set_algo(muram_pool, gen_pool_fixed_fit,
> +                       &muram_pool_data_fixed);
> +     start = gen_pool_alloc(muram_pool, size_alloc);
> +     if (!start)
> +             goto out2;
> +     start = start - GENPOOL_OFFSET;
> +     memset(qe_muram_addr(start), 0, size_alloc);
> +     entry = kmalloc(sizeof(*entry), GFP_KERNEL);
> +     if (!entry)
> +             goto out1;
> +     entry->start = start;
> +     entry->size = size_alloc;
> +     list_add(&entry->head, &muram_block_list);
> +     spin_unlock_irqrestore(&qe_muram_lock, flags);
> +
> +     return start;
> +out1:
> +     gen_pool_free(muram_pool, start, size_alloc);
> +out2:
> +     spin_unlock_irqrestore(&qe_muram_lock, flags);
> +     return (unsigned long) -ENOMEM;
> +
> +
> +}
> +EXPORT_SYMBOL(qe_muram_alloc_fixed);
> +
> +/**
> + * qe_muram_free - free a chunk of multi-user ram
> + * @offset: The beginning of the chunk as returned by qe_muram_alloc().
> + */
> +int qe_muram_free(unsigned long offset)
> +{
> +     unsigned long flags;
> +     int size;
> +     struct muram_block *tmp;
> +
> +     size = 0;
> +     spin_lock_irqsave(&qe_muram_lock, flags);
> +     list_for_each_entry(tmp, &muram_block_list, head) {
> +             if (tmp->start == offset) {
> +                     size = tmp->size;
> +                     list_del(&tmp->head);
> +                     kfree(tmp);
> +                     break;
> +             }
> +     }
> +     gen_pool_free(muram_pool, offset + GENPOOL_OFFSET, size);
> +     spin_unlock_irqrestore(&qe_muram_lock, flags);
> +
> +     return size;
> +}
> +EXPORT_SYMBOL(qe_muram_free);
> +
> +/**
> + * qe_muram_addr - turn a muram offset into a virtual address
> + * @offset: muram offset to convert
> + */
> +void __iomem *qe_muram_addr(unsigned long offset)
> +{
> +     return muram_vbase + offset;
> +}
> +EXPORT_SYMBOL(qe_muram_addr);
> +
> +unsigned long qe_muram_offset(void __iomem *addr)
> +{
> +     return addr - (void __iomem *)muram_vbase;
> +}
> +EXPORT_SYMBOL(qe_muram_offset);
> +
> +/**
> + * qe_muram_dma - turn a muram virtual address into a DMA address
> + * @offset: virtual address from qe_muram_addr() to convert
> + */
> +dma_addr_t qe_muram_dma(void __iomem *addr)
> +{
> +     return muram_pbase + ((u8 __iomem *)addr - muram_vbase);
> +}
> +EXPORT_SYMBOL(qe_muram_dma);

Why are you adding new functions rather than replacing the implementation of 
the old ones?

Again, I don't want to see a big addition in one place and a big deletion 
elsewhere.  I want to see the actual code changes as a diff.  Any moving 
around of code must be a separate patch from making changes to it that are 
significant enough that git format-patch doesn't detect it as a move.

-Scott

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1227526 — RE: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram

FromZhao Qiang <qiang.zhao@freescale.com>
Date2015-09-18 04:40 +0200
SubjectRE: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram
Message-ID<q9TKF-69U-11@gated-at.bofh.it>
In reply to#1227380
T24gTW9uLCAyMDE1LTA5LTE4IGF0IDA0OjI4ICswODAwLCBXb29kIFNjb3R0LUIwNzQyMSB3cm90
ZToNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogV29vZCBTY290dC1CMDc0
MjENCj4gU2VudDogRnJpZGF5LCBTZXB0ZW1iZXIgMTgsIDIwMTUgNDoyOCBBTQ0KPiBUbzogWmhh
byBRaWFuZy1CNDU0NzUNCj4gQ2M6IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4
cHBjLWRldkBsaXN0cy5vemxhYnMub3JnOw0KPiBsYXVyYWFAY29kZWF1cm9yYS5vcmc7IFhpZSBY
aWFvYm8tUjYzMDYxOyBiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc7IExpDQo+IFlhbmctTGVvLVI1
ODQ3MjsgcGF1bHVzQHNhbWJhLm9yZw0KPiBTdWJqZWN0OiBSZTogW1BBVENIIHY5IDMvNV0gcWVf
Y29tbW9uOiBhZGQgcWVfbXVyYW1fIGZ1bmN0aW9ucyB0byBtYW5hZ2UNCj4gbXVyYW0NCj4gDQo+
IE9uIE1vbiwgMjAxNS0wOS0xNCBhdCAwOTozOCArMDgwMCwgWmhhbyBRaWFuZyB3cm90ZToNCj4g
PiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWVfY29tbW9uLmMNCj4g
PiBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2NvbW1vbi5jDQo+ID4gbmV3IGZpbGUg
bW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi4xMjEzNDU4DQo+ID4gLS0tIC9kZXYvbnVs
bA0KPiA+ICsrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2NvbW1vbi5jDQo+ID4g
QEAgLTAsMCArMSwyNDIgQEANCj4gPiArLyoNCj4gPiArICogRnJlZXNjYWxlIFFFIGNvbW1vbiBj
b2RlDQo+ID4gKyAqDQo+ID4gKyAqIEF1dGhvcjogWmhhbyBRaWFuZyAgPHFpYW5nLnpoYW9AZnJl
ZXNjYWxlLmNvbT4NCj4gPiArICoNCj4gPiArICogQ29weXJpZ2h0IDIwMTUgRnJlZXNjYWxlIFNl
bWljb25kdWN0b3IsIEluYy4NCj4gPiArICoNCj4gPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KPiA+ICttb2RpZnkNCj4g
PiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBhcyBwdWJsaXNoZWQNCj4gPiArYnkNCj4gPiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCj4gPiArICogKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCj4gPiArICovDQo+ID4gKw0KPiA+ICsjaW5j
bHVkZSA8bGludXgvZ2VuYWxsb2MuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4NCj4g
PiArI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L29mX2Rldmlj
ZS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCj4gPiArI2luY2x1ZGUgPGxp
bnV4L2V4cG9ydC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4NCj4gPiArI2luY2x1ZGUg
PGxpbnV4L29mX2FkZHJlc3MuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4NCj4gPiAr
DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9pby5oPg0KPiA+ICsjaW5jbHVkZSA8YXNtL3FlLmg+DQo+
ID4gKw0KPiA+ICtzdGF0aWMgc3RydWN0IGdlbl9wb29sICptdXJhbV9wb29sOw0KPiA+ICtzdGF0
aWMgc3RydWN0IGdlbnBvb2xfZGF0YV9hbGlnbiBtdXJhbV9wb29sX2RhdGE7IHN0YXRpYyBzdHJ1
Y3QNCj4gPiArZ2VucG9vbF9kYXRhX2ZpeGVkIG11cmFtX3Bvb2xfZGF0YV9maXhlZDsgc3RhdGlj
IHNwaW5sb2NrX3QNCj4gPiArcWVfbXVyYW1fbG9jazsgc3RhdGljIHU4IF9faW9tZW0gKm11cmFt
X3ZiYXNlOyBzdGF0aWMgcGh5c19hZGRyX3QNCj4gPiArbXVyYW1fcGJhc2U7DQo+ID4gKw0KPiA+
ICtzdHJ1Y3QgbXVyYW1fYmxvY2sgew0KPiA+ICsgICAgIHN0cnVjdCBsaXN0X2hlYWQgaGVhZDsN
Cj4gPiArICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0Ow0KPiA+ICsgICAgIGludCBzaXplOw0KPiA+
ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIExJU1RfSEVBRChtdXJhbV9ibG9ja19saXN0KTsNCj4g
PiArDQo+ID4gKy8qIG1heCBhZGRyZXNzIHNpemUgd2UgZGVhbCB3aXRoICovDQo+ID4gKyNkZWZp
bmUgT0ZfTUFYX0FERFJfQ0VMTFMgICAgNA0KPiA+ICsjZGVmaW5lIEdFTlBPT0xfT0ZGU0VUICAg
ICAgICAgICAgICAgNDA5Ng0KPiA+ICsNCj4gPiAraW50IHFlX211cmFtX2luaXQodm9pZCkNCj4g
PiArew0KPiA+ICsgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7DQo+ID4gKyAgICAgc3RydWN0
IHJlc291cmNlIHI7DQo+ID4gKyAgICAgdTMyIHplcm9bT0ZfTUFYX0FERFJfQ0VMTFNdID0ge307
DQo+ID4gKyAgICAgcmVzb3VyY2Vfc2l6ZV90IG1heCA9IDA7DQo+ID4gKyAgICAgaW50IGkgPSAw
Ow0KPiA+ICsgICAgIGludCByZXQgPSAwOw0KPiA+ICsNCj4gPiArICAgICBpZiAobXVyYW1fcGJh
c2UpDQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gMDsNCj4gPiArDQo+ID4gKyAgICAgbnAgPSBv
Zl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHFlLW11cmFtLWRhdGEiKTsN
Cj4gPiArICAgICBpZiAoIW5wKSB7DQo+ID4gKyAgICAgICAgICAgICAvKiB0cnkgbGVnYWN5IGJp
bmRpbmdzICovDQo+ID4gKyAgICAgICAgICAgICBucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5V
TEwsICJkYXRhLW9ubHkiKTsNCj4gPiArICAgICAgICAgICAgIGlmICghbnApIHsNCj4gPiArICAg
ICAgICAgICAgICAgICAgICAgcHJfZXJyKCJDYW5ub3QgZmluZCBDUE0gbXVyYW0gZGF0YSBub2Rl
Iik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FTk9ERVY7DQo+ID4gKyAgICAg
ICAgICAgICAgICAgICAgIGdvdG8gb3V0Ow0KPiA+ICsgICAgICAgICAgICAgfQ0KPiA+ICsgICAg
IH0NCj4gPiArDQo+ID4gKyAgICAgbXVyYW1fcG9vbCA9IGdlbl9wb29sX2NyZWF0ZSgxLCAtMSk7
DQo+ID4gKyAgICAgbXVyYW1fcGJhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhucCwgemVybyk7
DQo+ID4gKyAgICAgaWYgKG11cmFtX3BiYXNlID09IChwaHlzX2FkZHJfdClPRl9CQURfQUREUikg
ew0KPiA+ICsgICAgICAgICAgICAgcHJfZXJyKCJDYW5ub3QgdHJhbnNsYXRlIHplcm8gdGhyb3Vn
aCBDUE0gbXVyYW0gbm9kZSIpOw0KPiA+ICsgICAgICAgICAgICAgcmV0ID0gLUVOT0RFVjsNCj4g
PiArICAgICAgICAgICAgIGdvdG8gZXJyOw0KPiA+ICsgICAgIH0NCj4gPiArDQo+ID4gKyAgICAg
d2hpbGUgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIGkrKywgJnIpID09IDApIHsNCj4gPiAr
ICAgICAgICAgICAgIGlmIChyLmVuZCA+IG1heCkNCj4gPiArICAgICAgICAgICAgICAgICAgICAg
bWF4ID0gci5lbmQ7DQo+ID4gKyAgICAgICAgICAgICByZXQgPSBnZW5fcG9vbF9hZGQobXVyYW1f
cG9vbCwgci5zdGFydCAtIG11cmFtX3BiYXNlICsNCj4gPiArICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBHRU5QT09MX09GRlNFVCwgcmVzb3VyY2Vfc2l6ZSgmciksIC0xKTsNCj4gPiAr
ICAgICAgICAgICAgIGlmIChyZXQpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwcl9lcnIoIlFFOiBjb3VsZG4ndCBhZGQgbXVyYW0gdG8NCj4gcG9vbCFcbiIpOw0KPiA+ICsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOw0KPiA+ICsgICAgICAgICAgICAg
ICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgbXVyYW1fdmJh
c2UgPSBpb3JlbWFwKG11cmFtX3BiYXNlLCBtYXggLSBtdXJhbV9wYmFzZSArIDEpOw0KPiA+ICsg
ICAgIGlmICghbXVyYW1fdmJhc2UpIHsNCj4gPiArICAgICAgICAgICAgIHByX2VycigiQ2Fubm90
IG1hcCBRRSBtdXJhbSIpOw0KPiA+ICsgICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsNCj4gPiAr
ICAgICAgICAgICAgIGdvdG8gZXJyOw0KPiA+ICsgICAgIH0NCj4gPiArICAgICBnb3RvIG91dDsN
Cj4gPiArZXJyOg0KPiA+ICsgICAgIGdlbl9wb29sX2Rlc3Ryb3kobXVyYW1fcG9vbCk7DQo+ID4g
K291dDoNCj4gPiArICAgICBvZl9ub2RlX3B1dChucCk7DQo+ID4gKyAgICAgcmV0dXJuIHJldDsN
Cj4gPiArfQ0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogcWVfbXVyYW1fYWxsb2MgLSBhbGxvY2F0
ZSB0aGUgcmVxdWVzdGVkIHNpemUgd29ydGggb2YgbXVsdGktdXNlcg0KPiA+ICtyYW0NCj4gPiAr
ICogQHNpemU6IG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQ0KPiA+ICsgKiBAYWxpZ246IHJl
cXVlc3RlZCBhbGlnbm1lbnQsIGluIGJ5dGVzDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgZnVuY3Rp
b24gcmV0dXJucyBhbiBvZmZzZXQgaW50byB0aGUgbXVyYW0gYXJlYS4NCj4gPiArICovDQo+ID4g
K3Vuc2lnbmVkIGxvbmcgcWVfbXVyYW1fYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25l
ZCBsb25nIGFsaWduKQ0KPiA+ICt7DQo+ID4gKyAgICAgdW5zaWduZWQgbG9uZyBzdGFydDsNCj4g
PiArICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOw0KPiA+ICsgICAgIHN0cnVjdCBtdXJhbV9ibG9j
ayAqZW50cnk7DQo+ID4gKw0KPiA+ICsgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZxZV9tdXJhbV9s
b2NrLCBmbGFncyk7DQo+ID4gKyAgICAgbXVyYW1fcG9vbF9kYXRhLmFsaWduID0gYWxpZ247DQo+
ID4gKyAgICAgZ2VuX3Bvb2xfc2V0X2FsZ28obXVyYW1fcG9vbCwgZ2VuX3Bvb2xfZmlyc3RfZml0
X2FsaWduLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICZtdXJhbV9wb29sX2RhdGEpOw0K
PiA+ICsgICAgIHN0YXJ0ID0gZ2VuX3Bvb2xfYWxsb2MobXVyYW1fcG9vbCwgc2l6ZSk7DQo+ID4g
KyAgICAgaWYgKCFzdGFydCkNCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0MjsNCj4gPiArICAg
ICBzdGFydCA9IHN0YXJ0IC0gR0VOUE9PTF9PRkZTRVQ7DQo+ID4gKyAgICAgbWVtc2V0KHFlX211
cmFtX2FkZHIoc3RhcnQpLCAwLCBzaXplKTsNCj4gPiArICAgICBlbnRyeSA9IGttYWxsb2Moc2l6
ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOw0KPiA+ICsgICAgIGlmICghZW50cnkpDQo+ID4gKyAg
ICAgICAgICAgICBnb3RvIG91dDE7DQo+ID4gKyAgICAgZW50cnktPnN0YXJ0ID0gc3RhcnQ7DQo+
ID4gKyAgICAgZW50cnktPnNpemUgPSBzaXplOw0KPiA+ICsgICAgIGxpc3RfYWRkKCZlbnRyeS0+
aGVhZCwgJm11cmFtX2Jsb2NrX2xpc3QpOw0KPiA+ICsgICAgIHNwaW5fdW5sb2NrX2lycXJlc3Rv
cmUoJnFlX211cmFtX2xvY2ssIGZsYWdzKTsNCj4gPiArDQo+ID4gKyAgICAgcmV0dXJuIHN0YXJ0
Ow0KPiA+ICtvdXQxOg0KPiA+ICsgICAgIGdlbl9wb29sX2ZyZWUobXVyYW1fcG9vbCwgc3RhcnQs
IHNpemUpOw0KPiA+ICtvdXQyOg0KPiA+ICsgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFl
X211cmFtX2xvY2ssIGZsYWdzKTsNCj4gPiArICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1F
Tk9NRU07DQo+ID4gK30NCj4gPiArRVhQT1JUX1NZTUJPTChxZV9tdXJhbV9hbGxvYyk7DQo+ID4g
Kw0KPiA+ICsvKg0KPiA+ICsgKiBxZV9tdXJhbV9hbGxvY19maXhlZCAtIHJlc2VydmUgYSBzcGVj
aWZpYyByZWdpb24gb2YgbXVsdGktdXNlciByYW0NCj4gPiArICogQHNpemU6IG51bWJlciBvZiBi
eXRlcyB0byBhbGxvY2F0ZQ0KPiA+ICsgKiBAb2Zmc2V0OiBvZmZzZXQgb2YgYWxsb2NhdGlvbiBz
dGFydCBhZGRyZXNzDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBv
ZmZzZXQgaW50byB0aGUgbXVyYW0gYXJlYS4NCj4gPiArICovDQo+ID4gK3Vuc2lnbmVkIGxvbmcg
cWVfbXVyYW1fYWxsb2NfZml4ZWQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkDQo+ID4g
K2xvbmcNCj4gPiBzaXplKQ0KPiA+ICt7DQo+ID4gKw0KPiA+ICsgICAgIHVuc2lnbmVkIGxvbmcg
c3RhcnQ7DQo+ID4gKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsNCj4gPiArICAgICB1bnNpZ25l
ZCBsb25nIHNpemVfYWxsb2MgPSBzaXplOw0KPiA+ICsgICAgIHN0cnVjdCBtdXJhbV9ibG9jayAq
ZW50cnk7DQo+ID4gKyAgICAgaW50IGVuZF9iaXQ7DQo+ID4gKyAgICAgaW50IG9yZGVyID0gbXVy
YW1fcG9vbCAtPiBtaW5fYWxsb2Nfb3JkZXI7DQo+ID4gKw0KPiA+ICsgICAgIHNwaW5fbG9ja19p
cnFzYXZlKCZxZV9tdXJhbV9sb2NrLCBmbGFncyk7DQo+ID4gKyAgICAgZW5kX2JpdCA9IChvZmZz
ZXQgPj4gb3JkZXIpICsgKChzaXplICsgKDFVTCA8PCBvcmRlcikgLSAxKSA+Pg0KPiBvcmRlcik7
DQo+ID4gKyAgICAgaWYgKChvZmZzZXQgKyBzaXplKSA+IChlbmRfYml0IDw8IG9yZGVyKSkNCj4g
PiArICAgICAgICAgICAgIHNpemVfYWxsb2MgPSBzaXplICsgKDFVTCA8PCBvcmRlcik7DQo+ID4g
Kw0KPiA+ICsgICAgIG11cmFtX3Bvb2xfZGF0YV9maXhlZC5vZmZzZXQgPSBvZmZzZXQgKyBHRU5Q
T09MX09GRlNFVDsNCj4gPiArICAgICBnZW5fcG9vbF9zZXRfYWxnbyhtdXJhbV9wb29sLCBnZW5f
cG9vbF9maXhlZF9maXQsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgJm11cmFtX3Bvb2xf
ZGF0YV9maXhlZCk7DQo+ID4gKyAgICAgc3RhcnQgPSBnZW5fcG9vbF9hbGxvYyhtdXJhbV9wb29s
LCBzaXplX2FsbG9jKTsNCj4gPiArICAgICBpZiAoIXN0YXJ0KQ0KPiA+ICsgICAgICAgICAgICAg
Z290byBvdXQyOw0KPiA+ICsgICAgIHN0YXJ0ID0gc3RhcnQgLSBHRU5QT09MX09GRlNFVDsNCj4g
PiArICAgICBtZW1zZXQocWVfbXVyYW1fYWRkcihzdGFydCksIDAsIHNpemVfYWxsb2MpOw0KPiA+
ICsgICAgIGVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7DQo+ID4g
KyAgICAgaWYgKCFlbnRyeSkNCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0MTsNCj4gPiArICAg
ICBlbnRyeS0+c3RhcnQgPSBzdGFydDsNCj4gPiArICAgICBlbnRyeS0+c2l6ZSA9IHNpemVfYWxs
b2M7DQo+ID4gKyAgICAgbGlzdF9hZGQoJmVudHJ5LT5oZWFkLCAmbXVyYW1fYmxvY2tfbGlzdCk7
DQo+ID4gKyAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWVfbXVyYW1fbG9jaywgZmxhZ3Mp
Ow0KPiA+ICsNCj4gPiArICAgICByZXR1cm4gc3RhcnQ7DQo+ID4gK291dDE6DQo+ID4gKyAgICAg
Z2VuX3Bvb2xfZnJlZShtdXJhbV9wb29sLCBzdGFydCwgc2l6ZV9hbGxvYyk7DQo+ID4gK291dDI6
DQo+ID4gKyAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWVfbXVyYW1fbG9jaywgZmxhZ3Mp
Ow0KPiA+ICsgICAgIHJldHVybiAodW5zaWduZWQgbG9uZykgLUVOT01FTTsNCj4gPiArDQo+ID4g
Kw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0wocWVfbXVyYW1fYWxsb2NfZml4ZWQpOw0KPiA+
ICsNCj4gPiArLyoqDQo+ID4gKyAqIHFlX211cmFtX2ZyZWUgLSBmcmVlIGEgY2h1bmsgb2YgbXVs
dGktdXNlciByYW0NCj4gPiArICogQG9mZnNldDogVGhlIGJlZ2lubmluZyBvZiB0aGUgY2h1bmsg
YXMgcmV0dXJuZWQgYnkgcWVfbXVyYW1fYWxsb2MoKS4NCj4gPiArICovDQo+ID4gK2ludCBxZV9t
dXJhbV9mcmVlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSB7DQo+ID4gKyAgICAgdW5zaWduZWQgbG9u
ZyBmbGFnczsNCj4gPiArICAgICBpbnQgc2l6ZTsNCj4gPiArICAgICBzdHJ1Y3QgbXVyYW1fYmxv
Y2sgKnRtcDsNCj4gPiArDQo+ID4gKyAgICAgc2l6ZSA9IDA7DQo+ID4gKyAgICAgc3Bpbl9sb2Nr
X2lycXNhdmUoJnFlX211cmFtX2xvY2ssIGZsYWdzKTsNCj4gPiArICAgICBsaXN0X2Zvcl9lYWNo
X2VudHJ5KHRtcCwgJm11cmFtX2Jsb2NrX2xpc3QsIGhlYWQpIHsNCj4gPiArICAgICAgICAgICAg
IGlmICh0bXAtPnN0YXJ0ID09IG9mZnNldCkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICBz
aXplID0gdG1wLT5zaXplOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICBsaXN0X2RlbCgmdG1w
LT5oZWFkKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAga2ZyZWUodG1wKTsNCj4gPiArICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICAgICAgICB9DQo+ID4gKyAgICAg
fQ0KPiA+ICsgICAgIGdlbl9wb29sX2ZyZWUobXVyYW1fcG9vbCwgb2Zmc2V0ICsgR0VOUE9PTF9P
RkZTRVQsIHNpemUpOw0KPiA+ICsgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFlX211cmFt
X2xvY2ssIGZsYWdzKTsNCj4gPiArDQo+ID4gKyAgICAgcmV0dXJuIHNpemU7DQo+ID4gK30NCj4g
PiArRVhQT1JUX1NZTUJPTChxZV9tdXJhbV9mcmVlKTsNCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsg
KiBxZV9tdXJhbV9hZGRyIC0gdHVybiBhIG11cmFtIG9mZnNldCBpbnRvIGEgdmlydHVhbCBhZGRy
ZXNzDQo+ID4gKyAqIEBvZmZzZXQ6IG11cmFtIG9mZnNldCB0byBjb252ZXJ0DQo+ID4gKyAqLw0K
PiA+ICt2b2lkIF9faW9tZW0gKnFlX211cmFtX2FkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpIHsN
Cj4gPiArICAgICByZXR1cm4gbXVyYW1fdmJhc2UgKyBvZmZzZXQ7DQo+ID4gK30NCj4gPiArRVhQ
T1JUX1NZTUJPTChxZV9tdXJhbV9hZGRyKTsNCj4gPiArDQo+ID4gK3Vuc2lnbmVkIGxvbmcgcWVf
bXVyYW1fb2Zmc2V0KHZvaWQgX19pb21lbSAqYWRkcikgew0KPiA+ICsgICAgIHJldHVybiBhZGRy
IC0gKHZvaWQgX19pb21lbSAqKW11cmFtX3ZiYXNlOyB9DQo+ID4gK0VYUE9SVF9TWU1CT0wocWVf
bXVyYW1fb2Zmc2V0KTsNCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiBxZV9tdXJhbV9kbWEgLSB0
dXJuIGEgbXVyYW0gdmlydHVhbCBhZGRyZXNzIGludG8gYSBETUEgYWRkcmVzcw0KPiA+ICsgKiBA
b2Zmc2V0OiB2aXJ0dWFsIGFkZHJlc3MgZnJvbSBxZV9tdXJhbV9hZGRyKCkgdG8gY29udmVydCAg
Ki8NCj4gPiArZG1hX2FkZHJfdCBxZV9tdXJhbV9kbWEodm9pZCBfX2lvbWVtICphZGRyKSB7DQo+
ID4gKyAgICAgcmV0dXJuIG11cmFtX3BiYXNlICsgKCh1OCBfX2lvbWVtICopYWRkciAtIG11cmFt
X3ZiYXNlKTsgfQ0KPiA+ICtFWFBPUlRfU1lNQk9MKHFlX211cmFtX2RtYSk7DQo+IA0KPiBXaHkg
YXJlIHlvdSBhZGRpbmcgbmV3IGZ1bmN0aW9ucyByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlIGlt
cGxlbWVudGF0aW9uDQo+IG9mIHRoZSBvbGQgb25lcz8NCj4gDQo+IEFnYWluLCBJIGRvbid0IHdh
bnQgdG8gc2VlIGEgYmlnIGFkZGl0aW9uIGluIG9uZSBwbGFjZSBhbmQgYSBiaWcgZGVsZXRpb24N
Cj4gZWxzZXdoZXJlLiAgSSB3YW50IHRvIHNlZSB0aGUgYWN0dWFsIGNvZGUgY2hhbmdlcyBhcyBh
IGRpZmYuICBBbnkgbW92aW5nDQo+IGFyb3VuZCBvZiBjb2RlIG11c3QgYmUgYSBzZXBhcmF0ZSBw
YXRjaCBmcm9tIG1ha2luZyBjaGFuZ2VzIHRvIGl0IHRoYXQNCj4gYXJlIHNpZ25pZmljYW50IGVu
b3VnaCB0aGF0IGdpdCBmb3JtYXQtcGF0Y2ggZG9lc24ndCBkZXRlY3QgaXQgYXMgYSBtb3ZlLg0K
DQpNb2RpZnkgY3BtX211cmFtIGZ1bmN0aW9ucyB3aXRoIGdlbmFsbG9jIGZpcnN0LCBUaGVuIG1v
dmUgaXQgdG8gcWVfbXVyYW0gd2l0aA0KY2h1cm4gb2YgY3BtX211cmFtXyogYW5kIHFlX211cmFf
Kj8gT3Igb3RoZXIgbWV0aG9kPw0KDQo+IA0KPiAtU2NvdHQNCg0K
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web