]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tools: hv: Enable debug logs for hv_kvp_daemon
authorShradha Gupta <shradhagupta@linux.microsoft.com>
Tue, 15 Apr 2025 11:19:38 +0000 (04:19 -0700)
committerWei Liu <wei.liu@kernel.org>
Fri, 23 May 2025 16:30:55 +0000 (16:30 +0000)
Allow the KVP daemon to log the KVP updates triggered in the VM
with a new debug flag(-d).
When the daemon is started with this flag, it logs updates and debug
information in syslog with loglevel LOG_DEBUG. This information comes
in handy for debugging issues where the key-value pairs for certain
pools show mismatch/incorrect values.
The distro-vendors can further consume these changes and modify the
respective service files to redirect the logs to specific files as
needed.

Signed-off-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
Reviewed-by: Naman Jain <namjain@linux.microsoft.com>
Reviewed-by: Dexuan Cui <decui@microsoft.com>
Link: https://lore.kernel.org/r/1744715978-8185-1-git-send-email-shradhagupta@linux.microsoft.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Message-ID: <1744715978-8185-1-git-send-email-shradhagupta@linux.microsoft.com>

tools/hv/hv_kvp_daemon.c

index b9ce3aab15fea7edf8c1faf3098dc42d4aaed5f5..1f64c680be13e965eaa8b9c9e128d9bf9081c8ab 100644 (file)
@@ -84,6 +84,7 @@ enum {
 };
 
 static int in_hand_shake;
+static int debug;
 
 static char *os_name = "";
 static char *os_major = "";
@@ -184,6 +185,20 @@ static void kvp_update_file(int pool)
        kvp_release_lock(pool);
 }
 
+static void kvp_dump_initial_pools(int pool)
+{
+       int i;
+
+       syslog(LOG_DEBUG, "===Start dumping the contents of pool %d ===\n",
+              pool);
+
+       for (i = 0; i < kvp_file_info[pool].num_records; i++)
+               syslog(LOG_DEBUG, "pool: %d, %d/%d key=%s val=%s\n",
+                      pool, i + 1, kvp_file_info[pool].num_records,
+                      kvp_file_info[pool].records[i].key,
+                      kvp_file_info[pool].records[i].value);
+}
+
 static void kvp_update_mem_state(int pool)
 {
        FILE *filep;
@@ -271,6 +286,8 @@ static int kvp_file_init(void)
                        return 1;
                kvp_file_info[i].num_records = 0;
                kvp_update_mem_state(i);
+               if (debug)
+                       kvp_dump_initial_pools(i);
        }
 
        return 0;
@@ -298,6 +315,9 @@ static int kvp_key_delete(int pool, const __u8 *key, int key_size)
                 * Found a match; just move the remaining
                 * entries up.
                 */
+               if (debug)
+                       syslog(LOG_DEBUG, "%s: deleting the KVP: pool=%d key=%s val=%s",
+                              __func__, pool, record[i].key, record[i].value);
                if (i == (num_records - 1)) {
                        kvp_file_info[pool].num_records--;
                        kvp_update_file(pool);
@@ -316,20 +336,36 @@ static int kvp_key_delete(int pool, const __u8 *key, int key_size)
                kvp_update_file(pool);
                return 0;
        }
+
+       if (debug)
+               syslog(LOG_DEBUG, "%s: could not delete KVP: pool=%d key=%s. Record not found",
+                      __func__, pool, key);
+
        return 1;
 }
 
 static int kvp_key_add_or_modify(int pool, const __u8 *key, int key_size,
                                 const __u8 *value, int value_size)
 {
-       int i;
-       int num_records;
        struct kvp_record *record;
+       int num_records;
        int num_blocks;
+       int i;
+
+       if (debug)
+               syslog(LOG_DEBUG, "%s: got a KVP: pool=%d key=%s val=%s",
+                      __func__, pool, key, value);
 
        if ((key_size > HV_KVP_EXCHANGE_MAX_KEY_SIZE) ||
-               (value_size > HV_KVP_EXCHANGE_MAX_VALUE_SIZE))
+               (value_size > HV_KVP_EXCHANGE_MAX_VALUE_SIZE)) {
+               syslog(LOG_ERR, "%s: Too long key or value: key=%s, val=%s",
+                      __func__, key, value);
+
+               if (debug)
+                       syslog(LOG_DEBUG, "%s: Too long key or value: pool=%d, key=%s, val=%s",
+                              __func__, pool, key, value);
                return 1;
+       }
 
        /*
         * First update the in-memory state.
@@ -349,6 +385,9 @@ static int kvp_key_add_or_modify(int pool, const __u8 *key, int key_size,
                 */
                memcpy(record[i].value, value, value_size);
                kvp_update_file(pool);
+               if (debug)
+                       syslog(LOG_DEBUG, "%s: updated: pool=%d key=%s val=%s",
+                              __func__, pool, key, value);
                return 0;
        }
 
@@ -360,8 +399,10 @@ static int kvp_key_add_or_modify(int pool, const __u8 *key, int key_size,
                record = realloc(record, sizeof(struct kvp_record) *
                         ENTRIES_PER_BLOCK * (num_blocks + 1));
 
-               if (record == NULL)
+               if (!record) {
+                       syslog(LOG_ERR, "%s: Memory alloc failure", __func__);
                        return 1;
+               }
                kvp_file_info[pool].num_blocks++;
 
        }
@@ -369,6 +410,11 @@ static int kvp_key_add_or_modify(int pool, const __u8 *key, int key_size,
        memcpy(record[i].key, key, key_size);
        kvp_file_info[pool].records = record;
        kvp_file_info[pool].num_records++;
+
+       if (debug)
+               syslog(LOG_DEBUG, "%s: added: pool=%d key=%s val=%s",
+                      __func__, pool, key, value);
+
        kvp_update_file(pool);
        return 0;
 }
@@ -1722,6 +1768,7 @@ void print_usage(char *argv[])
        fprintf(stderr, "Usage: %s [options]\n"
                "Options are:\n"
                "  -n, --no-daemon        stay in foreground, don't daemonize\n"
+               "  -d, --debug            Enable debug logs(syslog debug by default)\n"
                "  -h, --help             print this help\n", argv[0]);
 }
 
@@ -1743,10 +1790,11 @@ int main(int argc, char *argv[])
        static struct option long_options[] = {
                {"help",        no_argument,       0,  'h' },
                {"no-daemon",   no_argument,       0,  'n' },
+               {"debug",       no_argument,       0,  'd' },
                {0,             0,                 0,  0   }
        };
 
-       while ((opt = getopt_long(argc, argv, "hn", long_options,
+       while ((opt = getopt_long(argc, argv, "hnd", long_options,
                                  &long_index)) != -1) {
                switch (opt) {
                case 'n':
@@ -1755,6 +1803,9 @@ int main(int argc, char *argv[])
                case 'h':
                        print_usage(argv);
                        exit(0);
+               case 'd':
+                       debug = 1;
+                       break;
                default:
                        print_usage(argv);
                        exit(EXIT_FAILURE);
@@ -1777,6 +1828,9 @@ int main(int argc, char *argv[])
         */
        kvp_get_domain_name(full_domain_name, sizeof(full_domain_name));
 
+       if (debug)
+               syslog(LOG_INFO, "Logging debug info in syslog(debug)");
+
        if (kvp_file_init()) {
                syslog(LOG_ERR, "Failed to initialize the pools");
                exit(EXIT_FAILURE);