Received: by 2002:a05:7412:d1aa:b0:fc:a2b0:25d7 with SMTP id ba42csp765162rdb; Mon, 29 Jan 2024 18:59:22 -0800 (PST) X-Google-Smtp-Source: AGHT+IHJ2jaUjkkDYrNN8+ic9FzdEIk380v9yDCpD1SGxWNl8Kc+OurIBpl/IiBiUvnZKRCsV4hX X-Received: by 2002:a05:6214:c44:b0:681:98d:f7f6 with SMTP id r4-20020a0562140c4400b00681098df7f6mr6952383qvj.124.1706583561979; Mon, 29 Jan 2024 18:59:21 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706583561; cv=pass; d=google.com; s=arc-20160816; b=wIA061EJA1oHU0NFvRI9FySZ1pvpO2RIvmyOu8uoQ8q1so8RsddvF9JLqm+M2vg8Px Dpe9aAiftU945sK3F88fGskJLn2RoaPg+9pDZN++mCuV2yhEof03OF2V7Zc+pzPsNbIk GB0/UW6lYLV0acmJ+w6dqwlbG22RJS2G7Wr/LwhW3rkbNkPX/7t1S9FoCjuDoPwkYwm9 di7lyDUkUdX2CyRIqS65cCW/rritKUGl+WeCLcprn1ObiPYBxQyKJDHKYEhcgXnPKPNL Y9B9Anp1lnnn7bjr431iI2+QMe44kXb6pYwZpuJ4kSHX4HhjghfLKY0dBqBR3Bal6QXR M5Uw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=NcwVONN2TUzwf50oH74Ok3NsqmNIRgMSWJGHM3YyTno=; fh=e2YG26LXyEhPGSAZzEiiz8q8INMSuVxKRbwhcKAj0qg=; b=hA3byWInZLcFl/lsT8T91m9fO0jo4neXmseNUva7TKid30pUCSXCDNx7cDvmSy9Fox j7VDP6pDK7ljgiOvMF7LrP+UJQeAeTZDIAUbV71+ZZR4VJKuZCMiFKlJU7PpbEkb9//7 HUydrH/6Yvy8t4O0pSPRgln+HEUpEgfJTadCKw86m6U6+gsKmwMP/+zirgzXhZnEw+gp EJrE7E49LezBuYICIXrqzGUowlPDXGHyAR0HrIcCWsTQty3u/7W6BbGJ3VmHd4G8ojX7 EWhaDPO2UPJh7kcUXSGv0ZGe9toxZXVHrBigtveZjbtBS4vNTOPF883XhSgWmBrolY4o YtfQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Y1vd3WUV; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-43866-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-43866-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id q10-20020a05621419ea00b0068c508e015dsi3059811qvc.299.2024.01.29.18.59.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 18:59:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-43866-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Y1vd3WUV; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-43866-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-43866-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id B90361C23E88 for ; Tue, 30 Jan 2024 02:59:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 35AB8376EF; Tue, 30 Jan 2024 02:58:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Y1vd3WUV" Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 92EC8374E9; Tue, 30 Jan 2024 02:58:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706583533; cv=none; b=IrznwPCSRPLZqgSW3m6syVTJ7m1HtMWp2VmMB9DnmeJpB50ddKcz2W5DaOoslFXV4GNzK7xyzr78/0Cj+Cg8oiqETAnAiyaQW1/r5H7Qvq7emuFQhvTKPiKQjqinzCiy5/jcYAx3+XdYV3djvDXnRoFalTYWKk0+leGpPTOwP+c= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706583533; c=relaxed/simple; bh=GmuwNFJzWnA1Oqg0ns6ZK1TFM5ogyUhRCfAnEm9agos=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=OO4h8TN2G986qWk5pojOGs0LR67+GRQCbaWKCjbkwKkIVIwxaanMi1i+ik9CrlwXGbC4Wz2y4W/+0bCYmKnW4e37f1WfNdDT6k+SkrfJMyUeZy8xrhuvIWva+s2x6WuazhYn2p/KRGMzSIvA5xBnOyJ3YgRfP+xMJ8qcRTqAKyQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Y1vd3WUV; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706583531; x=1738119531; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=GmuwNFJzWnA1Oqg0ns6ZK1TFM5ogyUhRCfAnEm9agos=; b=Y1vd3WUVOe2fmCAOY4HOVXRn3e6qUsV/k+Djxxu6lEeh0VYM/VROdLd8 YQ3uJquMGarfuRVGMUNgdVPeuzx+6Xii5DbhWxaEiyF3upwKBxpG6pg6p ZkM1DS+BjtGh7IgAXKeOPgQrmlW7aiMQYsemRhyoFgSXLrwypJGLBWl2c 34R8kGrQn+Rtn6nCkbJIWkfASqS/nlt6aSUuZ1HZp1XTip3Xq/UX2aq7J YtJmSefMZMiOxlOVH11QiWZtCOnl83gNip3PLdoKvq4b3JIeAvaL00JmS ZCf65iv4LgIfRGtqeIxT6dpk1f6jTyu9M13PsohPsOn2ocv2jopOOPtx5 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10968"; a="9891664" X-IronPort-AV: E=Sophos;i="6.05,707,1701158400"; d="scan'208";a="9891664" Received: from orviesa005.jf.intel.com ([10.64.159.145]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2024 18:58:50 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.05,707,1701158400"; d="scan'208";a="3520576" Received: from fyu1.sc.intel.com ([172.25.103.126]) by orviesa005.jf.intel.com with ESMTP; 29 Jan 2024 18:58:49 -0800 From: Fenghua Yu To: "Vinod Koul" , "Dave Jiang" Cc: dmaengine@vger.kernel.org, "linux-kernel" , Fenghua Yu , Nikhil Rao , Tony Zhu Subject: [PATCH] dmaengine: idxd: Change wmb() to smp_wmb() when copying completion record to user space Date: Mon, 29 Jan 2024 18:58:06 -0800 Message-Id: <20240130025806.2027284-1-fenghua.yu@intel.com> X-Mailer: git-send-email 2.37.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit wmb() is used to ensure status in the completion record is written after the rest of the completion record, making it visible to the user. However, on SMP systems, this may not guarantee visibility across different CPUs. Considering this scenario that event log handler is running on CPU1 while user app is polling completion record (cr) status on CPU2: CPU1 CPU2 event log handler user app 1. cr = 0 (status = 0) 2. copy X to user cr except "status" 3. wmb() 4. copy Y to user cr "status" 5. poll status value Y 6. read rest cr which is still 0. cr handling fails 7. cr value X visible now Although wmb() ensure value Y is written and visible after X is written on CPU1, the order is not guaranteed on CPU2. So user app may see status value Y while cr value X is still not visible yet on CPU2. This will cause reading 0 from the rest of cr and cr handling fails. Changing wmb() to smp_wmb() ensures Y is written after X on both CPU1 and CPU2. This guarantees that user app can consume cr in right order. Fixes: b022f59725f0 ("dmaengine: idxd: add idxd_copy_cr() to copy user completion record during page fault handling") Suggested-by: Nikhil Rao Tested-by: Tony Zhu Signed-off-by: Fenghua Yu --- drivers/dma/idxd/cdev.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index 77f8885cf407..9b7388a23cbe 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -681,9 +681,10 @@ int idxd_copy_cr(struct idxd_wq *wq, ioasid_t pasid, unsigned long addr, * Ensure that the completion record's status field is written * after the rest of the completion record has been written. * This ensures that the user receives the correct completion - * record information once polling for a non-zero status. + * record information on any CPU once polling for a non-zero + * status. */ - wmb(); + smp_wmb(); status = *(u8 *)cr; if (put_user(status, (u8 __user *)addr)) left += status_size; -- 2.37.1