Commit 40d2198b authored by Ori Evron's avatar Ori Evron Committed by Tomasz Zawadzki
Browse files

bdev_null: null support for write alignments feature



The write alignment feature is now supported for the null bdev. The
null_bdev_create RPC has been updated with new arguments, enabling users
to configure the following parameters when creating a null bdev:

'-a' for preferred-write-alignment
'-g' for preferred-write-granularity
'-s' for optimal-write-size
'-c' for preferred-unmap-alignment
'-r' for preferred-unmap-granularity

All the new parameters have a default value of 0, indicating
unspecified value.

Change-Id: Ia03be3a344eb695bc1a47a1a07a85f7b19a7fe45
Signed-off-by: default avatarOri Evron <oevron@nvidia.com>
Signed-off-by: default avatarJim Harris <jimharris@nvidia.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26508


Reviewed-by: default avatarAnkit Kumar <ankit.kumar@samsung.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
parent 994d99ab
Loading
Loading
Loading
Loading
+20 −10
Original line number Diff line number Diff line
@@ -3739,7 +3739,7 @@ Construct @ref bdev_config_null
#### Parameters

 Name                        | Optional   | Type    | Description
------------------ | ---------- | ------- | --------------------------------------------------------------------------------------------------------------
---------------------------- | ---------- | ------- | --------------------------------------------------------------------------------------------------------------
 name                        | Required   | string  | Bdev name to use
 block_size                  | Required   | number  | Block size in bytes
 num_blocks                  | Required   | number  | Number of blocks
@@ -3747,6 +3747,11 @@ Construct @ref bdev_config_null
 md_size                     | Optional   | number  | Metadata size for this bdev. Default=0.
 dif_type                    | Optional   | number  | Protection information type. Parameter --md-size needs to be set along --dif-type. Default=0 - no protection.
 dif_is_head_of_md           | Optional   | boolean | Protection information is in the first 8 bytes of metadata. Default=false.
 preferred_write_granularity | Optional   | number  | Preferred write granularity in blocks
 preferred_write_alignment   | Optional   | number  | Preferred write alignment in blocks
 optimal_write_size          | Optional   | number  | Optimal write size in blocks
 preferred_unmap_granularity | Optional   | number  | Preferred unmap granularity in blocks
 preferred_unmap_alignment   | Optional   | number  | Preferred unmap alignment in blocks

#### Response

@@ -3765,7 +3770,12 @@ Example request:
    "uuid": "2b6601ba-eada-44fb-9a83-a20eb9eb9e90",
    "md_size": 8,
    "dif_type": 1,
    "dif_is_head_of_md": true
    "dif_is_head_of_md": true,
    "preferred_write_granularity": 64,
    "preferred_write_alignment": 64,
    "optimal_write_size": 4,
    "preferred_unmap_granularity": 16,
    "preferred_unmap_alignment": 16,
  },
  "jsonrpc": "2.0",
  "method": "bdev_null_create",
+10 −0
Original line number Diff line number Diff line
@@ -223,6 +223,11 @@ bdev_null_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *
	spdk_json_write_named_bool(w, "dif_is_head_of_md", bdev->dif_is_head_of_md);
	spdk_json_write_named_uint32(w, "dif_pi_format", bdev->dif_pi_format);
	spdk_json_write_named_uuid(w, "uuid", &bdev->uuid);
	spdk_json_write_named_uint32(w, "preferred_write_granularity", bdev->preferred_write_granularity);
	spdk_json_write_named_uint32(w, "preferred_write_alignment", bdev->preferred_write_alignment);
	spdk_json_write_named_uint32(w, "optimal_write_size", bdev->optimal_write_size);
	spdk_json_write_named_uint32(w, "preferred_unmap_granularity", bdev->preferred_unmap_granularity);
	spdk_json_write_named_uint32(w, "preferred_unmap_alignment", bdev->preferred_unmap_alignment);
	spdk_json_write_object_end(w);

	spdk_json_write_object_end(w);
