Re: [Mesa-dev] [PATCH 7/7] swr/rast: Store cached files in multiple subdirs

2019-01-15 Thread Cherniak, Bruce
Reviewed-by: Bruce Cherniak  

> On Dec 17, 2018, at 8:36 AM, Alok Hota  wrote:
> 
> This improves cache filesystem performance, especially during CI tests
> Also updated jitcache magic number due to codegen parameter changes
> Removed 2 `if constexpr` to prevent C++17 requirement
> ---
> .../swr/rasterizer/jitter/JitManager.cpp  | 51 ---
> .../swr/rasterizer/jitter/JitManager.h|  6 +++
> .../swr/rasterizer/jitter/builder_misc.cpp| 33 +---
> 3 files changed, 52 insertions(+), 38 deletions(-)
> 
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp 
> b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> index 1b2b570318c..a549721f147 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> @@ -582,7 +582,7 @@ struct JitCacheFileHeader
> uint64_t GetObjectCRC() const { return m_objCRC; }
> 
> private:
> -static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543211ULL + 4;
> +static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543210ULL + 6;
> static const size_t   JC_STR_MAX_LEN  = 32;
> static const uint32_t JC_PLATFORM_KEY = (LLVM_VERSION_MAJOR << 24) |
> (LLVM_VERSION_MINOR << 16) | 
> (LLVM_VERSION_PATCH << 8) |
> @@ -634,6 +634,15 @@ JitCache::JitCache()
> {
> mCacheDir = KNOB_JIT_CACHE_DIR;
> }
> +
> +// Create cache dir at startup to allow jitter to write debug.ll files
> +// to that directory.
> +if (!llvm::sys::fs::exists(mCacheDir.str()) &&
> +llvm::sys::fs::create_directories(mCacheDir.str()))
> +{
> +SWR_INVALID("Unable to create directory: %s", mCacheDir.c_str());
> +}
> +
> }
> 
> int ExecUnhookedProcess(const std::string& CmdLine, std::string* pStdOut, 
> std::string* pStdErr)
> @@ -641,6 +650,26 @@ int ExecUnhookedProcess(const std::string& CmdLine, 
> std::string* pStdOut, std::s
> return ExecCmd(CmdLine, "", pStdOut, pStdErr);
> }
> 
> +/// Calculate actual directory where module will be cached.
> +/// This is always a subdirectory of mCacheDir.  Full absolute
> +/// path name will be stored in mCurrentModuleCacheDir
> +void JitCache::CalcModuleCacheDir()
> +{
> +mModuleCacheDir.clear();
> +
> +llvm::SmallString moduleDir = mCacheDir;
> +
> +// Create 4 levels of directory hierarchy based on CRC, 256 entries each
> +uint8_t* pCRC = (uint8_t*)
> +for (uint32_t i = 0; i < 4; ++i)
> +{
> +llvm::sys::path::append(moduleDir, std::to_string((int)pCRC[i]));
> +}
> +
> +mModuleCacheDir = moduleDir;
> +}
> +
> +
> /// notifyObjectCompiled - Provides a pointer to compiled code for Module M.
> void JitCache::notifyObjectCompiled(const llvm::Module* M, 
> llvm::MemoryBufferRef Obj)
> {
> @@ -650,16 +679,22 @@ void JitCache::notifyObjectCompiled(const llvm::Module* 
> M, llvm::MemoryBufferRef
> return;
> }
> 
> -if (!llvm::sys::fs::exists(mCacheDir.str()) &&
> -llvm::sys::fs::create_directories(mCacheDir.str()))
> +if (!mModuleCacheDir.size())
> {
> -SWR_INVALID("Unable to create directory: %s", mCacheDir.c_str());
> +SWR_INVALID("Unset module cache directory");
> +return;
> +}
> +
> +if (!llvm::sys::fs::exists(mModuleCacheDir.str()) &&
> +llvm::sys::fs::create_directories(mModuleCacheDir.str()))
> +{
> +SWR_INVALID("Unable to create directory: %s", 
> mModuleCacheDir.c_str());
> return;
> }
> 
> JitCacheFileHeader header;
> 
> -llvm::SmallString filePath = mCacheDir;
> +llvm::SmallString filePath = mModuleCacheDir;
> llvm::sys::path::append(filePath, moduleID);
> 
> llvm::SmallString objPath = filePath;
> @@ -699,12 +734,14 @@ std::unique_ptr 
> JitCache::getObject(const llvm::Module* M)
> return nullptr;
> }
> 
> -if (!llvm::sys::fs::exists(mCacheDir))
> +CalcModuleCacheDir();
> +
> +if (!llvm::sys::fs::exists(mModuleCacheDir))
> {
> return nullptr;
> }
> 
> -llvm::SmallString filePath = mCacheDir;
> +llvm::SmallString filePath = mModuleCacheDir;
> llvm::sys::path::append(filePath, moduleID);
> 
> llvm::SmallString objFilePath = filePath;
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h 
> b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> index 5659191525d..bb7ca8b4a3e 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> @@ -113,9 +113,15 @@ public:
> private:
> std::string mCpu;
> llvm::SmallString mCacheDir;
> +llvm::SmallString mModuleCacheDir;
> uint32_tmCurrentModuleCRC = 0;
> JitManager* mpJitMgr  = nullptr;
> llvm::CodeGenOpt::Level mOptLevel = llvm::CodeGenOpt::None;
> +
> +/// Calculate actual directory where 

