* "size" tells the size of the type it is describing.
         *
         * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT,
-        * FUNC, FUNC_PROTO, VAR and DECL_TAG.
+        * FUNC, FUNC_PROTO, VAR, DECL_TAG and TYPE_TAG.
         * "type" is a type_id referring to another type.
         */
        union {
        BTF_KIND_DATASEC        = 15,   /* Section      */
        BTF_KIND_FLOAT          = 16,   /* Floating point       */
        BTF_KIND_DECL_TAG       = 17,   /* Decl Tag */
+       BTF_KIND_TYPE_TAG       = 18,   /* Type Tag */
 
        NR_BTF_KINDS,
        BTF_KIND_MAX            = NR_BTF_KINDS - 1,
 
        [BTF_KIND_DATASEC]      = "DATASEC",
        [BTF_KIND_FLOAT]        = "FLOAT",
        [BTF_KIND_DECL_TAG]     = "DECL_TAG",
+       [BTF_KIND_TYPE_TAG]     = "TYPE_TAG",
 };
 
 const char *btf_type_str(const struct btf_type *t)
        case BTF_KIND_VOLATILE:
        case BTF_KIND_CONST:
        case BTF_KIND_RESTRICT:
+       case BTF_KIND_TYPE_TAG:
                return true;
        }
 
                case BTF_KIND_VOLATILE:
                case BTF_KIND_CONST:
                case BTF_KIND_RESTRICT:
+               case BTF_KIND_TYPE_TAG:
                        id = type->type;
                        type = btf_type_by_id(btf, type->type);
                        break;
                                   const struct btf_type *t,
                                   u32 meta_left)
 {
+       const char *value;
+
        if (btf_type_vlen(t)) {
                btf_verifier_log_type(env, t, "vlen != 0");
                return -EINVAL;
                return -EINVAL;
        }
 
-       /* typedef type must have a valid name, and other ref types,
+       /* typedef/type_tag type must have a valid name, and other ref types,
         * volatile, const, restrict, should have a null name.
         */
        if (BTF_INFO_KIND(t->info) == BTF_KIND_TYPEDEF) {
                        btf_verifier_log_type(env, t, "Invalid name");
                        return -EINVAL;
                }
+       } else if (BTF_INFO_KIND(t->info) == BTF_KIND_TYPE_TAG) {
+               value = btf_name_by_offset(env->btf, t->name_off);
+               if (!value || !value[0]) {
+                       btf_verifier_log_type(env, t, "Invalid name");
+                       return -EINVAL;
+               }
        } else {
                if (t->name_off) {
                        btf_verifier_log_type(env, t, "Invalid name");
        [BTF_KIND_DATASEC] = &datasec_ops,
        [BTF_KIND_FLOAT] = &float_ops,
        [BTF_KIND_DECL_TAG] = &decl_tag_ops,
+       [BTF_KIND_TYPE_TAG] = &modifier_ops,
 };
 
 static s32 btf_check_meta(struct btf_verifier_env *env,
 
         * "size" tells the size of the type it is describing.
         *
         * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT,
-        * FUNC, FUNC_PROTO, VAR and DECL_TAG.
+        * FUNC, FUNC_PROTO, VAR, DECL_TAG and TYPE_TAG.
         * "type" is a type_id referring to another type.
         */
        union {
        BTF_KIND_DATASEC        = 15,   /* Section      */
        BTF_KIND_FLOAT          = 16,   /* Floating point       */
        BTF_KIND_DECL_TAG       = 17,   /* Decl Tag */
+       BTF_KIND_TYPE_TAG       = 18,   /* Type Tag */
 
        NR_BTF_KINDS,
        BTF_KIND_MAX            = NR_BTF_KINDS - 1,