TP_STRUCT__entry(
                __field(s32, cpu_id)
+               __field(s32, node_id)
        ),
 
        TP_fast_assign(
                __entry->cpu_id = raw_smp_processor_id();
+               __entry->node_id = cpu_to_node(__entry->cpu_id);
        ),
 
-       TP_printk("cpu_id=%d", __entry->cpu_id)
+       TP_printk("cpu_id=%d node_id=%d", __entry->cpu_id, __entry->node_id)
 );
 
 TRACE_EVENT(rseq_ip_fixup,
 
         */
        __u32 flags;
 
+       /*
+        * Restartable sequences node_id field. Updated by the kernel. Read by
+        * user-space with single-copy atomicity semantics. This field should
+        * only be read by the thread which registered this data structure.
+        * Aligned on 32-bit. Contains the current NUMA node ID.
+        */
+       __u32 node_id;
+
        /*
         * Flexible array member at end of structure, after last feature field.
         */
 
  *   F1. <failure>
  */
 
-static int rseq_update_cpu_id(struct task_struct *t)
+static int rseq_update_cpu_node_id(struct task_struct *t)
 {
-       u32 cpu_id = raw_smp_processor_id();
        struct rseq __user *rseq = t->rseq;
+       u32 cpu_id = raw_smp_processor_id();
+       u32 node_id = cpu_to_node(cpu_id);
 
        if (!user_write_access_begin(rseq, t->rseq_len))
                goto efault;
        unsafe_put_user(cpu_id, &rseq->cpu_id_start, efault_end);
        unsafe_put_user(cpu_id, &rseq->cpu_id, efault_end);
+       unsafe_put_user(node_id, &rseq->node_id, efault_end);
        /*
         * Additional feature fields added after ORIG_RSEQ_SIZE
         * need to be conditionally updated only if
        return -EFAULT;
 }
 
-static int rseq_reset_rseq_cpu_id(struct task_struct *t)
+static int rseq_reset_rseq_cpu_node_id(struct task_struct *t)
 {
-       u32 cpu_id_start = 0, cpu_id = RSEQ_CPU_ID_UNINITIALIZED;
+       u32 cpu_id_start = 0, cpu_id = RSEQ_CPU_ID_UNINITIALIZED, node_id = 0;
 
        /*
         * Reset cpu_id_start to its initial state (0).
         */
        if (put_user(cpu_id, &t->rseq->cpu_id))
                return -EFAULT;
+       /*
+        * Reset node_id to its initial state (0).
+        */
+       if (put_user(node_id, &t->rseq->node_id))
+               return -EFAULT;
        /*
         * Additional feature fields added after ORIG_RSEQ_SIZE
         * need to be conditionally reset only if
                if (unlikely(ret < 0))
                        goto error;
        }
-       if (unlikely(rseq_update_cpu_id(t)))
+       if (unlikely(rseq_update_cpu_node_id(t)))
                goto error;
        return;
 
                        return -EINVAL;
                if (current->rseq_sig != sig)
                        return -EPERM;
-               ret = rseq_reset_rseq_cpu_id(current);
+               ret = rseq_reset_rseq_cpu_node_id(current);
                if (ret)
                        return ret;
                current->rseq = NULL;