[Mesa-dev] [PATCH 7/7] swr/rast: Store cached files in multiple subdirs

2018-12-17 Thread Alok Hota
This improves cache filesystem performance, especially during CI tests
Also updated jitcache magic number due to codegen parameter changes
Removed 2 `if constexpr` to prevent C++17 requirement
---
 .../swr/rasterizer/jitter/JitManager.cpp  | 51 ---
 .../swr/rasterizer/jitter/JitManager.h|  6 +++
 .../swr/rasterizer/jitter/builder_misc.cpp| 33 +---
 3 files changed, 52 insertions(+), 38 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
index 1b2b570318c..a549721f147 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
@@ -582,7 +582,7 @@ struct JitCacheFileHeader
 uint64_t GetObjectCRC() const { return m_objCRC; }
 
 private:
-static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543211ULL + 4;
+static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543210ULL + 6;
 static const size_t   JC_STR_MAX_LEN  = 32;
 static const uint32_t JC_PLATFORM_KEY = (LLVM_VERSION_MAJOR << 24) |
 (LLVM_VERSION_MINOR << 16) | 
(LLVM_VERSION_PATCH << 8) |
@@ -634,6 +634,15 @@ JitCache::JitCache()
 {
 mCacheDir = KNOB_JIT_CACHE_DIR;
 }
+
+// Create cache dir at startup to allow jitter to write debug.ll files
+// to that directory.
+if (!llvm::sys::fs::exists(mCacheDir.str()) &&
+llvm::sys::fs::create_directories(mCacheDir.str()))
+{
+SWR_INVALID("Unable to create directory: %s", mCacheDir.c_str());
+}
+
 }
 
 int ExecUnhookedProcess(const std::string& CmdLine, std::string* pStdOut, 
std::string* pStdErr)
@@ -641,6 +650,26 @@ int ExecUnhookedProcess(const std::string& CmdLine, 
std::string* pStdOut, std::s
 return ExecCmd(CmdLine, "", pStdOut, pStdErr);
 }
 
+/// Calculate actual directory where module will be cached.
+/// This is always a subdirectory of mCacheDir.  Full absolute
+/// path name will be stored in mCurrentModuleCacheDir
+void JitCache::CalcModuleCacheDir()
+{
+mModuleCacheDir.clear();
+
+llvm::SmallString moduleDir = mCacheDir;
+
+// Create 4 levels of directory hierarchy based on CRC, 256 entries each
+uint8_t* pCRC = (uint8_t*)
+for (uint32_t i = 0; i < 4; ++i)
+{
+llvm::sys::path::append(moduleDir, std::to_string((int)pCRC[i]));
+}
+
+mModuleCacheDir = moduleDir;
+}
+
+
 /// notifyObjectCompiled - Provides a pointer to compiled code for Module M.
 void JitCache::notifyObjectCompiled(const llvm::Module* M, 
llvm::MemoryBufferRef Obj)
 {
@@ -650,16 +679,22 @@ void JitCache::notifyObjectCompiled(const llvm::Module* 
M, llvm::MemoryBufferRef
 return;
 }
 
-if (!llvm::sys::fs::exists(mCacheDir.str()) &&
-llvm::sys::fs::create_directories(mCacheDir.str()))
+if (!mModuleCacheDir.size())
 {
-SWR_INVALID("Unable to create directory: %s", mCacheDir.c_str());
+SWR_INVALID("Unset module cache directory");
+return;
+}
+
+if (!llvm::sys::fs::exists(mModuleCacheDir.str()) &&
+llvm::sys::fs::create_directories(mModuleCacheDir.str()))
+{
+SWR_INVALID("Unable to create directory: %s", mModuleCacheDir.c_str());
 return;
 }
 
 JitCacheFileHeader header;
 
-llvm::SmallString filePath = mCacheDir;
+llvm::SmallString filePath = mModuleCacheDir;
 llvm::sys::path::append(filePath, moduleID);
 
 llvm::SmallString objPath = filePath;
@@ -699,12 +734,14 @@ std::unique_ptr 
JitCache::getObject(const llvm::Module* M)
 return nullptr;
 }
 
-if (!llvm::sys::fs::exists(mCacheDir))
+CalcModuleCacheDir();
+
+if (!llvm::sys::fs::exists(mModuleCacheDir))
 {
 return nullptr;
 }
 
-llvm::SmallString filePath = mCacheDir;
+llvm::SmallString filePath = mModuleCacheDir;
 llvm::sys::path::append(filePath, moduleID);
 
 llvm::SmallString objFilePath = filePath;
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
index 5659191525d..bb7ca8b4a3e 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
@@ -113,9 +113,15 @@ public:
 private:
 std::string mCpu;
 llvm::SmallString mCacheDir;
+llvm::SmallString mModuleCacheDir;
 uint32_tmCurrentModuleCRC = 0;
 JitManager* mpJitMgr  = nullptr;
 llvm::CodeGenOpt::Level mOptLevel = llvm::CodeGenOpt::None;
+
+/// Calculate actual directory where module will be cached.
+/// This is always a subdirectory of mCacheDir.  Full absolute
+/// path name will be stored in mCurrentModuleCacheDir
+void CalcModuleCacheDir();
 };
 
 //
diff --git