Blame source/vdo/kernel/kernelVDO.h

Packit Service d40955
/*
Packit Service d40955
 * Copyright (c) 2020 Red Hat, Inc.
Packit Service d40955
 *
Packit Service d40955
 * This program is free software; you can redistribute it and/or
Packit Service d40955
 * modify it under the terms of the GNU General Public License
Packit Service d40955
 * as published by the Free Software Foundation; either version 2
Packit Service d40955
 * of the License, or (at your option) any later version.
Packit Service d40955
 * 
Packit Service d40955
 * This program is distributed in the hope that it will be useful,
Packit Service d40955
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d40955
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d40955
 * GNU General Public License for more details.
Packit Service d40955
 * 
Packit Service d40955
 * You should have received a copy of the GNU General Public License
Packit Service d40955
 * along with this program; if not, write to the Free Software
Packit Service d40955
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service d40955
 * 02110-1301, USA. 
Packit Service d40955
 *
Packit Service d40955
 * $Id: //eng/vdo-releases/aluminum/src/c++/vdo/kernel/kernelVDO.h#4 $
Packit Service d40955
 */
Packit Service d40955
Packit Service d40955
#ifndef KERNEL_VDO_H
Packit Service d40955
#define KERNEL_VDO_H
Packit Service d40955
Packit Service d40955
#include "completion.h"
Packit Service d40955
#include "kernelTypes.h"
Packit Service d40955
#include "threadRegistry.h"
Packit Service d40955
#include "workQueue.h"
Packit Service d40955
Packit Service d40955
typedef struct {
Packit Service d40955
  KVDO              *kvdo;
Packit Service d40955
  ThreadID           threadID;
Packit Service d40955
  KvdoWorkQueue     *requestQueue;
Packit Service d40955
  RegisteredThread   allocatingThread;
Packit Service d40955
} KVDOThread;
Packit Service d40955
Packit Service d40955
struct kvdo {
Packit Service d40955
  KVDOThread        *threads;
Packit Service d40955
  ThreadID           initializedThreadCount;
Packit Service d40955
  KvdoWorkItem       workItem;
Packit Service d40955
  VDOAction         *action;
Packit Service d40955
  VDOCompletion     *completion;
Packit Service d40955
  // Base-code device info
Packit Service d40955
  VDO               *vdo;
Packit Service d40955
};
Packit Service d40955
Packit Service d40955
typedef enum reqQAction {
Packit Service d40955
  REQ_Q_ACTION_COMPLETION,
Packit Service d40955
  REQ_Q_ACTION_FLUSH,
Packit Service d40955
  REQ_Q_ACTION_MAP_BIO,
Packit Service d40955
  REQ_Q_ACTION_SYNC,
Packit Service d40955
  REQ_Q_ACTION_VIO_CALLBACK
Packit Service d40955
} ReqQAction;
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Initialize the base code interface.
Packit Service d40955
 *
Packit Service d40955
 * @param [in]  kvdo          The KVDO to be initialized
Packit Service d40955
 * @param [in]  threadConfig  The base-code thread configuration
Packit Service d40955
 * @param [out] reason        The reason for failure
Packit Service d40955
 *
Packit Service d40955
 * @return  VDO_SUCCESS or an error code
Packit Service d40955
 **/
Packit Service d40955
int initializeKVDO(KVDO                *kvdo,
Packit Service d40955
                   const ThreadConfig  *threadConfig,
Packit Service d40955
                   char               **reason);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Load the VDO state from disk but don't alter the on-disk state. This method
Packit Service d40955
 * is ultimately called from the constructor for devices which have not been
Packit Service d40955
 * resumed.
Packit Service d40955
 *
Packit Service d40955
 * @param [in]  kvdo                  The KVDO to be started
Packit Service d40955
 * @param [in]  common                The physical layer pointer
Packit Service d40955
 * @param [in]  loadConfig            Load-time parameters for the VDO
Packit Service d40955
 * @param [in]  vioTraceRecording     Debug flag to store
Packit Service d40955
 * @param [out] reason                The reason for failure
Packit Service d40955
 **/
Packit Service d40955
int preloadKVDO(KVDO                 *kvdo,
Packit Service d40955
                PhysicalLayer        *common,
Packit Service d40955
                const VDOLoadConfig  *loadConfig,
Packit Service d40955
                bool                  vioTraceRecording,
Packit Service d40955
                char                **reason);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Starts the base VDO instance associated with the kernel layer. This method
Packit Service d40955
 * is ultimately called from preresume the first time an instance is resumed.
Packit Service d40955
 *
Packit Service d40955
 * @param [in]  kvdo                  The KVDO to be started
Packit Service d40955
 * @param [in]  common                The physical layer pointer
Packit Service d40955
 * @param [out] reason                The reason for failure
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS if started, otherwise error
Packit Service d40955
 */
Packit Service d40955
int startKVDO(KVDO *kvdo, PhysicalLayer *common, char **reason);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Suspend the base VDO instance associated with the kernel layer.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo  The KVDO to be suspended
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS if stopped, otherwise error
Packit Service d40955
 **/
Packit Service d40955
int suspendKVDO(KVDO *kvdo);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Resume the base VDO instance associated with the kernel layer.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo  The KVDO to be resumed
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS or an error
Packit Service d40955
 **/
Packit Service d40955
int resumeKVDO(KVDO *kvdo);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Shut down the base code interface. The kvdo object must first be
Packit Service d40955
 * stopped.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo         The KVDO to be shut down
Packit Service d40955
 **/
Packit Service d40955
void finishKVDO(KVDO *kvdo);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Free up storage of the base code interface. The KVDO object must
Packit Service d40955
 * first have been "finished".
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo         The KVDO object to be destroyed
Packit Service d40955
 **/
Packit Service d40955
void destroyKVDO(KVDO *kvdo);
Packit Service d40955
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Dump to the kernel log any work-queue info associated with the base
Packit Service d40955
 * code.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo     The KVDO object to be examined
Packit Service d40955
 **/
Packit Service d40955
void dumpKVDOWorkQueue(KVDO *kvdo);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Get the VDO pointer for a kvdo object
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo          The KVDO object
Packit Service d40955
 *
Packit Service d40955
 * @return the VDO pointer
Packit Service d40955
 */
Packit Service d40955
static inline VDO *getVDO(KVDO *kvdo)
Packit Service d40955
{
Packit Service d40955
  return kvdo->vdo;
Packit Service d40955
}
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Set whether compression is enabled.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo               The KVDO object
Packit Service d40955
 * @param enableCompression  The new compression mode
Packit Service d40955
 *
Packit Service d40955
 * @return state of compression before new value is set
Packit Service d40955
 **/
Packit Service d40955
bool setKVDOCompressing(KVDO *kvdo, bool enableCompression);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Get the current compression mode
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo          The KVDO object to be queried
Packit Service d40955
 *
Packit Service d40955
 * @return whether compression is currently enabled
Packit Service d40955
 */
Packit Service d40955
bool getKVDOCompressing(KVDO *kvdo);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Gets the latest statistics gathered by the base code.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo  the KVDO object
Packit Service d40955
 * @param stats the statistics struct to fill in
Packit Service d40955
 */
Packit Service d40955
void getKVDOStatistics(KVDO *kvdo, VDOStatistics *stats);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Get the current write policy
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo          The KVDO to be queried
Packit Service d40955
 *
Packit Service d40955
 * @return  the write policy in effect
Packit Service d40955
 */
Packit Service d40955
WritePolicy getKVDOWritePolicy(KVDO *kvdo);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Dump base code status information to the kernel log for debugging.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo          The KVDO to be examined
Packit Service d40955
 */
Packit Service d40955
void dumpKVDOStatus(KVDO *kvdo);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Request the base code prepare to grow the physical space.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo           The KVDO to be updated
Packit Service d40955
 * @param physicalCount  The new size
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS or error
Packit Service d40955
 */
Packit Service d40955
int kvdoPrepareToGrowPhysical(KVDO *kvdo, BlockCount physicalCount);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Notify the base code of resized physical storage.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo           The KVDO to be updated
Packit Service d40955
 * @param physicalCount  The new size
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS or error
Packit Service d40955
 */
Packit Service d40955
int kvdoResizePhysical(KVDO *kvdo, BlockCount physicalCount);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Request the base code prepare to grow the logical space.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo          The KVDO to be updated
Packit Service d40955
 * @param logicalCount  The new size
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS or error
Packit Service d40955
 */
Packit Service d40955
int kvdoPrepareToGrowLogical(KVDO *kvdo, BlockCount logicalCount);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Request the base code grow the logical space.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo          The KVDO to be updated
Packit Service d40955
 * @param logicalCount  The new size
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS or error
Packit Service d40955
 */
Packit Service d40955
int kvdoResizeLogical(KVDO *kvdo, BlockCount logicalCount);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Request the base code go read-only.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo          The KVDO to be updated
Packit Service d40955
 * @param result        The error code causing the read only
Packit Service d40955
 */
Packit Service d40955
void setKVDOReadOnly(KVDO *kvdo, int result);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Perform an extended base-code command
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo          The KVDO upon which to perform the operation.
Packit Service d40955
 * @param argc          The number of arguments to the command.
Packit Service d40955
 * @param argv          The command arguments. Note that all extended
Packit Service d40955
 *                        command argv[0] strings start with "x-".
Packit Service d40955
 *
Packit Service d40955
 * @return VDO_SUCCESS or an error code
Packit Service d40955
 **/
Packit Service d40955
int performKVDOExtendedCommand(KVDO *kvdo, int argc, char **argv);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Enqueue a work item to be processed in the base code context.
Packit Service d40955
 *
Packit Service d40955
 * @param kvdo         The KVDO object in which to run the work item
Packit Service d40955
 * @param item         The work item to be run
Packit Service d40955
 * @param threadID     The thread on which to run the work item
Packit Service d40955
 **/
Packit Service d40955
void enqueueKVDOWork(KVDO *kvdo, KvdoWorkItem *item, ThreadID threadID);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Set up and enqueue a VIO's work item to be processed in the base code
Packit Service d40955
 * context.
Packit Service d40955
 *
Packit Service d40955
 * @param kvio           The VIO with the work item to be run
Packit Service d40955
 * @param work           The function pointer to execute
Packit Service d40955
 * @param statsFunction  A function pointer to record for stats, or NULL
Packit Service d40955
 * @param action         Action code, mapping to a relative priority
Packit Service d40955
 **/
Packit Service d40955
void enqueueKVIO(KVIO             *kvio,
Packit Service d40955
                 KvdoWorkFunction  work,
Packit Service d40955
                 void             *statsFunction,
Packit Service d40955
                 unsigned int      action);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Enqueue an arbitrary completion for execution on its indicated
Packit Service d40955
 * thread.
Packit Service d40955
 *
Packit Service d40955
 * @param enqueueable  The Enqueueable object containing the completion pointer
Packit Service d40955
 **/
Packit Service d40955
void kvdoEnqueue(Enqueueable *enqueueable);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Get the base-code thread index for the current execution context.
Packit Service d40955
 *
Packit Service d40955
 * @return    The thread ID, or (ThreadID)-1 if the current thread is
Packit Service d40955
 *            not a base-code thread, or in an interrupt context.
Packit Service d40955
 **/
Packit Service d40955
ThreadID kvdoGetCurrentThreadID(void);
Packit Service d40955
Packit Service d40955
/**
Packit Service d40955
 * Do one-time initialization of kernelVDO interface.
Packit Service d40955
 **/
Packit Service d40955
void initKernelVDOOnce(void);
Packit Service d40955
Packit Service d40955
#endif // KERNEL_VDO_H