From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vasileios Karakasis Subject: realloc function Date: Sun, 02 Jan 2011 19:37:42 +0200 Message-ID: <4D20B7E6.9020207@cslab.ece.ntua.gr> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigC045DF3BB2C548C458310A47" Return-path: Sender: linux-numa-owner@vger.kernel.org List-ID: To: linux-numa@vger.kernel.org Cc: 'Kornilios Kourtis' This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigC045DF3BB2C548C458310A47 Content-Type: multipart/mixed; boundary="------------030608080308010701040401" This is a multi-part message in MIME format. --------------030608080308010701040401 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi, I am submitting a patch for a realloc function that might be useful. The proposed numa_realloc() is merely a wrapper to mremap(), which it calls with the flag MREMAP_MAYMOVE. The policy of the vm area is copied by the kernel in case of moving. I am also submitting a test program, that keeps expanding an initial allocation until a limit is reached and checks the mempolicy of the expanded area in every iteration. My use case is a dynamic array implementation which uses realloc() to dynamically expand the array and I want to convert it to a numa-aware implementation. PS: I could also submit a brief manpage entry for the new function, if you agree. Best regards, --=20 Vasileios Karakasis --------------030608080308010701040401 Content-Type: text/plain; name="numactl-2.0.6-rc4-realloc-patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="numactl-2.0.6-rc4-realloc-patch" ZGlmZiAtdXJOIG51bWFjdGwtMi4wLjYtcmM0LW9yaWcvbGlibnVtYS5jIG51bWFjdGwtMi4w LjYtcmM0L2xpYm51bWEuYwotLS0gbnVtYWN0bC0yLjAuNi1yYzQtb3JpZy9saWJudW1hLmMJ MjAxMS0wMS0wMiAxNjowMTowNy4wMDAwMDAwMDAgKzAyMDAKKysrIG51bWFjdGwtMi4wLjYt cmM0L2xpYm51bWEuYwkyMDExLTAxLTAyIDE2OjAxOjE0LjAwMDAwMDAwMCArMDIwMApAQCAt ODcxLDYgKzg3MSwxNiBAQAogCXJldHVybiBtZW07CiB9IAogCit2b2lkICpudW1hX3JlYWxs b2Modm9pZCAqb2xkX2FkZHIsIHNpemVfdCBvbGRfc2l6ZSwgc2l6ZV90IG5ld19zaXplKQor eworCWNoYXIgKm1lbTsKKwltZW0gPSBtcmVtYXAob2xkX2FkZHIsIG9sZF9zaXplLCBuZXdf c2l6ZSwgTVJFTUFQX01BWU1PVkUpOworCWlmIChtZW0gPT0gKGNoYXIgKiktMSkKKwkJcmV0 dXJuIE5VTEw7CisJLyogUG9saWN5IGFuZCBiaW5kaW5nIG9mIHRoZSB2bSBzZWdtZW50IGFy ZSBwcmVzZXJ2ZWQgYnkgdGhlIGtlcm5lbCAqLworCXJldHVybiBtZW07Cit9CisKIHZvaWQg Km51bWFfYWxsb2NfaW50ZXJsZWF2ZWRfc3Vic2V0X3YxKHNpemVfdCBzaXplLCBjb25zdCBu b2RlbWFza190ICptYXNrKQogewogCWNoYXIgKm1lbTsKZGlmZiAtdXJOIG51bWFjdGwtMi4w LjYtcmM0LW9yaWcvTWFrZWZpbGUgbnVtYWN0bC0yLjAuNi1yYzQvTWFrZWZpbGUKLS0tIG51 bWFjdGwtMi4wLjYtcmM0LW9yaWcvTWFrZWZpbGUJMjAxMC0xMi0yMiAxMzoyOTo1MC4wMDAw MDAwMDAgKzAyMDAKKysrIG51bWFjdGwtMi4wLjYtcmM0L01ha2VmaWxlCTIwMTEtMDEtMDIg MTM6MzI6MzYuMDAwMDAwMDAwICswMjAwCkBAIC0zMSw3ICszMSw3IEBACiAJICAgICAgdGVz dC9hZnRlciB0ZXN0L2JlZm9yZSB0aHJlYWR0ZXN0IHRlc3RfbW92ZV9wYWdlcyBcCiAJICAg ICAgdGVzdC9tYmluZF9taWdfcGFnZXMgdGVzdC9taWdyYXRlX3BhZ2VzIFwKIAkgICAgICBt aWdyYXRlcGFnZXMgbWlnc3BlZWQgbWlnc3BlZWQubyBsaWJudW1hLmEgXAotCSAgICAgIHRl c3QvbW92ZV9wYWdlcworCSAgICAgIHRlc3QvbW92ZV9wYWdlcyB0ZXN0L3JlYWxsb2NfdGVz dAogU09VUkNFUyA6PSBiaXRvcHMuYyBsaWJudW1hLmMgZGlzdGFuY2UuYyBtZW1ob2cuYyBu dW1hY3RsLmMgbnVtYWRlbW8uYyBcCiAJbnVtYW1vbi5jIHNobS5jIHN0cmVhbV9saWIuYyBz dHJlYW1fbWFpbi5jIHN5c2NhbGwuYyB1dGlsLmMgbXQuYyBcCiAJY2xlYXJjYWNoZS5jIHRl c3QvKi5jCkBAIC00Myw3ICs0Myw3IEBACiBhbGw6IG51bWFjdGwgbWlncmF0ZXBhZ2VzIG1p Z3NwZWVkIGxpYm51bWEuc28gbnVtYWRlbW8gbnVtYW1vbiBtZW1ob2cgXAogICAgICB0ZXN0 L3RzaGFyZWQgc3RyZWFtIHRlc3QvbXlub2RlIHRlc3QvcGFnZXNpemUgdGVzdC9mdG9rIHRl c3QvcHJlZmVyZWQgXAogICAgICB0ZXN0L3JhbmRtYXAgdGVzdC9ub2RlbWFwIHRlc3QvZGlz dGFuY2UgdGVzdC90Yml0bWFwIHRlc3QvbW92ZV9wYWdlcyBcCi0gICAgIHRlc3QvbWJpbmRf bWlnX3BhZ2VzIHRlc3QvbWlncmF0ZV9wYWdlcyBsaWJudW1hLmEKKyAgICAgdGVzdC9tYmlu ZF9taWdfcGFnZXMgdGVzdC9taWdyYXRlX3BhZ2VzIHRlc3QvcmVhbGxvY190ZXN0IGxpYm51 bWEuYQogCiBudW1hY3RsOiBudW1hY3RsLm8gdXRpbC5vIHNobS5vIGJpdG9wcy5vIGxpYm51 bWEuc28KIApAQCAtMTIzLDYgKzEyMyw4IEBACiAKIHRlc3QvbWlncmF0ZV9wYWdlczogdGVz dC9taWdyYXRlX3BhZ2VzLmMgbGlibnVtYS5zbwogCit0ZXN0L3JlYWxsb2NfdGVzdDogdGVz dC9yZWFsbG9jX3Rlc3QuYyBsaWJudW1hLnNvCisKIC5QSE9OWTogaW5zdGFsbCBhbGwgY2xl YW4gaHRtbCBkZXBlbmQKIAogTUFOUEFHRVMgOj0gbnVtYS4zIG51bWFjdGwuOCBudW1hc3Rh dC44IG1pZ3JhdGVwYWdlcy44IG1pZ3NwZWVkLjgKZGlmZiAtdXJOIG51bWFjdGwtMi4wLjYt cmM0LW9yaWcvbnVtYS5oIG51bWFjdGwtMi4wLjYtcmM0L251bWEuaAotLS0gbnVtYWN0bC0y LjAuNi1yYzQtb3JpZy9udW1hLmgJMjAxMC0xMi0yMiAxMzoyOTo1MC4wMDAwMDAwMDAgKzAy MDAKKysrIG51bWFjdGwtMi4wLjYtcmM0L251bWEuaAkyMDEwLTEyLTIyIDEzOjQ1OjQyLjAw MDAwMDAwMCArMDIwMApAQCAtMjEyLDYgKzIxMiw4IEBACiB2b2lkICpudW1hX2FsbG9jX2xv Y2FsKHNpemVfdCBzaXplKTsKIC8qIEFsbG9jYXRpb24gd2l0aCBjdXJyZW50IHBvbGljeSAq Lwogdm9pZCAqbnVtYV9hbGxvYyhzaXplX3Qgc2l6ZSk7CisvKiBSZWFsbG9jIG1lbW9yeSwg YmluZGluZyBwcm9wZXJ0aWVzIGFyZSBwcmVzZXJ2ZWQuICovCit2b2lkICpudW1hX3JlYWxs b2Modm9pZCAqb2xkX2FkZHIsIHNpemVfdCBvbGRfc2l6ZSwgc2l6ZV90IG5ld19zaXplKTsK IC8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb25zIGFib3ZlICovCiB2 b2lkIG51bWFfZnJlZSh2b2lkICptZW0sIHNpemVfdCBzaXplKTsKIApkaWZmIC11ck4gbnVt YWN0bC0yLjAuNi1yYzQtb3JpZy90ZXN0L3JlYWxsb2NfdGVzdC5jIG51bWFjdGwtMi4wLjYt cmM0L3Rlc3QvcmVhbGxvY190ZXN0LmMKLS0tIG51bWFjdGwtMi4wLjYtcmM0LW9yaWcvdGVz dC9yZWFsbG9jX3Rlc3QuYwkxOTcwLTAxLTAxIDAyOjAwOjAwLjAwMDAwMDAwMCArMDIwMAor KysgbnVtYWN0bC0yLjAuNi1yYzQvdGVzdC9yZWFsbG9jX3Rlc3QuYwkyMDExLTAxLTAyIDEz OjI1OjEzLjAwMDAwMDAwMCArMDIwMApAQCAtMCwwICsxLDEwOSBAQAorI2luY2x1ZGUgPGFz c2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5j bHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8u aD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgIm51bWEuaCIKKyNpbmNsdWRl ICJudW1haWYuaCIKKworI2RlZmluZSBERUZBVUxUX05SX1BBR0VTCTEwMjQKKworc3RhdGlj IGludCBwYXJzZV9pbnQoY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIJKmVuZHB0cjsKKwls b25nCXJldCA9IHN0cnRvbChzdHIsICZlbmRwdHIsIDApOworCWlmICgqZW5kcHRyICE9ICdc MCcpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbZXJyb3JdIHN0cnRvbCgpIGZhaWxlZDogcGFy c2UgZXJyb3I6ICVzXG4iLCBlbmRwdHIpOworCQlleGl0KDEpOworCX0KKworCWlmIChlcnJu byA9PSBFUkFOR0UpCisJCWZwcmludGYoc3RkZXJyLCAiW3dhcm5pbmddIHN0cnRvbCgpIG91 dCBvZiByYW5nZVxuIik7CisKKwlpZiAocmV0ID4gSU5UX01BWCB8fCByZXQgPCBJTlRfTUlO KSB7CisJCWZwcmludGYoc3RkZXJyLCAiW3dhcm5pbmddIHBhcnNlX2ludCgpIG91dCBvZiBy YW5nZVxuIik7CisJCXJldCA9IChyZXQgPiAwKSA/IElOVF9NQVggOiBJTlRfTUlOOworCX0K KworCXJldHVybiAoaW50KSByZXQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoq YXJndikKK3sKKwljaGFyCSptZW07CisJaW50CQlwYWdlX3NpemUgPSBudW1hX3BhZ2VzaXpl KCk7CisJaW50CQlub2RlID0gMDsKKwlpbnQJCW5yX3BhZ2VzID0gREVGQVVMVF9OUl9QQUdF UzsKKworCWlmIChudW1hX2F2YWlsYWJsZSgpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwg Im51bWEgaXMgbm90IGF2YWlsYWJsZSIpOworCQlleGl0KDEpOworCX0KKworCWlmIChhcmdj ID4gMSkKKwkJbm9kZSA9IHBhcnNlX2ludChhcmd2WzFdKTsKKwlpZiAoYXJnYyA+IDIpCisJ CW5yX3BhZ2VzID0gcGFyc2VfaW50KGFyZ3ZbMl0pOworCQorCW1lbSA9IG51bWFfYWxsb2Nf b25ub2RlKHBhZ2Vfc2l6ZSwgbm9kZSk7CisKKwkvKiBTdG9yZSB0aGUgcG9saWN5IG9mIHRo ZSBuZXdseSBhbGxvY2F0ZWQgYXJlYSAqLworCXVuc2lnbmVkIGxvbmcJbm9kZW1hc2s7CisJ aW50CQkJCW1vZGU7CisJaW50CQkJCW5yX25vZGVzID0gbnVtYV9udW1fcG9zc2libGVfbm9k ZXMoKTsKKwlpZiAoZ2V0X21lbXBvbGljeSgmbW9kZSwgJm5vZGVtYXNrLCBucl9ub2Rlcywg bWVtLAorCQkJCQkgIE1QT0xfRl9OT0RFIHwgTVBPTF9GX0FERFIpIDwgMCkgeworCQlwZXJy b3IoImdldF9tZW1wb2xpY3koKSBmYWlsZWQiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBQ cmludCBzb21lIGluZm8gKi8KKwlwcmludGYoIlBhZ2Ugc2l6ZTogJWRcbiIsIHBhZ2Vfc2l6 ZSk7CisJcHJpbnRmKCJQYWdlcyByZWFsbG9jJ2VkOiAlZFxuIiwgbnJfcGFnZXMpOworCXBy aW50ZigiQWxsb2NhdGUgZGF0YSBpbiBub2RlOiAlZFxuIiwgbm9kZSk7CisKKwkvKiBSZXF1 ZXN0IHBhZ2VzIHVudGlsIGEgcmVhbGxvYyBtb3ZlcyB0aGUgZGF0YSAqLworCWludCBpOwor CWludCBucl9pbnBsYWNlID0gMDsKKwlpbnQgbnJfbW92ZWQgICA9IDA7CisJZm9yIChpID0g MDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJLyogRW5sYXJnZSBtZW0gd2l0aCBvbmUgbW9y ZSBwYWdlICovCisJCWNoYXIJKm5ld19tZW0gPSBudW1hX3JlYWxsb2MobWVtLCAoaSsxKSpw YWdlX3NpemUsIChpKzIpKnBhZ2Vfc2l6ZSk7CisJCWlmICghbmV3X21lbSkgeworCQkJcGVy cm9yKCJudW1hX3JlYWxsb2MoKSBmYWlsZWQiKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlp ZiAobmV3X21lbSA9PSBtZW0pCisJCQkrK25yX2lucGxhY2U7CisJCWVsc2UKKwkJCSsrbnJf bW92ZWQ7CisJCW1lbSA9IG5ld19tZW07CisKKwkJLyogQ2hlY2sgdGhlIHBvbGljeSBvZiB0 aGUgcmVhbGxvYydlZCBhcmVhICovCisJCXVuc2lnbmVkIGxvbmcJcmVhbGxvY19ub2RlbWFz azsKKwkJaW50CQkJCXJlYWxsb2NfbW9kZTsKKwkJaWYgKGdldF9tZW1wb2xpY3koJnJlYWxs b2NfbW9kZSwgJnJlYWxsb2Nfbm9kZW1hc2ssCisJCQkJCQkgIG5yX25vZGVzLCBtZW0sIE1Q T0xfRl9OT0RFIHwgTVBPTF9GX0FERFIpIDwgMCkgeworCQkJcGVycm9yKCJnZXRfbWVtcG9s aWN5KCkgZmFpbGVkIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJYXNzZXJ0KHJlYWxsb2Nf bm9kZW1hc2sgPT0gbm9kZW1hc2sgJiYKKwkJCSAgIHJlYWxsb2NfbW9kZSA9PSBtb2RlICYm ICJwb2xpY3kgY2hhbmdlZCIpOworCX0KKworCS8qIFNocmluayB0byB0aGUgb3JpZ2luYWwg c2l6ZSAqLworCW1lbSA9IG51bWFfcmVhbGxvYyhtZW0sIChucl9wYWdlcyArIDEpKnBhZ2Vf c2l6ZSwgcGFnZV9zaXplKTsKKwlpZiAoIW1lbSkgeworCQlwZXJyb3IoIm51bWFfcmVhbGxv YygpIGZhaWxlZCIpOworCQlleGl0KDEpOworCX0KKworCW51bWFfZnJlZShtZW0sIHBhZ2Vf c2l6ZSk7CisJcHJpbnRmKCJJbi1wbGFjZSByZWFsbG9jczogJWRcbiIsIG5yX2lucGxhY2Up OworCXByaW50ZigiTW92ZWQgcmVhbGxvY3M6ICVkXG4iLCBucl9tb3ZlZCk7CisJcmV0dXJu IDA7Cit9CmRpZmYgLXVyTiBudW1hY3RsLTIuMC42LXJjNC1vcmlnL3ZlcnNpb25zLmxkc2Ny aXB0IG51bWFjdGwtMi4wLjYtcmM0L3ZlcnNpb25zLmxkc2NyaXB0Ci0tLSBudW1hY3RsLTIu MC42LXJjNC1vcmlnL3ZlcnNpb25zLmxkc2NyaXB0CTIwMTAtMTItMjIgMTM6Mjk6NTAuMDAw MDAwMDAwICswMjAwCisrKyBudW1hY3RsLTIuMC42LXJjNC92ZXJzaW9ucy5sZHNjcmlwdAky MDEwLTEyLTIyIDIwOjQxOjIyLjAwMDAwMDAwMCArMDIwMApAQCAtODcsNiArODcsNyBAQAog ICAgIG51bWFfYWxsb2NfaW50ZXJsZWF2ZWRfc3Vic2V0OwogICAgIG51bWFfYWxsb2NfbG9j YWw7CiAgICAgbnVtYV9hbGxvY19vbm5vZGU7CisgICAgbnVtYV9yZWFsbG9jOwogICAgIG51 bWFfYWxsb2NhdGVfY3B1bWFzazsKICAgICBudW1hX2FsbG9jYXRlX25vZGVtYXNrOwogICAg IG51bWFfYXZhaWxhYmxlOwo= --------------030608080308010701040401 Content-Type: application/pgp-keys; name="0x17A67A9C.asc" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0x17A67A9C.asc" -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.9 (GNU/Linux) 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 qgCdEHEBN5VcuGHZ5q/BfHeSXLcApFY=3D =3DMPxZ -----END PGP PUBLIC KEY BLOCK----- --------------030608080308010701040401-- --------------enigC045DF3BB2C548C458310A47 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAk0gt+YACgkQHUHhfRemepxFNgCgoM8SlyREpOlWK41+J7+kzfSn nAkAoOZr7naLFFksiDaBsum18gOO0aUB =ZwE2 -----END PGP SIGNATURE----- --------------enigC045DF3BB2C548C458310A47--