def test_trim_basic(nvme0: d.Controller, nvme0n1: d.Namespace, verify): GB = 1024 * 1024 * 1024 all_zero_databuf = d.Buffer(512) trimbuf = d.Buffer(4096) q = d.Qpair(nvme0, 32) # DUT info logging.info("model number: %s" % nvme0.id_data(63, 24, str)) logging.info("firmware revision: %s" % nvme0.id_data(71, 64, str)) # write logging.info("write data in 10G ~ 20G") io_size = 128 * 1024 // 512 start_lba = 10 * GB // 512 lba_count = 10 * GB // 512 nvme0n1.ioworker(io_size=io_size, lba_align=io_size, lba_random=False, read_percentage=0, lba_start=start_lba, io_count=lba_count // io_size, qdepth=128).start().close() # verify data after write, data should be modified with pytest.warns(UserWarning, match="ERROR status: 02/85"): nvme0n1.compare(q, all_zero_databuf, start_lba).waitdone() # get the empty trim time trimbuf.set_dsm_range(0, 0, 0) trim_cmd = nvme0n1.dsm(q, trimbuf, 1).waitdone() # first call is longer, due to cache? start_time = time.time() trim_cmd = nvme0n1.dsm(q, trimbuf, 1).waitdone() empty_trim_time = time.time() - start_time # the trim time on device-side only logging.info("trim the 10G data from LBA 0x%lx" % start_lba) trimbuf.set_dsm_range(0, start_lba, lba_count) start_time = time.time() trim_cmd = nvme0n1.dsm(q, trimbuf, 1).waitdone() trim_time = time.time() - start_time - empty_trim_time logging.info("trim bandwidth: %0.2fGB/s" % (10 / trim_time)) # verify after trim nvme0n1.compare(q, all_zero_databuf, start_lba).waitdone()
def test_dsm_trim(nvme0: d.Controller, nvme0n1: d.Namespace, qpair: d.Qpair): trimbuf = d.Buffer(4096) # DUT info logging.info("model number: %s" % nvme0.id_data(63, 24, str)) logging.info("firmware revision: %s" % nvme0.id_data(71, 64, str)) # single range start_lba = 0 lba_count = 8 * 1024 trimbuf.set_dsm_range(0, start_lba, lba_count) nvme0n1.dsm(qpair, trimbuf, 1, attribute=0x4).waitdone() # multiple range lba_count = lba_count // 256 for i in range(256): trimbuf.set_dsm_range(i, start_lba + i * lba_count, lba_count) nvme0n1.dsm(qpair, trimbuf, 256).waitdone()