Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  percpu_test.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
#include <linux/limits.h>
#include <linux/module.h>

/* validate @native and @pcp counter values match @expected */
#define CHECK(native, pcp, expected)                                    \
 do {                                                            \
  WARN((native) != (expected),                            \
       "raw %ld (0x%lx) != expected %lld (0x%llx)", \
       (native), (native),    \
       (long long)(expected), (long long)(expected)); \
  WARN(__this_cpu_read(pcp) != (expected),                \
       "pcp %ld (0x%lx) != expected %lld (0x%llx)", \
       __this_cpu_read(pcp), __this_cpu_read(pcp), \
       (long long)(expected), (long long)(expected)); \
 } while (0)

static DEFINE_PER_CPU(long, long_counter);
static DEFINE_PER_CPU(unsigned long, ulong_counter);

static int __init percpu_test_init(void)
{
 /*
 * volatile prevents compiler from optimizing it uses, otherwise the
 * +ul_one/-ul_one below would replace with inc/dec instructions.
 */

 volatile unsigned int ui_one = 1;
 unsigned long long ull = 0;
 unsigned long ul = 0;
 long l = 0;

 pr_info("percpu test start\n");

 preempt_disable();

 l += -1;
 __this_cpu_add(long_counter, -1);
 CHECK(l, long_counter, -1);

 l += 1;
 __this_cpu_add(long_counter, 1);
 CHECK(l, long_counter, 0);

 ul = 0;
 __this_cpu_write(ulong_counter, 0);

 ul += 1UL;
 __this_cpu_add(ulong_counter, 1UL);
 CHECK(ul, ulong_counter, 1);

 ul += -1UL;
 __this_cpu_add(ulong_counter, -1UL);
 CHECK(ul, ulong_counter, 0);

 ul += -(unsigned long)1;
 __this_cpu_add(ulong_counter, -(unsigned long)1);
 CHECK(ul, ulong_counter, -1);

 ul = 0;
 __this_cpu_write(ulong_counter, 0);

 ul -= 1;
 __this_cpu_dec(ulong_counter);
 CHECK(ul, ulong_counter, -1);
 CHECK(ul, ulong_counter, ULONG_MAX);

 l += -ui_one;
 __this_cpu_add(long_counter, -ui_one);
 CHECK(l, long_counter, 0xffffffff);

 l += ui_one;
 __this_cpu_add(long_counter, ui_one);
 CHECK(l, long_counter, (long)0x100000000LL);


 l = 0;
 __this_cpu_write(long_counter, 0);

 l -= ui_one;
 __this_cpu_sub(long_counter, ui_one);
 CHECK(l, long_counter, -1);

 l = 0;
 __this_cpu_write(long_counter, 0);

 l += ui_one;
 __this_cpu_add(long_counter, ui_one);
 CHECK(l, long_counter, 1);

 l += -ui_one;
 __this_cpu_add(long_counter, -ui_one);
 CHECK(l, long_counter, (long)0x100000000LL);

 l = 0;
 __this_cpu_write(long_counter, 0);

 l -= ui_one;
 this_cpu_sub(long_counter, ui_one);
 CHECK(l, long_counter, -1);
 CHECK(l, long_counter, ULONG_MAX);

 ul = 0;
 __this_cpu_write(ulong_counter, 0);

 ul += ui_one;
 __this_cpu_add(ulong_counter, ui_one);
 CHECK(ul, ulong_counter, 1);

 ul = 0;
 __this_cpu_write(ulong_counter, 0);

 ul -= ui_one;
 __this_cpu_sub(ulong_counter, ui_one);
 CHECK(ul, ulong_counter, -1);
 CHECK(ul, ulong_counter, ULONG_MAX);

 ul = ull = 0;
 __this_cpu_write(ulong_counter, 0);

 ul = ull += UINT_MAX;
 __this_cpu_add(ulong_counter, ull);
 CHECK(ul, ulong_counter, UINT_MAX);

 ul = 3;
 __this_cpu_write(ulong_counter, 3);

 ul = this_cpu_sub_return(ulong_counter, ui_one);
 CHECK(ul, ulong_counter, 2);

 ul = __this_cpu_sub_return(ulong_counter, ui_one);
 CHECK(ul, ulong_counter, 1);

 preempt_enable();

 pr_info("percpu test done\n");
 return -EAGAIN;  /* Fail will directly unload the module */
}

static void __exit percpu_test_exit(void)
{
}

module_init(percpu_test_init)
module_exit(percpu_test_exit)

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Greg Thelen");
MODULE_DESCRIPTION("percpu operations test");

Messung V0.5
C=95 H=92 G=93

¤ Dauer der Verarbeitung: 0.1 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge