Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dm vdo indexer: reorder uds_request to reduce padding #85

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions drivers/md/dm-vdo/indexer/index-session.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ static int get_index_session(struct uds_index_session *index_session)

int uds_launch_request(struct uds_request *request)
{
size_t internal_size;
int result;

if (request->callback == NULL) {
Expand All @@ -121,10 +120,7 @@ int uds_launch_request(struct uds_request *request)
}

/* Reset all internal fields before processing. */
internal_size =
sizeof(struct uds_request) - offsetof(struct uds_request, zone_number);
// FIXME should be using struct_group for this instead
memset((char *) request + sizeof(*request) - internal_size, 0, internal_size);
memset(&request->internal, 0, sizeof(request->internal));

result = get_index_session(request->session);
if (result != UDS_SUCCESS)
Expand Down
53 changes: 26 additions & 27 deletions drivers/md/dm-vdo/indexer/indexer.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include <linux/mutex.h>
#include <linux/sched.h>
#include <linux/stddef.h>
#include <linux/types.h>
#include <linux/wait.h>

Expand Down Expand Up @@ -73,7 +74,7 @@ enum uds_request_type {
/* Remove any mapping for a name. */
UDS_DELETE,

};
} __packed;

enum uds_open_index_type {
/* Create a new index. */
Expand Down Expand Up @@ -226,7 +227,7 @@ struct uds_zone_message {
enum uds_zone_message_type type;
/* The virtual chapter number to which the message applies */
u64 virtual_chapter;
};
} __packed;

struct uds_index_session;
struct uds_index;
Expand All @@ -253,34 +254,32 @@ struct uds_request {

/* The existing data associated with the request name, if any */
struct uds_record_data old_metadata;
/* Either UDS_SUCCESS or an error code for the request */
int status;
/* True if the record name had an existing entry in the index */
bool found;
/* Either UDS_SUCCESS or an error code for the request */
int status;

/*
* The remaining fields are used internally and should not be altered by clients. The index
* relies on zone_number being the first field in this section.
*/

/* The number of the zone which will process this request*/
unsigned int zone_number;
/* A link for adding a request to a lock-free queue */
struct funnel_queue_entry queue_link;
/* A link for adding a request to a standard linked list */
struct uds_request *next_request;
/* A pointer to the index processing this request */
struct uds_index *index;
/* Control message for coordinating between zones */
struct uds_zone_message zone_message;
/* If true, process request immediately by waking the worker thread */
bool unbatched;
/* If true, continue this request before processing newer requests */
bool requeued;
/* The virtual chapter containing the record name, if known */
u64 virtual_chapter;
/* The region of the index containing the record name */
enum uds_index_region location;
/* The remaining fields are used internally and should not be altered by clients. */
struct_group(internal,
/* The virtual chapter containing the record name, if known */
u64 virtual_chapter;
/* The region of the index containing the record name */
enum uds_index_region location;
/* If true, process request immediately by waking the worker thread */
bool unbatched;
/* If true, continue this request before processing newer requests */
bool requeued;
/* Control message for coordinating between zones */
struct uds_zone_message zone_message;
/* The number of the zone which will process this request*/
unsigned int zone_number;
/* A link for adding a request to a lock-free queue */
struct funnel_queue_entry queue_link;
/* A link for adding a request to a standard linked list */
struct uds_request *next_request;
/* A pointer to the index processing this request */
struct uds_index *index;
);
};

/* A session is required for most index operations. */
Expand Down