From owner-freebsd-net@freebsd.org Sat Aug 20 20:28:01 2016 Return-Path: Delivered-To: freebsd-net@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id DA26FBC079E for ; Sat, 20 Aug 2016 20:28:01 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-it0-x231.google.com (mail-it0-x231.google.com [IPv6:2607:f8b0:4001:c0b::231]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id A52C41F4D; Sat, 20 Aug 2016 20:28:01 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: by mail-it0-x231.google.com with SMTP id x131so57428483ite.0; Sat, 20 Aug 2016 13:28:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=/+xY8ZT7Nki42I2U2J+XS24VEfJNUjcUXvuw3/os5tI=; b=UzDoF2OWPtqUzkhirWD3BNORzS4Nss42rLhg0NzKzrs8Q0P8R6CzZqaior5WslPBBW txqJYUGQWc3t3ns825hwxZCcSXtHmSwNyaHZUOX1e5KJa4F7Coq/R5VsvrNHi4+2lCHb 6Tr6D3QhboArF5RJBMO+SbggHGBxyX8byvkORcQXreWhM165sZzPDtUVyNlzsiiu6WJ6 7q54qh9Hv496b2lHsUFN0/G1Us+CXh5QTTfd7l0tOgnAnZDv0RIydWXJ4t1/M8673Sct nWjy9hOPqbX7dWIrfFbK52vYCCmYwBpPHbheexBDpT0hHSi9r6rbAOKB/u9pNH6CAa9g m4mQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=/+xY8ZT7Nki42I2U2J+XS24VEfJNUjcUXvuw3/os5tI=; b=RMPsqTuMtXp26VzFJf5Vwvj5bVXEAFN81GtEW2GtOhfTJERLCAph4OMSrNb5uDF4+4 pBDr/JVlAvdRy8wRMb4yWKObvred/YLMYIZNR9byHjaTLCkjRUy6etC2YIleB/Wl6sav 4Tap/r8dR4DOwoboCRbvYH/uUloeWZFIGOHRPk2rwUpwGWNi2fIAU0+cfYsYuarmkm3j xD5UOzuANQjAiA6CCx0XYkOhD9M3EMLe4ZiVgPAX/cgqx29zdGBsbmBkW27qiCFspAkw vKRKOz7n72S/WfI4iHamRGW9MloAsW8GwgkvTq/KgxCN6YpyiErF8GvU0wFYV66YBTgd CRbw== X-Gm-Message-State: AEkoouvAeco9jNFEk4AKRupw3FWvinTrBqvWpOsdAMt2TdM+OPaM7WzpNW4A27ppRRg559Q171Wb50/BQ47Zgw== X-Received: by 10.36.124.141 with SMTP id a135mr12573524itd.25.1471724880643; Sat, 20 Aug 2016 13:28:00 -0700 (PDT) MIME-Version: 1.0 Sender: adrian.chadd@gmail.com Received: by 10.36.141.129 with HTTP; Sat, 20 Aug 2016 13:27:59 -0700 (PDT) In-Reply-To: <201608172021.u7HKLXJ4001584@repo.freebsd.org> References: <201608172021.u7HKLXJ4001584@repo.freebsd.org> From: Adrian Chadd Date: Sat, 20 Aug 2016 13:27:59 -0700 X-Google-Sender-Auth: u9JP-_G0P8E2hTsNw65AsvIKqOg Message-ID: Subject: Re: svn commit: r304313 - head/sys/net To: "Andrey V. Elsukov" Cc: FreeBSD Net , Robert Watson Content-Type: text/plain; charset=UTF-8 X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 20 Aug 2016 20:28:01 -0000 On 17 August 2016 at 13:21, Andrey V. Elsukov wrote: > Author: ae > Date: Wed Aug 17 20:21:33 2016 > New Revision: 304313 > URL: https://svnweb.freebsd.org/changeset/base/304313 > > Log: > Teach netisr_get_cpuid() to limit a given value to supported by netisr. > Use netisr_get_cpuid() in netisr_select_cpuid() to limit cpuid value > returned by protocol to be sure that it is not greather than nws_count. > > PR: 211836 > Reviewed by: adrian > MFC after: 3 days > > Modified: > head/sys/net/if_epair.c > head/sys/net/netisr.c > > Modified: head/sys/net/if_epair.c > ============================================================================== > --- head/sys/net/if_epair.c Wed Aug 17 19:43:45 2016 (r304312) > +++ head/sys/net/if_epair.c Wed Aug 17 20:21:33 2016 (r304313) > @@ -807,9 +807,9 @@ epair_clone_create(struct if_clone *ifc, > * cache locality but we can at least allow parallelism. > */ > sca->cpuid = > - netisr_get_cpuid(sca->ifp->if_index % netisr_get_cpucount()); > + netisr_get_cpuid(sca->ifp->if_index); > scb->cpuid = > - netisr_get_cpuid(scb->ifp->if_index % netisr_get_cpucount()); > + netisr_get_cpuid(scb->ifp->if_index); > > /* Initialise pseudo media types. */ > ifmedia_init(&sca->media, 0, epair_media_change, epair_media_status); > > Modified: head/sys/net/netisr.c > ============================================================================== > --- head/sys/net/netisr.c Wed Aug 17 19:43:45 2016 (r304312) > +++ head/sys/net/netisr.c Wed Aug 17 20:21:33 2016 (r304313) > @@ -272,10 +272,7 @@ u_int > netisr_get_cpuid(u_int cpunumber) > { > > - KASSERT(cpunumber < nws_count, ("%s: %u > %u", __func__, cpunumber, > - nws_count)); > - > - return (nws_array[cpunumber]); > + return (nws_array[cpunumber % nws_count]); > } > > /* > @@ -810,10 +807,12 @@ netisr_select_cpuid(struct netisr_proto > * dispatch. In the queued case, fall back on the SOURCE > * policy. > */ > - if (*cpuidp != NETISR_CPUID_NONE) > + if (*cpuidp != NETISR_CPUID_NONE) { > + *cpuidp = netisr_get_cpuid(*cpuidp); > return (m); > + } > if (dispatch_policy == NETISR_DISPATCH_HYBRID) { > - *cpuidp = curcpu; > + *cpuidp = netisr_get_cpuid(curcpu); > return (m); > } > policy = NETISR_POLICY_SOURCE; > I wonder if the right-er thing to do here is to allow the cpuid to be whatever it needs to be, but limit the cpuid lookups when it resolves to a netisr array. that'd mean the hybrid model would still return the current CPU up to the max CPU id, but anything trying to queue into a netisr would not overflow the netisr queue count. Thoughts? -a