Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Mar 2012 21:53:13 -0500
From:      Patrick Kelsey <kelsey@ieee.org>
To:        freebsd-mips@freebsd.org
Subject:   [PATCH] Fix for using NFS root with if_arge
Message-ID:  <CAD44qMVKyL-Fdrp-Tf3o9HXMH_UudCSfEOKnHz3nK%2BaqMwW6Pw@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--20cf3079b89e3b0e4804bada9cb0
Content-Type: text/plain; charset=ISO-8859-1

This patch fixes an issue I encountered using an NFS root with an
ar71xx-based MikroTik RouterBoard 450G on -current where the kernel fails
to contact a DHCP/BOOTP server via if_arge when it otherwise should be able
to.  This may be the same issue that Monthadar Al Jaberi reported against
an RSPRO on 6 March, as the signature is the same:

%%%

DHCP/BOOTP timeout for server 255.255.255.255
DHCP/BOOTP timeout for server 255.255.255.255
DHCP/BOOTP timeout for server 255.255.255.255
.
.
.
DHCP/BOOTP timeout for server 255.255.255.255
DHCP/BOOTP timeout for server 255.255.255.255
arge0: initialization failed: no memory for rx buffers
DHCP/BOOTP timeout for server 255.255.255.255
arge0: initialization failed: no memory for rx buffers

%%%

The primary issue that I found is that the DHCP/BOOTP message that
bootpc_call() is sending never makes it onto the wire, which I believe is
due to the following:

- Last December, a change was made to the ifioctl that bootpc_call() uses
to adjust the netmask around the sosend().

- The new ioctl (SIOCAIFADDR) performs an if_init when invoked, whereas the
old one (SIOCSIFNETMASK) did not.

- if_arge maintains its own sense of link state in sc->arge_link_status.

- On a single-phy interface, sc->arge_link_status is initialized to 0 in
arge_init_locked().

- sc->arge_link_status remains 0 until a phy state change notification
causes arge_link_task to run, notice the link is up, and set it to 1.

- The inits caused by the ifioctls in bootpc_call are reinitializing the
interface, but not the phy, so sc->arge_link_status goes to 0 and remains
there.

- arge_start_locked() always sees sc->arge_link_status == 0 and returns
without queuing anything.


The attached patch changes arge_init_locked() such that in the single-phy
case, instead of initializing sc->arge_link_status to 0, it runs
arge_link_task() to set it according to the current phy state.  This change
has allowed my setup to mount an NFS root successfully.

I think there is a secondary issue here regarding the "arge0:
initialization failed: no memory for rx buffers".  I have not dug into it
completely yet, but at first blush it seems that arge_stop() leaks mbufs
from the rx ring, so after some number of arge_init() calls (in this case
triggered by the DHCP/BOOTP message timeouts), all mbufs are exhausted.

-Patrick

--20cf3079b89e3b0e4804bada9cb0
Content-Type: application/octet-stream; name="if_arge_link_status.diff"
Content-Disposition: attachment; filename="if_arge_link_status.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gzm26qek0

