Received: by 10.223.185.111 with SMTP id b44csp1656280wrg; Sat, 10 Mar 2018 10:45:44 -0800 (PST) X-Google-Smtp-Source: AG47ELuPYg/RM3Pb9uZ8Uc3A6NpvYIC5Lx5RCIQqFeMumcHehb0phj/CiSmPCWrVU8Xnw0vQPeOZ X-Received: by 10.101.71.202 with SMTP id f10mr2223881pgs.91.1520707544290; Sat, 10 Mar 2018 10:45:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520707544; cv=none; d=google.com; s=arc-20160816; b=dxlbrQqgPCSEWacuKTlVZ7bt1rh1XTCyQVp2yYODSeX+7UGLv6FKRVEC9G4w82GTgT +vqyZHH9vI7d5B51SiiRAdD93iwfdZ8Xdn65B/5ZamRVLQwKyqnji4LveYwTCG1Zik8J mexXQLaAYkjlEVFHGmgQERgAtreaHFR9KYFD5a3bO6Pk/HXvgj8HDTsKtOFVWKIyumVn e8s9vPFj1lYIAJZjQ/mAo8W1vBp95GppOMb/UbGaqG9IhtDw9XWraAatEh7gYlwcOQ8O wEYLujRhTustF4BWlMiLptQCLT9BGn/2mnAP3tP2f8/Uc7WcuQaMFVKwXaonkVdDrFOz kUrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=kAeU2DN67lgUPB6WpNsaBBjUrvsn999/CVZoEwx/ShM=; b=Pze3LVVHLS1hJF7j2kobGKxbf8sQEzA1mgmTYw+k+vVaiaozpV2Tczdycw8r4yC3wr UZtDj6N59eIAZG9vPLlKoG/2jsluRgnEN2KUSJr7hymSC8Umn07Ja0IJ1SHlqKPymUaB rTSmjPsMkMBnEfb4dyUKVvPQZwDzIjWcRpAwtHxnRhqxUiinG3vgcu/j7eAhISIrC3P+ RFkGZc5dXzkXxUIAX6NRLLJPa/F41oo/il8GXbMX9NzvqLLkh/8ios5ylOgqjfvXHv87 jP/goRsn9RmGTqr4tMYnQTAtLtjlZblPO7zCkJBOwNrTrrhH6hxYNzuFCwR9P1QGFLnw jQ/A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@eng.ucsd.edu header.s=google header.b=bGGEM2H+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k131si2632459pgc.361.2018.03.10.10.45.29; Sat, 10 Mar 2018 10:45:44 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@eng.ucsd.edu header.s=google header.b=bGGEM2H+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932227AbeCJSUY (ORCPT + 99 others); Sat, 10 Mar 2018 13:20:24 -0500 Received: from mail-pl0-f67.google.com ([209.85.160.67]:32897 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932168AbeCJSUR (ORCPT ); Sat, 10 Mar 2018 13:20:17 -0500 Received: by mail-pl0-f67.google.com with SMTP id c11-v6so7035360plo.0 for ; Sat, 10 Mar 2018 10:20:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eng.ucsd.edu; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kAeU2DN67lgUPB6WpNsaBBjUrvsn999/CVZoEwx/ShM=; b=bGGEM2H+2eKqtwU5aN/9cbdPPrWjsG/JPT63L9PWDT6ORZVGwYZ3H/XxWDWtL2oSBN hXCmaGSVeuyLZLlSnirUXtc8SW73gct0Xo5j6iz3BFPMc39XIBfQzZScwNBeg5CpUalD H4cvzQhHamW/QlRE/G4Zg/jAX7Xt+ezM3TM/A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kAeU2DN67lgUPB6WpNsaBBjUrvsn999/CVZoEwx/ShM=; b=i9ycIAFPZ0GaoSX7ERdCPBxe7E+2cLwSnX0s1bK+MrCadWx04f4isTtxP1blZu5dxu nqZTJbY4Ft371kToPIyk5Ka5Iv+BldTcPKIoNHrmkH/VhgU3aEENnMeIzvoj7OlNbIuo 5TEOQAa461delpz+sGpjybx3bLFU2nPzYcmUuNyioTZvw+fw/6Pct1L+Qvih7k7YtfJh vmyJ4xBhuwXl5bzLwR3pLLv3WJ1eldIAoHwYs8mzHl7/+UIS84zQj8GAZL6trBQWeLPf BmXK2kPOnzVOfoE75JbQnKMYkMPWL4VBRxGne/PpnBhw5Dh5yRi8Qd4+h+AbG9YJdBmA lVaA== X-Gm-Message-State: AElRT7HfGW3xjQksrEjTYN/ijs9TpMMt+/3uAjbg4IoR1WNvGg0Ps5uj ClBW9AI2OvkHWxNhDxorxBK6pQ== X-Received: by 2002:a17:902:6f17:: with SMTP id w23-v6mr2807136plk.336.1520706017374; Sat, 10 Mar 2018 10:20:17 -0800 (PST) Received: from brienza-desktop.8.8.4.4 (andxu.ucsd.edu. [132.239.17.134]) by smtp.gmail.com with ESMTPSA id h80sm9210167pfj.181.2018.03.10.10.20.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 10 Mar 2018 10:20:16 -0800 (PST) From: Andiry Xu To: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org Cc: dan.j.williams@intel.com, andy.rudoff@intel.com, coughlan@redhat.com, swanson@cs.ucsd.edu, david@fromorbit.com, jack@suse.com, swhiteho@redhat.com, miklos@szeredi.hu, andiry.xu@gmail.com, Andiry Xu Subject: [RFC v2 02/83] Add nova_def.h. Date: Sat, 10 Mar 2018 10:17:43 -0800 Message-Id: <1520705944-6723-3-git-send-email-jix024@eng.ucsd.edu> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1520705944-6723-1-git-send-email-jix024@eng.ucsd.edu> References: <1520705944-6723-1-git-send-email-jix024@eng.ucsd.edu> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Andiry Xu This file defines NOVA filesystem macros and routines to persist updates by using Intel persistent memory instruction CLWB or clflush. Signed-off-by: Andiry Xu --- fs/nova/nova_def.h | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 fs/nova/nova_def.h diff --git a/fs/nova/nova_def.h b/fs/nova/nova_def.h new file mode 100644 index 0000000..1cbed6f --- /dev/null +++ b/fs/nova/nova_def.h @@ -0,0 +1,128 @@ +/* + * BRIEF DESCRIPTION + * + * Definitions for the NOVA filesystem. + * + * Copyright 2015-2016 Regents of the University of California, + * UCSD Non-Volatile Systems Lab, Andiry Xu + * Copyright 2012-2013 Intel Corporation + * Copyright 2009-2011 Marco Stornelli + * Copyright 2003 Sony Corporation + * Copyright 2003 Matsushita Electric Industrial Co., Ltd. + * 2003-2004 (c) MontaVista Software, Inc. , Steve Longerbeam + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ +#ifndef _LINUX_NOVA_DEF_H +#define _LINUX_NOVA_DEF_H + +#include +#include + +#define NOVA_SUPER_MAGIC 0x4E4F5641 /* NOVA */ + +/* + * The NOVA filesystem constants/structures + */ + +/* + * Mount flags + */ +#define NOVA_MOUNT_XATTR_USER 0x000002 /* Extended user attributes */ +#define NOVA_MOUNT_POSIX_ACL 0x000004 /* POSIX Access Control Lists */ +#define NOVA_MOUNT_DAX 0x000008 /* Direct Access */ +#define NOVA_MOUNT_ERRORS_CONT 0x000010 /* Continue on errors */ +#define NOVA_MOUNT_ERRORS_RO 0x000020 /* Remount fs ro on errors */ +#define NOVA_MOUNT_ERRORS_PANIC 0x000040 /* Panic on errors */ +#define NOVA_MOUNT_HUGEMMAP 0x000080 /* Huge mappings with mmap */ +#define NOVA_MOUNT_HUGEIOREMAP 0x000100 /* Huge mappings with ioremap */ +#define NOVA_MOUNT_FORMAT 0x000200 /* was FS formatted on mount? */ + +/* + * Maximal count of links to a file + */ +#define NOVA_LINK_MAX 32000 + +#define NOVA_DEF_BLOCK_SIZE_4K 4096 + +#define NOVA_INODE_BITS 7 +#define NOVA_INODE_SIZE 128 /* must be power of two */ + +#define NOVA_NAME_LEN 255 + +#define MAX_CPUS 1024 + +/* NOVA supported data blocks */ +#define NOVA_BLOCK_TYPE_4K 0 +#define NOVA_BLOCK_TYPE_2M 1 +#define NOVA_BLOCK_TYPE_1G 2 +#define NOVA_BLOCK_TYPE_MAX 3 + +#define META_BLK_SHIFT 9 + +/* + * Play with this knob to change the default block type. + * By changing the NOVA_DEFAULT_BLOCK_TYPE to 2M or 1G, + * we should get pretty good coverage in testing. + */ +#define NOVA_DEFAULT_BLOCK_TYPE NOVA_BLOCK_TYPE_4K + + +/* ======================= Write ordering ========================= */ + +#define CACHELINE_SIZE (64) +#define CACHELINE_MASK (~(CACHELINE_SIZE - 1)) +#define CACHELINE_ALIGN(addr) (((addr)+CACHELINE_SIZE-1) & CACHELINE_MASK) + + +static inline bool arch_has_clwb(void) +{ + return static_cpu_has(X86_FEATURE_CLWB); +} + +extern int support_clwb; + +#define _mm_clflush(addr)\ + asm volatile("clflush %0" : "+m" (*(volatile char *)(addr))) +#define _mm_clflushopt(addr)\ + asm volatile(".byte 0x66; clflush %0" : "+m" \ + (*(volatile char *)(addr))) +#define _mm_clwb(addr)\ + asm volatile(".byte 0x66; xsaveopt %0" : "+m" \ + (*(volatile char *)(addr))) + +/* Provides ordering from all previous clflush too */ +static inline void PERSISTENT_MARK(void) +{ + /* TODO: Fix me. */ +} + +static inline void PERSISTENT_BARRIER(void) +{ + asm volatile ("sfence\n" : : ); +} + +static inline void nova_flush_buffer(void *buf, uint32_t len, bool fence) +{ + uint32_t i; + + len = len + ((unsigned long)(buf) & (CACHELINE_SIZE - 1)); + if (support_clwb) { + for (i = 0; i < len; i += CACHELINE_SIZE) + _mm_clwb(buf + i); + } else { + for (i = 0; i < len; i += CACHELINE_SIZE) + _mm_clflush(buf + i); + } + /* Do a fence only if asked. We often don't need to do a fence + * immediately after clflush because even if we get context switched + * between clflush and subsequent fence, the context switch operation + * provides implicit fence. + */ + if (fence) + PERSISTENT_BARRIER(); +} + +#endif /* _LINUX_NOVA_DEF_H */ -- 2.7.4