From owner-freebsd-current@FreeBSD.ORG Mon Oct 8 06:21:58 2007 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 396F316A419 for ; Mon, 8 Oct 2007 06:21:58 +0000 (UTC) (envelope-from pyunyh@gmail.com) Received: from rv-out-0910.google.com (rv-out-0910.google.com [209.85.198.186]) by mx1.freebsd.org (Postfix) with ESMTP id EFC1C13C45A for ; Mon, 8 Oct 2007 06:21:57 +0000 (UTC) (envelope-from pyunyh@gmail.com) Received: by rv-out-0910.google.com with SMTP id l15so589688rvb for ; Sun, 07 Oct 2007 23:21:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:received:received:date:from:to:subject:message-id:reply-to:mime-version:content-type:content-disposition:user-agent; bh=YHYewwzEmB4NSpZn3NQdZAwdLMmB0pjYFR6SsVAfBYg=; b=YCcW5ur2Z5MjbqWVeYubfLRO2JpjmcuexdHcgImNRe95mKoLO7kBImJnM8Y67LQY5qU09Nkwkf64OV3P9jMz0hjBcZkrxRT/XXepowvT4MP5SkML6i2Nj5QyFqv8oB3mhPa6swb4Tibc69tdFNbbk6ubc5C8abyQY9cQIyDPev0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:date:from:to:subject:message-id:reply-to:mime-version:content-type:content-disposition:user-agent; b=YqyZD7Jf5yd/mfyiu3kh0DtPLKPWZwUoI+5vIxZeDoE9sZdf1fHmB6ogIK5oVgE20agi23UNyTRMAopVmmAr/tuomYU91iNG8BLDyy9f8y2igUBJ/KjA+j6cB0nJ+SD1Z6M+615/TVU38o7ZrWUnb5K9hdzZksIPzkXz3qBgoA8= Received: by 10.114.183.1 with SMTP id g1mr10403764waf.1191824516885; Sun, 07 Oct 2007 23:21:56 -0700 (PDT) Received: from michelle.cdnetworks.co.kr ( [211.53.35.84]) by mx.google.com with ESMTPS id j38sm11694854waf.2007.10.07.23.21.52 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 07 Oct 2007 23:21:55 -0700 (PDT) Received: from michelle.cdnetworks.co.kr (localhost.cdnetworks.co.kr [127.0.0.1]) by michelle.cdnetworks.co.kr (8.13.5/8.13.5) with ESMTP id l986HxBU047981 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 8 Oct 2007 15:17:59 +0900 (KST) (envelope-from pyunyh@gmail.com) Received: (from yongari@localhost) by michelle.cdnetworks.co.kr (8.13.5/8.13.5/Submit) id l986HwCB047980 for freebsd-current@FreeBSD.org; Mon, 8 Oct 2007 15:17:58 +0900 (KST) (envelope-from pyunyh@gmail.com) Date: Mon, 8 Oct 2007 15:17:58 +0900 From: Pyun YongHyeon To: freebsd-current@FreeBSD.org Message-ID: <20071008061758.GF46694@cdnetworks.co.kr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="envbJBWh7q8WU6mo" Content-Disposition: inline User-Agent: Mutt/1.4.2.1i Cc: Subject: CFT: vr(4) X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: pyunyh@gmail.com List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Oct 2007 06:21:58 -0000 --envbJBWh7q8WU6mo Content-Type: text/plain; charset=us-ascii Content-Disposition: inline It seems that there had been several stability issues in vr(4). Here is mimimal patch that make vr(4) work reliably under heavy network loads. The patch does the following: - Always check writability of mbuf before padding and make a writable copy of the mbuf if mbuf is marked as read-only. - Before padding is done check remaining bytes such that it can safely extend buffer size of the mbuf. - Before padding always check the return value of m_defrag(9). - Zero out pad space to avoid leaking data. If you have vr(4) hardware please give it spin and let me know the result. -- Regards, Pyun YongHyeon --envbJBWh7q8WU6mo Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="vr.pad.patch" Index: if_vr.c =================================================================== RCS file: /home/ncvs/src/sys/pci/if_vr.c,v retrieving revision 1.126 diff -u -r1.126 if_vr.c --- if_vr.c 23 Apr 2007 12:19:02 -0000 1.126 +++ if_vr.c 8 Oct 2007 06:14:41 -0000 @@ -1217,6 +1217,7 @@ struct vr_desc *cur_tx, *n_tx; struct vr_desc *f = NULL; uint32_t cval; + int padlen; if (ifp->if_drv_flags & IFF_DRV_OACTIVE) return; @@ -1250,11 +1251,33 @@ * ourselves. */ if (m_head->m_pkthdr.len < VR_MIN_FRAMELEN) { - if (m_head->m_next != NULL) - m_head = m_defrag(m_head, M_DONTWAIT); - m_head->m_pkthdr.len += VR_MIN_FRAMELEN - m_head->m_len; + padlen = VR_MIN_FRAMELEN - m_head->m_pkthdr.len; + if (M_WRITABLE(m_head) == 0) { + m = m_dup(m_head, M_DONTWAIT); + if (m == NULL) { + IFQ_DRV_PREPEND(&ifp->if_snd, m_head); + break; + } + m_freem(m_head); + m_head = m; + } + if (m_head->m_next != NULL || + M_TRAILINGSPACE(m_head) < padlen) { + m = m_defrag(m_head, M_DONTWAIT); + if (m == NULL) { + IFQ_DRV_PREPEND(&ifp->if_snd, m_head); + break; + } + m_head = m; + } + /* + * Manually pad short frames, and zero the pad space + * to avoid leaking data. + */ + bzero(mtod(m_head, char *) + m_head->m_pkthdr.len, + padlen); + m_head->m_pkthdr.len += padlen; m_head->m_len = m_head->m_pkthdr.len; - /* XXX: bzero the padding bytes */ } n_tx = cur_tx; --envbJBWh7q8WU6mo--