From: Yin Congmin Date: Tue, 30 Mar 2021 14:47:33 +0000 (+0800) Subject: librbd/cache/pwl: Fix pmem cache fragment issue X-Git-Tag: v17.1.0~2119^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F40493%2Fhead;p=ceph.git librbd/cache/pwl: Fix pmem cache fragment issue I/O may hang due to pmem cache fragment issue when blocks are diffrent in size. Call pmdk API(pmemobj_defrag) to solve. Fixes: https://tracker.ceph.com/issues/49879 Signed-off-by: Yin Congmin --- diff --git a/src/librbd/cache/pwl/rwl/WriteLog.cc b/src/librbd/cache/pwl/rwl/WriteLog.cc index 4f563d739da1..a9b5e708b9e1 100644 --- a/src/librbd/cache/pwl/rwl/WriteLog.cc +++ b/src/librbd/cache/pwl/rwl/WriteLog.cc @@ -897,6 +897,12 @@ void WriteLog::reserve_cache(C_BlockIORequestT *req, << *req << dendl; alloc_succeeds = false; no_space = true; /* Entries need to be retired */ + + if (this->m_free_log_entries == this->m_total_log_entries - 1) { + /* When the cache is empty, there is still no space to allocate. + * Defragment. */ + pmemobj_defrag(m_log_pool, NULL, 0, NULL); + } break; } else { buffer.allocated = true;