From: Igor Fedotov Date: Tue, 15 Jul 2025 20:47:57 +0000 (+0300) Subject: blk/kernel: cap single discard request's length X-Git-Tag: v21.0.0~256^2~123^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f232623747256b3612f4e61d276cfa5d8ae9df33;p=ceph.git blk/kernel: cap single discard request's length Signed-off-by: Igor Fedotov --- diff --git a/src/blk/kernel/KernelDevice.cc b/src/blk/kernel/KernelDevice.cc index 11db95b5f4f6..a455fb18bcb9 100644 --- a/src/blk/kernel/KernelDevice.cc +++ b/src/blk/kernel/KernelDevice.cc @@ -1196,10 +1196,23 @@ int KernelDevice::_discard(uint64_t offset, uint64_t len) << dendl; return 0; } - dout(10) << __func__ - << " 0x" << std::hex << offset << "~" << len << std::dec - << dendl; - r = BlkDev{fd_directs[WRITE_LIFE_NOT_SET]}.discard((int64_t)offset, (int64_t)len); + uint64_t max_len = cct->_conf->bdev_max_discard_length; + if (max_len) { + while (len > 0 && r == 0) { + auto l = std::min(max_len, len); + dout(10) << __func__ + << " 0x" << std::hex << offset << "~" << l << std::dec + << dendl; + r = BlkDev{fd_directs[WRITE_LIFE_NOT_SET]}.discard((int64_t)offset, (int64_t)l); + offset += l; + len -= l; + } + } else { + dout(10) << __func__ + << " 0x" << std::hex << offset << "~" << len << std::dec + << dendl; + r = BlkDev{fd_directs[WRITE_LIFE_NOT_SET]}.discard((int64_t)offset, (int64_t)len); + } return r; } diff --git a/src/common/options/global.yaml.in b/src/common/options/global.yaml.in index 490d5c4edd40..1f2bae5e410e 100644 --- a/src/common/options/global.yaml.in +++ b/src/common/options/global.yaml.in @@ -4167,6 +4167,16 @@ options: - runtime see_also: - bdev_async_discard_threads +- name: bdev_max_discard_length + desc: maximum length of a single discard request + type: uint + level: advanced + default: 2147483648 + with_legacy: true + flags: + - runtime + see_also: + - bdev_enable_discard - name: bdev_flock_retry_interval type: float level: advanced