From owner-freebsd-arm@freebsd.org Fri Jul 17 18:38:26 2015 Return-Path: Delivered-To: freebsd-arm@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 78F479A4848 for ; Fri, 17 Jul 2015 18:38:26 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from phabric-backend.isc.freebsd.org (phabric-backend.isc.freebsd.org [IPv6:2001:4f8:3:ffe0:406a:0:50:2]) by mx1.freebsd.org (Postfix) with ESMTP id 5FCC11222 for ; Fri, 17 Jul 2015 18:38:26 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by phabric-backend.isc.freebsd.org (Postfix, from userid 1346) id 5AAD0E0EE; Fri, 17 Jul 2015 18:38:26 +0000 (UTC) Date: Fri, 17 Jul 2015 18:38:26 +0000 To: freebsd-arm@freebsd.org From: "zbb (Zbigniew Bodek)" Reply-to: D3121+327+663142b8abc1b1a2@FreeBSD.org Subject: [Differential] [Request, 32 lines] D3121: Don't allow malloc() to wait for resource while holding a lock in ITS Message-ID: X-Priority: 3 Thread-Topic: D3121: Don't allow malloc() to wait for resource while holding a lock in ITS X-Herald-Rules: <28>, <31>, <32>, <34> X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Thread-Index: MzQzYWEyZTJmMDEzOTI1ZWU3ODgyYTA3ZWJj Precedence: bulk X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , , , MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_9a72bb892bcba53faec79e1a568f0eb4" X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.20 List-Id: "Porting FreeBSD to ARM processors." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jul 2015 18:38:26 -0000 --b1_9a72bb892bcba53faec79e1a568f0eb4 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: 8bit zbb created this revision. zbb added reviewers: emaste, andrew, wma_semihalf.com, imp, ian. zbb added a subscriber: freebsd-arm-list. zbb set the repository for this revision to rS FreeBSD src repository. Herald added subscribers: emaste, andrew, imp. REVISION SUMMARY malloc() should not go to sleep in case of lack of resource while the kernel thread is holding a non-sleepable lock. - change malloc() flags to M_NOWAIT in such cases - implement lpi_free_chunk() routine since it will be needed when ITT allocation fails in its_device_alloc_locked() - do not increase verbosity of this code since upper layers will communicate an error if the interrupt setup fails Obtained from: Semihalf Sponsored by: The FreeBSD Foundation REPOSITORY rS FreeBSD src repository REVISION DETAIL https://reviews.freebsd.org/D3121 AFFECTED FILES sys/arm64/arm64/gic_v3_its.c CHANGE DETAILS diff --git a/sys/arm64/arm64/gic_v3_its.c b/sys/arm64/arm64/gic_v3_its.c --- a/sys/arm64/arm64/gic_v3_its.c +++ b/sys/arm64/arm64/gic_v3_its.c @@ -795,6 +795,26 @@ } static void +lpi_free_chunk(struct gic_v3_its_softc *sc, struct lpi_chunk *lpic) +{ + int start, end; + uint8_t *bitmap; + + bitmap = (uint8_t *)sc->its_lpi_bitmap; + + KASSERT((lpic->lpi_free == lpic->lpi_num), + ("Trying to free LPI chunk that is still in use.\n")); + + /* First bit of this chunk in a global bitmap */ + start = lpic->lpi_base - GIC_FIRST_LPI; + /* and last bit of this chunk... */ + end = start + lpic->lpi_num - 1; + + /* Finally free this chunk */ + bit_nclear(bitmap, start, end); +} + +static void lpi_configure(struct gic_v3_its_softc *sc, struct its_dev *its_dev, uint32_t lpinum, boolean_t unmask) { @@ -1303,7 +1323,10 @@ devid = PCI_DEVID(pci_dev); /* There was no previously created device. Create one now */ - newdev = malloc(sizeof(*newdev), M_GIC_V3_ITS, (M_WAITOK | M_ZERO)); + newdev = malloc(sizeof(*newdev), M_GIC_V3_ITS, (M_NOWAIT | M_ZERO)); + if (newdev == NULL) + return (NULL); + newdev->pci_dev = pci_dev; newdev->devid = devid; @@ -1321,7 +1344,12 @@ */ newdev->itt = (vm_offset_t)contigmalloc( roundup2(roundup2(nvecs, 2) * esize, 0x100), M_GIC_V3_ITS, - (M_WAITOK | M_ZERO), 0, ~0UL, 0x100, 0); + (M_NOWAIT | M_ZERO), 0, ~0UL, 0x100, 0); + if (newdev->itt == 0) { + lpi_free_chunk(sc, &newdev->lpis); + free(newdev, M_GIC_V3_ITS); + return (NULL); + } /* * XXX ARM64TODO: Currently all interrupts are going EMAIL PREFERENCES https://reviews.freebsd.org/settings/panel/emailpreferences/ To: zbb, emaste, andrew, wma_semihalf.com, imp, ian Cc: imp, andrew, freebsd-arm-list, emaste --b1_9a72bb892bcba53faec79e1a568f0eb4 Content-Type: text/x-patch; charset=utf-8; name="D3121.7056.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D3121.7056.patch" ZGlmZiAtLWdpdCBhL3N5cy9hcm02NC9hcm02NC9naWNfdjNfaXRzLmMgYi9zeXMvYXJtNjQvYXJt NjQvZ2ljX3YzX2l0cy5jCi0tLSBhL3N5cy9hcm02NC9hcm02NC9naWNfdjNfaXRzLmMKKysrIGIv c3lzL2FybTY0L2FybTY0L2dpY192M19pdHMuYwpAQCAtNzk1LDYgKzc5NSwyNiBAQAogfQogCiBz dGF0aWMgdm9pZAorbHBpX2ZyZWVfY2h1bmsoc3RydWN0IGdpY192M19pdHNfc29mdGMgKnNjLCBz dHJ1Y3QgbHBpX2NodW5rICpscGljKQoreworCWludCBzdGFydCwgZW5kOworCXVpbnQ4X3QgKmJp dG1hcDsKKworCWJpdG1hcCA9ICh1aW50OF90ICopc2MtPml0c19scGlfYml0bWFwOworCisJS0FT U0VSVCgobHBpYy0+bHBpX2ZyZWUgPT0gbHBpYy0+bHBpX251bSksCisJICAgICgiVHJ5aW5nIHRv IGZyZWUgTFBJIGNodW5rIHRoYXQgaXMgc3RpbGwgaW4gdXNlLlxuIikpOworCisJLyogRmlyc3Qg Yml0IG9mIHRoaXMgY2h1bmsgaW4gYSBnbG9iYWwgYml0bWFwICovCisJc3RhcnQgPSBscGljLT5s cGlfYmFzZSAtIEdJQ19GSVJTVF9MUEk7CisJLyogYW5kIGxhc3QgYml0IG9mIHRoaXMgY2h1bmsu Li4gKi8KKwllbmQgPSBzdGFydCArIGxwaWMtPmxwaV9udW0gLSAxOworCisJLyogRmluYWxseSBm cmVlIHRoaXMgY2h1bmsgKi8KKwliaXRfbmNsZWFyKGJpdG1hcCwgc3RhcnQsIGVuZCk7Cit9CisK K3N0YXRpYyB2b2lkCiBscGlfY29uZmlndXJlKHN0cnVjdCBnaWNfdjNfaXRzX3NvZnRjICpzYywg c3RydWN0IGl0c19kZXYgKml0c19kZXYsCiAgICAgdWludDMyX3QgbHBpbnVtLCBib29sZWFuX3Qg dW5tYXNrKQogewpAQCAtMTMwMyw3ICsxMzIzLDEwIEBACiAJZGV2aWQgPSBQQ0lfREVWSUQocGNp X2Rldik7CiAKIAkvKiBUaGVyZSB3YXMgbm8gcHJldmlvdXNseSBjcmVhdGVkIGRldmljZS4gQ3Jl YXRlIG9uZSBub3cgKi8KLQluZXdkZXYgPSBtYWxsb2Moc2l6ZW9mKCpuZXdkZXYpLCBNX0dJQ19W M19JVFMsIChNX1dBSVRPSyB8IE1fWkVSTykpOworCW5ld2RldiA9IG1hbGxvYyhzaXplb2YoKm5l d2RldiksIE1fR0lDX1YzX0lUUywgKE1fTk9XQUlUIHwgTV9aRVJPKSk7CisJaWYgKG5ld2RldiA9 PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCiAJbmV3ZGV2LT5wY2lfZGV2ID0gcGNpX2RldjsK IAluZXdkZXYtPmRldmlkID0gZGV2aWQ7CiAKQEAgLTEzMjEsNyArMTM0NCwxMiBAQAogCSAqLwog CW5ld2Rldi0+aXR0ID0gKHZtX29mZnNldF90KWNvbnRpZ21hbGxvYygKIAkgICAgcm91bmR1cDIo cm91bmR1cDIobnZlY3MsIDIpICogZXNpemUsIDB4MTAwKSwgTV9HSUNfVjNfSVRTLAotCSAgICAo TV9XQUlUT0sgfCBNX1pFUk8pLCAwLCB+MFVMLCAweDEwMCwgMCk7CisJICAgIChNX05PV0FJVCB8 IE1fWkVSTyksIDAsIH4wVUwsIDB4MTAwLCAwKTsKKwlpZiAobmV3ZGV2LT5pdHQgPT0gMCkgewor CQlscGlfZnJlZV9jaHVuayhzYywgJm5ld2Rldi0+bHBpcyk7CisJCWZyZWUobmV3ZGV2LCBNX0dJ Q19WM19JVFMpOworCQlyZXR1cm4gKE5VTEwpOworCX0KIAogCS8qCiAJICogWFhYIEFSTTY0VE9E TzogQ3VycmVudGx5IGFsbCBpbnRlcnJ1cHRzIGFyZSBnb2luZwoK --b1_9a72bb892bcba53faec79e1a568f0eb4--