Date: Wed, 2 Nov 2011 12:56:29 -0700 From: Navdeep Parhar <nparhar@gmail.com> To: FreeBSD Hackers <freebsd-hackers@freebsd.org> Subject: incorrect parent refcounting in subr_firmware.c? Message-ID: <CAPFoGT9bLzAStkUnSfsBm0F6gmGuCM6kQRHQxa%2Bbsah4mQvQVw@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
--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 <bsd.kmod.mk> "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--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAPFoGT9bLzAStkUnSfsBm0F6gmGuCM6kQRHQxa%2Bbsah4mQvQVw>