From owner-freebsd-hackers@FreeBSD.ORG Wed Nov 2 20:22:14 2011 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 85AD3106566B for ; Wed, 2 Nov 2011 20:22:14 +0000 (UTC) (envelope-from nparhar@gmail.com) Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com [209.85.216.182]) by mx1.freebsd.org (Postfix) with ESMTP id 4363B8FC0C for ; Wed, 2 Nov 2011 20:22:13 +0000 (UTC) Received: by qyg14 with SMTP id 14so778641qyg.13 for ; Wed, 02 Nov 2011 13:22:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; bh=h9k1mxEaKy/afygU9Nsvtah+l1pGmE3o3atkt5LIzu4=; b=sY1uj+DOtlyPyRKrFbePqg9h52bsLNBCSVHpWcn7c8SOdh6wO/ZGS/ZSwzlqm06GIj rxnZ8O+29Ldz0d9gEX2f/ZE21ketqGOBP7ZV/z4xLp1ZMOQOb0ESlIP3nj0/j5qtbX1Z YQ7QXvyxrncjkQhOtoh3HAB3H++eOzF4Vulak= MIME-Version: 1.0 Received: by 10.229.47.137 with SMTP id n9mr286172qcf.137.1320263789534; Wed, 02 Nov 2011 12:56:29 -0700 (PDT) Received: by 10.229.231.203 with HTTP; Wed, 2 Nov 2011 12:56:29 -0700 (PDT) Date: Wed, 2 Nov 2011 12:56:29 -0700 Message-ID: From: Navdeep Parhar To: FreeBSD Hackers Content-Type: multipart/mixed; boundary=0016364183ad2f5ff804b0c5de25 Subject: incorrect parent refcounting in subr_firmware.c? X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 20:22:14 -0000 --0016364183ad2f5ff804b0c5de25 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable I built a KLD with multiple firmware images, as shown here: KMOD=3Dfoo FIRMWS=3D foo.bin:foo:1.0.0.0 FIRMWS+=3Dbar.bin:bar:1.0.0.0 FIRMWS+=3D ... .include "foo" is the parent firmware and a firmware_get(foo) can autoload the KLD. =A0"bar" and the rest are available only if the KLD is loaded (by whatever means). =A0This is reasonable and works as expected. =A0But if I just get and then put "foo" back, the KLD is not unloaded automatically. The problem is that a reference is placed on the parent firmware when the other firmwares are registered (during module load). =A0I think this reference should be placed during firmware_get on the child. What do people think about the attached patch? =A0It fixes things for me. Regards, Navdeep --0016364183ad2f5ff804b0c5de25 Content-Type: application/octet-stream; name="fw.diff" Content-Disposition: attachment; filename="fw.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_guiqvwoa0 ZGlmZiAtLWdpdCBhL3N5cy9rZXJuL3N1YnJfZmlybXdhcmUuYyBiL3N5cy9rZXJuL3N1YnJfZmly bXdhcmUuYwotLS0gYS9zeXMva2Vybi9zdWJyX2Zpcm13YXJlLmMKKysrIGIvc3lzL2tlcm4vc3Vi cl9maXJtd2FyZS5jCkBAIC0xOTgsMTAgKzE5OCw4IEBACiAJZnJwLT5mdy5kYXRhID0gZGF0YTsK IAlmcnAtPmZ3LmRhdGFzaXplID0gZGF0YXNpemU7CiAJZnJwLT5mdy52ZXJzaW9uID0gdmVyc2lv bjsKLQlpZiAocGFyZW50ICE9IE5VTEwpIHsKKwlpZiAocGFyZW50ICE9IE5VTEwpCiAJCWZycC0+ cGFyZW50ID0gUFJJVl9GVyhwYXJlbnQpOwotCQlmcnAtPnBhcmVudC0+cmVmY250Kys7Ci0JfQog CW10eF91bmxvY2soJmZpcm13YXJlX210eCk7CiAJaWYgKGJvb3R2ZXJib3NlKQogCQlwcmludGYo ImZpcm13YXJlOiAnJXMnIHZlcnNpb24gJXU6ICV6dSBieXRlcyBsb2FkZWQgYXQgJXBcbiIsCkBA IC0yMzUsOCArMjMzLDYgQEAKIAl9ICBlbHNlIHsKIAkJbGlua2VyX2ZpbGVfdCB4ID0gZnAtPmZp bGU7CS8qIHNhdmUgdmFsdWUgKi8KIAotCQlpZiAoZnAtPnBhcmVudCAhPSBOVUxMKQkvKiByZWxl YXNlIHBhcmVudCByZWZlcmVuY2UgKi8KLQkJCWZwLT5wYXJlbnQtPnJlZmNudC0tOwogCQkvKgog CQkgKiBDbGVhciB0aGUgd2hvbGUgZW50cnkgd2l0aCBiemVybyB0byBtYWtlIHN1cmUgd2UKIAkJ ICogZG8gbm90IGZvcmdldCBhbnl0aGluZy4gVGhlbiByZXN0b3JlICdmaWxlJyB3aGljaCBpcwpA QCAtMzQxLDYgKzMzNyw4IEBACiAJCXJldHVybiBOVUxMOwogCX0KIGZvdW5kOgkJCQkvKiBjb21t b24gZXhpdCBwb2ludCBvbiBzdWNjZXNzICovCisJaWYgKGZwLT5yZWZjbnQgPT0gMCAmJiBmcC0+ cGFyZW50ICE9IE5VTEwpCisJCWZwLT5wYXJlbnQtPnJlZmNudCsrOwogCWZwLT5yZWZjbnQrKzsK IAltdHhfdW5sb2NrKCZmaXJtd2FyZV9tdHgpOwogCXJldHVybiAmZnAtPmZ3OwpAQCAtMzYzLDYg KzM2MSw4IEBACiAJbXR4X2xvY2soJmZpcm13YXJlX210eCk7CiAJZnAtPnJlZmNudC0tOwogCWlm IChmcC0+cmVmY250ID09IDApIHsKKwkJaWYgKGZwLT5wYXJlbnQgIT0gTlVMTCkKKwkJCWZwLT5w YXJlbnQtPnJlZmNudC0tOwogCQlpZiAoZmxhZ3MgJiBGSVJNV0FSRV9VTkxPQUQpCiAJCQlmcC0+ ZmxhZ3MgfD0gRldfVU5MT0FEOwogCQlpZiAoZnAtPmZpbGUpCg== --0016364183ad2f5ff804b0c5de25--