From owner-freebsd-hackers@FreeBSD.ORG Thu Feb 13 09:05:32 2014 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id BA1EC989 for ; Thu, 13 Feb 2014 09:05:32 +0000 (UTC) Received: from mail-yh0-x22e.google.com (mail-yh0-x22e.google.com [IPv6:2607:f8b0:4002:c01::22e]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 7D6A81AF2 for ; Thu, 13 Feb 2014 09:05:32 +0000 (UTC) Received: by mail-yh0-f46.google.com with SMTP id v1so9736388yhn.19 for ; Thu, 13 Feb 2014 01:05:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=SnFAYCrURSVl8JCJVNQduXL0RfmLEjq3GtLltm6/OUU=; b=exIWAp+tYAauuKmfHkwoLeGUgcoPaOIcwpczW37JCZPNNCIlF4ltYZBY2XL9kxYf/8 9CO4gimI3UFn05j8gVqJfFfvR+eMuH8D5FsjqryHEn6Sv4zKTLCmCEs1V1fSawv7sGwT CERWwXn/I8Fb+yWlGhrShZWDD1POxWHE3EKFT4+37uh1lNzIEYT+uMaFDx9N6IYEpXsM C+IkAsjJOkT5+8t7KKwhU6STcc3VGwf7BxI5dODmHrNSbmT3J6CR6K/sSPJykhnmutaB FGWwONqMvC2CP3LYPPDhpPEuTU6mQuuiNUQXpaoILA9p/VjUEmSnWq+ChFcFeZGFAXDu c3DA== MIME-Version: 1.0 X-Received: by 10.236.101.227 with SMTP id b63mr225473yhg.37.1392282331706; Thu, 13 Feb 2014 01:05:31 -0800 (PST) Received: by 10.170.43.129 with HTTP; Thu, 13 Feb 2014 01:05:31 -0800 (PST) Date: Thu, 13 Feb 2014 11:05:31 +0200 Message-ID: Subject: Receiving jumbo frames From: Viktor Penkoff To: freebsd-hackers@freebsd.org X-Mailman-Approved-At: Thu, 13 Feb 2014 13:20:53 +0000 Content-Type: text/plain; charset=windows-1251 Content-Transfer-Encoding: quoted-printable X-Content-Filtered-By: Mailman/MimeDel 2.1.17 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Feb 2014 09:05:32 -0000 Hi, folks! I'm writing an extension functionality to not-yet published network driver. I'm receiving the typical ethernet frames without problems. Considering the datasheet of the device, I'm capable of receiving jumbo frames. When I try to do that, e.g. to send jumbo frame of 8000 bytes, I'm receiving only a limited count of them - 105, then the kernel crashes with the following message: "panic: vm_fault: fault on nofault entry, addr: cfcec000". I have inspected a kernel dump with kgdb and the problem occurs at the function bus_dmamap_sync. The line that the panic happens is in a standard invoking receive interrupt function. Packet data is stored in memory buffers, with any single packet spanning multiple buffers if necessary. The buffers are allocated by the CPU and are managed through chained descriptor lists. When I'm sending jumbo packets, e.g. 8008 bytes in size each, due to live debugging with jtag and kgdb, I've got the following information for the mbuf: % ping -I eth0 -c 1 -s 8000 -M dont A.B.C.D -v -p ff {m_hdr =3D {mh_next =3D 0x0, mh_nextpkt =3D 0x0, mh_data =3D 0xc3d41800 "", mh_len =3D 2048, mh_flags =3D 3, mh_type =3D 1, pad =3D "\000"}, M_dat = =3D { MH =3D {MH_pkthdr =3D {rcvif =3D 0x0, header =3D 0x0, len =3D 2048, flo= wid =3D 0, csum_flags =3D 0, csum_data =3D 0, tso_segsz =3D 0, PH_vt =3D { vt_vtag =3D 0, vt_nrecs =3D 0}, tags =3D {slh_first =3D 0x0}, dsa_tag =3D {0, 0}}, MH_dat =3D {MH_ext =3D {ext_buf =3D 0xc3d41800= "", ext_free =3D 0, ext_arg1 =3D 0x0, ext_arg2 =3D 0x0, ext_size =3D = 2048, ref_cnt =3D 0xc3d3f244, ext_type =3D 6}, In this case, the given mbuf must occupy ~4 descriptors, IMO. Following the next pointer in the descriptor list shows that the CPU has an ownership. Nevertheless, =F2he byte count of the received frame shows th= at 8056 bytes are received. More interesting is the fact that an echo reply is given back. But after a constant count of received packets, the kernel hangs. Some background information: To enable the jumbo frame, one must set the appropriate register. At the software level, a ring buffer with the descriptors is implemented. The device, under which the driver runs, is arm-based. The freebsd version is 8.0. The device uses SerialDMA queues for transmitting and receiving. To receive packets, the CPU must perform the following: 1. Prepare a linked list of descriptors 2. Configure a given queue with the address of the first descriptor in the list, 3. enable SerialDMA; With the transmission - I don't have any problems. The logic is the same as by the reception of packets - ring buffer with descriptors. Any ideas what can cause this type of crashes?