add reserve, tsc and alignment atomicity with cmpxchg
[lttv.git] / genevent / genevent.c
index dc9058643d462ed7bce25edc3bf6367977ef4ea8..5930489f755bc1f7f9ce7140f31313509a337c85 100644 (file)
@@ -487,19 +487,19 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){
     //allocate buffer
     // MD no more need. fprintf(fp,"\tchar buff[buflength];\n");
     // write directly to the channel
-               fprintf(fp, "\tint length;\n");
     fprintf(fp, "\tunsigned int index;\n");
     fprintf(fp, "\tstruct ltt_channel_struct *channel;\n");
     fprintf(fp, "\tstruct ltt_trace_struct *trace;\n");
     fprintf(fp, "\tunsigned long _flags;\n");
     fprintf(fp, "\tvoid *buff;\n");
-    fprintf(fp, "\tvoid *offset_ptr;\n");
+    fprintf(fp, "\tvoid *old_address;\n");
     fprintf(fp, "\tunsigned int header_length;\n");
-    fprintf(fp, "\tunsigned int event_length;\n");
-    fprintf(fp, "\tint resret;\n");
+    fprintf(fp, "\tunsigned int event_length;\n");     // total size (incl hdr)
+               fprintf(fp, "\tunsigned int length;\n");        // Size of the event var data.
     fprintf(fp, "\tunsigned char _offset;\n");
-    fprintf(fp, "\tunsigned char length_offset;\n");
                fprintf(fp, "\tstruct rchan_buf *buf;\n");
+               fprintf(fp, "\tstruct timeval delta;\n");
+               fprintf(fp, "\tu64 tsc;\n");
 
                if(ev->type != 0)
       fprintf(fp, "\tstruct %s_%s_1* __1;\n\n", ev->name, facName);
@@ -531,26 +531,33 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){
     fprintf(fp, "\t\tif(!trace->active) continue;\n\n");
 
      //length of buffer : length of all structures
-               fprintf(fp,"\t\tlength = 0;\n");
-               fprintf(fp,"\t\tlength_offset = 0;\n");
  //   if(ev->type == 0) fprintf(fp, "0");
    
     fprintf(fp, "\t\tchannel = ltt_get_channel_from_index(trace, index);\n");
                fprintf(fp, "\t\tbuf = channel->rchan->buf[smp_processor_id()];\n");
+               fprintf(fp, "\n");
                /* Warning : not atomic reservation : event size depends on the current
                 * address for alignment */
+               /* NOTE : using cmpxchg in reserve with repeat for atomicity */
     // Replaces _offset
-    fprintf(fp, "\t\theader_length = "
-                "ltt_get_event_header_size(trace, channel,"
-                                                               "buf->data + buf->offset, &_offset);\n");
+               fprintf(fp, "\t\tdo {\n");
+               fprintf(fp, "\t\t\told_address = buf->data + buf->offset;\n");
+    fprintf(fp, "\t\t\tchar *ptr = (char*)old_address;\n");
+
+
+    fprintf(fp, "\t\t\theader_length = ltt_get_event_header_data(trace, "
+                                                                                                                                                                                                                                                               "channel,\n"
+                                                               "\t\t\t\t\t\t\t\t\t\told_address, &_offset, &delta, &tsc);\n");
+
+    fprintf(fp, "\t\t\tptr += _offset + header_length;\n");
 
     for(pos1=0;pos1<structCount;pos1++){
 
       if(ev->type->alignment > 1) {
-        fprintf(fp,"\t\tlength_offset+=(%u - ((unsigned int)ptr&(%u-1)))&(%u-1) ;\n",
+        fprintf(fp,"\t\t\tptr += (%u - ((unsigned int)ptr&(%u-1)))&(%u-1) ;\n",
             ev->type->alignment, ev->type->alignment, ev->type->alignment);
       }
-      fprintf(fp,"\t\tlength+=sizeof(struct %s_%s_%d);\n",ev->name,
+      fprintf(fp,"\t\t\tptr += sizeof(struct %s_%s_%d);\n",ev->name,
           facName,pos1+1);
 //      if(pos1 != structCount-1) fprintf(fp," + ");
     }
@@ -566,26 +573,26 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){
                                if(td->type == SEQUENCE || td->type==STRING || td->type==ARRAY){
                                        if(td->type == SEQUENCE) {
             if(td->alignment > 1) {
-              fprintf(fp,"\t\tlength_offset+=(%u - ((unsigned int)ptr&(%u-1)))&(%u-1)) ;\n",
+              fprintf(fp,"\t\t\tptr += (%u - ((unsigned int)ptr&(%u-1)))&(%u-1)) ;\n",
                       td->alignment, td->alignment, td->alignment);
             }
                                                fprintf(fp,
-                "\t\tlength+=sizeof(%s) + (sizeof(%s) * seqlength_%d);\n",
+                "\t\t\tptr += sizeof(%s) + (sizeof(%s) * seqlength_%d);\n",
                                                                uintOutputTypes[td->size], getTypeStr(td), ++seqCount);
           } else if(td->type==STRING) {
             if(td->alignment > 1) {
-              fprintf(fp,"\t\tlength_offset+=(%u - ((unsigned int)ptr&(%u-1)))&(%u-1)) ;\n",
+              fprintf(fp,"\t\t\tptr += (%u - ((unsigned int)ptr&(%u-1)))&(%u-1)) ;\n",
                  td->alignment, td->alignment, td->alignment);
             }
-            fprintf(fp,"length+=strlength_%d + 1;\n",
+            fprintf(fp,"ptr += strlength_%d + 1;\n",
                                                 ++strCount);
           }
                                        else if(td->type==ARRAY) {
             if(td->alignment > 1) {
-              fprintf(fp,"\t\tlength_offset+=(%u - ((unsigned int)ptr&(%u-1)))&(%u-1);\n",
+              fprintf(fp,"\t\t\tptr += (%u - ((unsigned int)ptr&(%u-1)))&(%u-1);\n",
                  td->alignment, td->alignment, td->alignment);
             }
-                                               fprintf(fp,"\t\tlength+=sizeof(%s) * %d;\n",
+                                               fprintf(fp,"\t\t\tptr += sizeof(%s) * %d;\n",
                 getTypeStr(td),td->size);
                                        if(structCount == 0) flag = 1;
           }
@@ -593,11 +600,18 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){
                        }
     fprintf(fp,";\n");
 
-    fprintf(fp, "\t\tevent_length = _offset + header_length + "
-                "length_offset + length;\n");
-   
+    fprintf(fp, "\t\t\tevent_length = (unsigned long)ptr -"
+                               "(unsigned long)old_address;\n");
+
+               fprintf(fp, "\t\t\tbuff = relay_reserve(channel->rchan, event_length, "
+                                                                                               "old_address);\n");
+               fprintf(fp, "\n");
+               fprintf(fp, "\t\t} while(PTR_ERR(buff) == -EAGAIN);\n");
+               fprintf(fp, "\n");
+
+  
     /* Reserve the channel */
-    fprintf(fp, "\t\tbuff = relay_reserve(channel->rchan, event_length, &resret);\n");
+    //fprintf(fp, "\t\tbuff = relay_reserve(channel->rchan, event_length);\n");
     fprintf(fp, "\t\tif(buff == NULL) {\n");
     fprintf(fp, "\t\t\t/* Buffer is full*/\n");
     fprintf(fp, "\t\t\t/* for debug BUG(); */\n"); // DEBUG!
@@ -606,18 +620,23 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){
     fprintf(fp, "\t\t}\n");
                
                /* DEBUG */
-    fprintf(fp, "\t\tif(resret == 1) {\n");
-               fprintf(fp, "printk(\"f%%lu e\%%u \", ltt_facility_%s_%X, event_%s);",
-                               facName, checksum, ev->name);
-    fprintf(fp, "\t\t}\n");
+    //fprintf(fp, "\t\tif(resret == 1) {\n");
+               //fprintf(fp, "printk(\"f%%lu e\%%u \", ltt_facility_%s_%X, event_%s);",
+               //              facName, checksum, ev->name);
+    //fprintf(fp, "\t\t}\n");
 
     /* Write the header */
+    fprintf(fp, "\n");
+               fprintf(fp,"\t\tlength = event_length - header_length;\n");
     fprintf(fp, "\n");
     fprintf(fp, "\t\tltt_write_event_header(trace, channel, buff, \n"
-                "\t\t\t\tltt_facility_%s_%X, event_%s, length, _offset);\n",
+                "\t\t\t\tltt_facility_%s_%X, event_%s, length, _offset,\n"
+                                                               "\t\t\t\t&delta, &tsc);\n",
                 facName, checksum, ev->name);
     fprintf(fp, "\n");
-    fprintf(fp, "\t\tchar *ptr = (char*)buff + _offset + header_length;\n");
+
+    if(ev->type != 0)
+      fprintf(fp, "\t\tchar *ptr = (char*)buff + _offset + header_length;\n");
 
    
     //declare a char pointer if needed : starts at the end of the structs.
This page took 0.032061 seconds and 4 git commands to generate.