Add commentary
diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c
index 0ea3dd2..fa941a7 100644
--- a/src/core/transport/metadata.c
+++ b/src/core/transport/metadata.c
@@ -46,6 +46,15 @@
 #include "src/core/transport/chttp2/bin_encoder.h"
 #include "src/core/transport/static_metadata.h"
 
+/* There are two kinds of mdelem and mdstr instances.
+ * Static instances are declared in static_metadata.{h,c} and
+ * are initialized by grpc_mdctx_global_init().
+ * Dynamic instances are stored in hash tables on grpc_mdctx, and are backed
+ * by internal_string and internal_element structures.
+ * Internal helper functions here-in (is_mdstr_static, is_mdelem_static) are
+ * used to determine which kind of element a pointer refers to.
+ */
+
 #define INITIAL_STRTAB_CAPACITY 4
 #define INITIAL_MDTAB_CAPACITY 4
 
@@ -81,6 +90,7 @@
 
 typedef void (*destroy_user_data_func)(void *user_data);
 
+/* Shadow structure for grpc_mdstr for non-static values */
 typedef struct internal_string {
   /* must be byte compatible with grpc_mdstr */
   gpr_slice slice;
@@ -98,6 +108,7 @@
   struct internal_string *bucket_next;
 } internal_string;
 
+/* Shadow structure for grpc_mdelem for non-static elements */
 typedef struct internal_metadata {
   /* must be byte compatible with grpc_mdelem */
   internal_string *key;
@@ -130,15 +141,18 @@
 
   gpr_mu mu;
 
+  /* linearly probed hash tables for static element lookup */
   static_string static_strtab[GRPC_STATIC_MDSTR_COUNT * 2];
   static_mdelem static_mdtab[GRPC_STATIC_MDELEM_COUNT * 2];
   size_t static_strtab_maxprobe;
   size_t static_mdtab_maxprobe;
 
+  /* chained hash table of dynamically allocated strings */
   internal_string **strtab;
   size_t strtab_count;
   size_t strtab_capacity;
 
+  /* chained hash table of dynamically allocated mdelems */
   internal_metadata **mdtab;
   size_t mdtab_count;
   size_t mdtab_free;