From owner-svn-src-stable-11@freebsd.org Mon Sep 11 18:30:51 2017 Return-Path: Delivered-To: svn-src-stable-11@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 B96DBE1BD50; Mon, 11 Sep 2017 18:30:51 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 939696C5AB; Mon, 11 Sep 2017 18:30:51 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v8BIUoNO067540; Mon, 11 Sep 2017 18:30:50 GMT (envelope-from mav@FreeBSD.org) Received: (from mav@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v8BIUoYo067539; Mon, 11 Sep 2017 18:30:50 GMT (envelope-from mav@FreeBSD.org) Message-Id: <201709111830.v8BIUoYo067539@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mav set sender to mav@FreeBSD.org using -f From: Alexander Motin Date: Mon, 11 Sep 2017 18:30:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r323451 - stable/11/sys/dev/ntb/ntb_hw X-SVN-Group: stable-11 X-SVN-Commit-Author: mav X-SVN-Commit-Paths: stable/11/sys/dev/ntb/ntb_hw X-SVN-Commit-Revision: 323451 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable-11@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for only the 11-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Sep 2017 18:30:51 -0000 Author: mav Date: Mon Sep 11 18:30:50 2017 New Revision: 323451 URL: https://svnweb.freebsd.org/changeset/base/323451 Log: MFC r322980: Fix fake interrupt when set doorbell is unmasked. Since the doorbell bit is already set when interrupt handler is called, the event was not propagated to upper layer. It was working normally because present code was not using masking actively, but that is going to change. Modified: stable/11/sys/dev/ntb/ntb_hw/ntb_hw.c Directory Properties: stable/11/ (props changed) Modified: stable/11/sys/dev/ntb/ntb_hw/ntb_hw.c ============================================================================== --- stable/11/sys/dev/ntb/ntb_hw/ntb_hw.c Mon Sep 11 18:29:09 2017 (r323450) +++ stable/11/sys/dev/ntb/ntb_hw/ntb_hw.c Mon Sep 11 18:30:50 2017 (r323451) @@ -253,7 +253,8 @@ struct ntb_softc { uint64_t db_valid_mask; uint64_t db_link_mask; uint64_t db_mask; - uint64_t fake_db_bell; /* NTB_SB01BASE_LOCKUP*/ + uint64_t fake_db; /* NTB_SB01BASE_LOCKUP*/ + uint64_t force_db; /* NTB_SB01BASE_LOCKUP*/ int last_ts; /* ticks @ last irq */ @@ -1206,10 +1207,11 @@ intel_ntb_db_clear_mask(device_t dev, uint64_t bits) (uintmax_t)ntb->db_valid_mask)); DB_MASK_LOCK(ntb); - ibits = ntb->fake_db_bell & ntb->db_mask & bits; + ibits = ntb->fake_db & ntb->db_mask & bits; ntb->db_mask &= ~bits; if (HAS_FEATURE(ntb, NTB_SB01BASE_LOCKUP)) { /* Simulate fake interrupts if unmasked DB bits are set. */ + ntb->force_db |= ibits; for (i = 0; i < XEON_NONLINK_DB_MSIX_BITS; i++) { if ((ibits & intel_ntb_db_vector_mask(dev, i)) != 0) swi_sched(ntb->int_info[i].tag, 0); @@ -1226,7 +1228,7 @@ intel_ntb_db_read(device_t dev) struct ntb_softc *ntb = device_get_softc(dev); if (HAS_FEATURE(ntb, NTB_SB01BASE_LOCKUP)) - return (ntb->fake_db_bell); + return (ntb->fake_db); return (db_ioread(ntb, ntb->self_reg->db_bell)); } @@ -1243,7 +1245,7 @@ intel_ntb_db_clear(device_t dev, uint64_t bits) if (HAS_FEATURE(ntb, NTB_SB01BASE_LOCKUP)) { DB_MASK_LOCK(ntb); - ntb->fake_db_bell &= ~bits; + ntb->fake_db &= ~bits; DB_MASK_UNLOCK(ntb); return; } @@ -1291,11 +1293,16 @@ intel_ntb_interrupt(struct ntb_softc *ntb, uint32_t ve (vec_mask & ntb->db_link_mask) == 0) { DB_MASK_LOCK(ntb); - /* Do not report same DB events again if not cleared yet. */ - vec_mask &= ~ntb->fake_db_bell; + /* + * Do not report same DB events again if not cleared yet, + * unless the mask was just cleared for them and this + * interrupt handler call can be the consequence of it. + */ + vec_mask &= ~ntb->fake_db | ntb->force_db; + ntb->force_db &= ~vec_mask; /* Update our internal doorbell register. */ - ntb->fake_db_bell |= vec_mask; + ntb->fake_db |= vec_mask; /* Do not report masked DB events. */ vec_mask &= ~ntb->db_mask; @@ -1512,7 +1519,7 @@ intel_ntb_xeon_init_dev(struct ntb_softc *ntb) ntb->xlat_reg = &xeon_sec_xlat; if (HAS_FEATURE(ntb, NTB_SB01BASE_LOCKUP)) { - ntb->fake_db_bell = 0; + ntb->force_db = ntb->fake_db = 0; ntb->msix_mw_idx = (ntb->mw_count + g_ntb_msix_idx) % ntb->mw_count; intel_ntb_printf(2, "Setting up MSIX mw idx %d means %u\n",