@@ -317,6 +322,11 @@ bdev_null_create(struct spdk_bdev **bdev, const struct null_bdev_opts *opts)

	null_disk->bdev.write_cache = 0;
	null_disk->bdev.blocklen = block_size;
	null_disk->bdev.preferred_write_alignment = opts->preferred_write_alignment;
	null_disk->bdev.preferred_write_granularity = opts->preferred_write_granularity;
	null_disk->bdev.optimal_write_size = opts->optimal_write_size;
	null_disk->bdev.preferred_unmap_alignment = opts->preferred_unmap_alignment;
	null_disk->bdev.preferred_unmap_granularity = opts->preferred_unmap_granularity;
	null_disk->bdev.phys_blocklen = opts->physical_block_size;
	null_disk->bdev.blockcnt = opts->num_blocks;
	null_disk->bdev.md_len = opts->md_size;
+5 −0
Original line number Diff line number Diff line
@@ -20,6 +20,11 @@ struct null_bdev_opts {
	uint32_t block_size;
	uint32_t physical_block_size;
	uint32_t md_size;
	uint32_t preferred_write_alignment;
	uint32_t preferred_write_granularity;
	uint32_t optimal_write_size;
	uint32_t preferred_unmap_alignment;
	uint32_t preferred_unmap_granularity;
	enum spdk_dif_type dif_type;
	bool dif_is_head_of_md;
	enum spdk_dif_pi_format dif_pi_format;
+5 −0
Original line number Diff line number Diff line
@@ -27,6 +27,11 @@ static const struct spdk_json_object_decoder rpc_construct_null_decoders[] = {
	{"dif_type", offsetof(struct null_bdev_opts, dif_type), spdk_json_decode_int32, true},
	{"dif_is_head_of_md", offsetof(struct null_bdev_opts, dif_is_head_of_md), spdk_json_decode_bool, true},
	{"dif_pi_format", offsetof(struct null_bdev_opts, dif_pi_format), spdk_json_decode_uint32, true},
	{"preferred_write_alignment", offsetof(struct null_bdev_opts, preferred_write_alignment), spdk_json_decode_uint32, true},
	{"preferred_write_granularity", offsetof(struct null_bdev_opts, preferred_write_granularity), spdk_json_decode_uint32, true},
	{"optimal_write_size", offsetof(struct null_bdev_opts, optimal_write_size), spdk_json_decode_uint32, true},
	{"preferred_unmap_alignment", offsetof(struct null_bdev_opts, preferred_unmap_alignment), spdk_json_decode_uint32, true},
	{"preferred_unmap_granularity", offsetof(struct null_bdev_opts, preferred_unmap_granularity), spdk_json_decode_uint32, true},
};

static void
+11 −1
Original line number Diff line number Diff line
@@ -242,7 +242,12 @@ def add_parser(subparsers):
                                             md_size=args.md_size,
                                             dif_type=args.dif_type,
                                             dif_is_head_of_md=args.dif_is_head_of_md,
                                             dif_pi_format=args.dif_pi_format))
                                             dif_pi_format=args.dif_pi_format,
                                             preferred_write_alignment=args.preferred_write_alignment,
                                             preferred_write_granularity=args.preferred_write_granularity,
                                             optimal_write_size=args.optimal_write_size,
                                             preferred_unmap_alignment=args.preferred_unmap_alignment,
                                             preferred_unmap_granularity=args.preferred_unmap_granularity))

    p = subparsers.add_parser('bdev_null_create', help='Add a bdev with null backend')
    p.add_argument('name', help='Block device name')
@@ -260,6 +265,11 @@ def add_parser(subparsers):
    p.add_argument('-f', '--dif-pi-format', type=int, choices=[0, 1, 2],
                   help='Protection infromation format. Parameter --dif-type needs to be set together.'
                        '0=16b Guard PI, 1=32b Guard PI, 2=64b Guard PI. Default=0.')
    p.add_argument('-a', '--preferred-write-alignment', help='Preferred write alignment in blocks.', type=int)
    p.add_argument('-g', '--preferred-write-granularity', help='Preferred write granularity in blocks.', type=int)
    p.add_argument('-s', '--optimal-write-size', help='Optimal write size in blocks.', type=int)
    p.add_argument('-c', '--preferred-unmap-alignment', help='Preferred unmap granularity in blocks.', type=int)
    p.add_argument('-r', '--preferred-unmap-granularity', help='Preferred unmap granularity in blocks.', type=int)
    p.set_defaults(func=bdev_null_create)

    def bdev_null_delete(args):
Loading