SW5kZXg6IG1pcHMvYXRoZXJvcy9pZl9hcmdlLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvYXRo
ZXJvcy9pZl9hcmdlLmMJKHJldmlzaW9uIDIzMjcyNSkKKysrIHN5cy9taXBzL2F0aGVyb3MvaWZf
YXJnZS5jCSh3b3JraW5nIGNvcHkpCkBAIC0xMTAsNiArMTEwLDcgQEAKIHN0YXRpYyB2b2lkIGFy
Z2VfaW5pdCh2b2lkICopOwogc3RhdGljIHZvaWQgYXJnZV9pbml0X2xvY2tlZChzdHJ1Y3QgYXJn
ZV9zb2Z0YyAqKTsKIHN0YXRpYyB2b2lkIGFyZ2VfbGlua190YXNrKHZvaWQgKiwgaW50KTsKK3N0
YXRpYyB2b2lkIGFyZ2VfdXBkYXRlX2xpbmtfbG9ja2VkKHN0cnVjdCBhcmdlX3NvZnRjICpzYyk7
CiBzdGF0aWMgdm9pZCBhcmdlX3NldF9wbGwoc3RydWN0IGFyZ2Vfc29mdGMgKiwgaW50LCBpbnQp
Owogc3RhdGljIGludCBhcmdlX21paWJ1c19yZWFkcmVnKGRldmljZV90LCBpbnQsIGludCk7CiBz
dGF0aWMgdm9pZCBhcmdlX21paWJ1c19zdGF0Y2hnKGRldmljZV90KTsKQEAgLTY4MywxMyArNjk0
LDIwIEBACiBhcmdlX2xpbmtfdGFzayh2b2lkICphcmcsIGludCBwZW5kaW5nKQogewogCXN0cnVj
dCBhcmdlX3NvZnRjCSpzYzsKKwlzYyA9IChzdHJ1Y3QgYXJnZV9zb2Z0YyAqKWFyZzsKKworCUFS
R0VfTE9DSyhzYyk7CisJYXJnZV91cGRhdGVfbGlua19sb2NrZWQoc2MpOworCUFSR0VfVU5MT0NL
KHNjKTsKK30KKworc3RhdGljIHZvaWQKK2FyZ2VfdXBkYXRlX2xpbmtfbG9ja2VkKHN0cnVjdCBh
cmdlX3NvZnRjICpzYykKK3sKIAlzdHJ1Y3QgbWlpX2RhdGEJCSptaWk7CiAJc3RydWN0IGlmbmV0
CQkqaWZwOwogCXVpbnQzMl90CQltZWRpYSwgZHVwbGV4OwogCi0Jc2MgPSAoc3RydWN0IGFyZ2Vf
c29mdGMgKilhcmc7Ci0KLQlBUkdFX0xPQ0soc2MpOwogCW1paSA9IGRldmljZV9nZXRfc29mdGMo
c2MtPmFyZ2VfbWlpYnVzKTsKIAlpZnAgPSBzYy0+YXJnZV9pZnA7CiAJaWYgKG1paSA9PSBOVUxM
IHx8IGlmcCA9PSBOVUxMIHx8CkBAIC03MDcsMTAgKzcyNSwxMCBAQAogCQkJZHVwbGV4ID0gbWlp
LT5taWlfbWVkaWFfYWN0aXZlICYgSUZNX0dNQVNLOwogCQkJYXJnZV9zZXRfcGxsKHNjLCBtZWRp
YSwgZHVwbGV4KTsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXNjLT5hcmdlX2xpbmtfc3Rh
dHVzID0gMDsKKwl9CiAKLQlBUkdFX1VOTE9DSyhzYyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC04
NDYsNyArODY0LDYgQEAKIAogCiAJaWYgKHNjLT5hcmdlX21paWJ1cykgewotCQlzYy0+YXJnZV9s
aW5rX3N0YXR1cyA9IDA7CiAJCW1paSA9IGRldmljZV9nZXRfc29mdGMoc2MtPmFyZ2VfbWlpYnVz
KTsKIAkJbWlpX21lZGlhY2hnKG1paSk7CiAJfQpAQCAtODYwLDggKzg3NywxMCBAQAogCWlmcC0+
aWZfZHJ2X2ZsYWdzIHw9IElGRl9EUlZfUlVOTklORzsKIAlpZnAtPmlmX2Rydl9mbGFncyAmPSB+
SUZGX0RSVl9PQUNUSVZFOwogCi0JaWYgKHNjLT5hcmdlX21paWJ1cykKKwlpZiAoc2MtPmFyZ2Vf
bWlpYnVzKSB7CiAJCWNhbGxvdXRfcmVzZXQoJnNjLT5hcmdlX3N0YXRfY2FsbG91dCwgaHosIGFy
Z2VfdGljaywgc2MpOworCQlhcmdlX3VwZGF0ZV9saW5rX2xvY2tlZChzYyk7CisJfQogCiAJQVJH
RV9XUklURShzYywgQVI3MVhYX0RNQV9UWF9ERVNDLCBBUkdFX1RYX1JJTkdfQUREUihzYywgMCkp
OwogCUFSR0VfV1JJVEUoc2MsIEFSNzFYWF9ETUFfUlhfREVTQywgQVJHRV9SWF9SSU5HX0FERFIo
c2MsIDApKTsK
--20cf3079b89e3b0e4804bada9cb0--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAD44qMVKyL-Fdrp-Tf3o9HXMH_UudCSfEOKnHz3nK%2BaqMwW6Pw>