TFS och feature-brancher

Av Mats Sjövall den 11 December 2014

I mitt nuvarande projekt kör vi GIT tillsammans med TFS samt en stor mängd automatisk tester. Eftersom TFS inte har stöd för Gated-Checkins tillsammans med GIT så har vi satt upp automatiska byggen av feature-brancher (vi kör branch strategin Gitflow Workflow). För en utvecklare funkar det helt enkelt så att man skapar en ny branch (t ex feature/mycoolfeature) och publicerar den på servern varpå ett bygge automatiskt kickar igång. Är bygget grönt, dvs alla tester går igenom så kan man säkert merga in i Dev-branchen utan att breaka Dev-branchen.

Hur sätter man upp detta då?

Börja med att kopiera din befintliga byggdefinition (detta för att inte blanda feature-branch-byggen och Dev-branch-byggen). Tyvärr funkar inte clone-funktionen i TFS Power Tools med byggen som använder Git så man får använda Community TFS Build Manager VS2013 (om man inte orkar klicka i alla inställningar manuellt).

Se till att trigger är ”Continuous Integration”.

Gå in på fliken Source Settings och ändra monitored branch till ”refs/head/feature/*”. Det är allt som behövs. När en ny branch som heter nåt som börjar på ”feature/” publiceras eller om nån checkar in på branchen så kommer den att trigga ett bygge.


Tyvärr ser man inte branch-namnen man byggt ifrån i listan över byggen så ibland kan det vara svårt att hitta utan man får klicka sig ner i varje bygge för att se vad den byggt ifrån (det går att lösa genom att modifierar Build Process Templaten så byggnamnet innehåller branchnamnet, men det är lite mer komplicerat).

Memory management in the kernel – part 1

Av Marcus Folkesson den 28 November 2014

Memory management in the kernel

Memory management is  among the most complex parts in the Linux kernel. There is so many critical parts such as page allocator, slab allocator, virtual memory handling, memory mapping, MMU, IOMMU and so on. All these parts *has* to work perfect (or at least allmost perfect :-) ) because all parts of the system use them either they want to or not. If there is a bug or performance issue you will be noticed quite soon.

My goal is to produce a few posts on the topic and try to sort out the different parts and describe how they work and the connection between. I will begin from the physical bottom and work myself up to how userspace allocates memory in their little blue world with pink clouds. (Everything is so easy on the user side)

struct page

A page is the smallest unit that matters in terms of virtual memory. This is because the MMU (Memory Management Unit, described in a upcoming post) is only dealing with those pages. A typical size for a page is 4KB, at least for 32bit architectures. The most 64-bit architectures uses 8KB pages.
Every one of those physical pages is represented by a struct page that is defined in include/linux/mm_types.h.
That is a lot of pages. If we do a simple calculation:
We have a 32-bit system that has 512MB of physical memory, this memory is divided into 131,072 4KB pages. Think of that 512MB is not even so much memory on a modern system today.

What I want to say is that this struct page should be kept as small as possible because it scales up a lot when physical memory increases.

Ok, so there is a struct page somewhere that got allocated for each physical page, which is a lot, but what does it do?
It does a lot of housekeeping,  lets look at a few set of members that I think is most interresting:
struct page {
unsigned long flags;
unsigned long private;
void *virtual;
atomic_t _count;
pgoff_t index;
#if USE_SPLIT_PTE_PTLOCKS
#if ALLOC_SPLIT_PTLOCKS
spinlock_t *ptl;
#else
spinlock_t ptl;
#endif
#endif

flags is keeping track of the page status which could be dirty (need to be written to media), locked in memory (not allowed to be paged out), permissions and so on. See enum pageflags in  include/linux/page-flags.h for more information.

private is not a defined field. May be used as a long or interpreted as a pointer. (Shared with ptl in a union!)

virtual is the virtual address of the page. In case that the page belongs to the high memory (memory that is not permanently mapped) this field will be NULL and require dynamic mapping.

_count is a simple reference counter to determine when the page is free for allocation.

index is the offset within a mapping.

ptl is a interresting one! I think it requires a special section in this post. (Shared with private in a union!)

Page Table Lock

PTL stands for Page Table Lock and is a per-page lock. In the next part of these memory management posts I will describe the struct mm_struct, how PGD, PMD and PTE are related, but for now it’s enough that you just have heard the words.

Ok, there is one thing that is good to know. The struct mm_struct (also defined in mm_types.h) is a structure that represent a process’s address space and contains all information related to the process memory. The structure has a pointer to virtual memory areas that refers to one or more struct page.

This structure also has the member mm->page_table_lock that is a spinlock that protects all page tables of the mm_struct. This was the original approach and is still used by several architectures. However, this mm->page_table_lock is a little bit clumsy since it lock all pages at once. This is no real problem on a single-cpu without SMP system. But nowdays that is not a very common scenario. Instead, the split page table lock was introduced and has a separate per-table lock to allow concurrency access to pages in the same mm_struct. Remember that the mm_struct is per process? So this increases page-fault/page-access performance in multi-threaded applications only.

When is split page table locks enabed?
It is enabled in compile-time if CONFIG_SPLIT_PTLOCK_CPUS (I have never seen another value but 4 on this one) is less or equal to NR_CPUS.

Here is a few defines int the beginning of the mm_types.h header file:
#define USE_SPLIT_PTE_PTLOCKS (NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS)

#define USE_SPLIT_PMD_PTLOCKS (USE_SPLIT_PTE_PTLOCKS && \
IS_ENABLED(CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK))

#define ALLOC_SPLIT_PTLOCKS (SPINLOCK_SIZE > BITS_PER_LONG/8)

The ALLOC_SPLIT_PTLOCKS is a little bit clever. If the sizeof a spinlock is less or equal to the size of a long, the spinlock is embedded in the struct page and can therefor save a cache line by avoiding indirect access.

If a spinlock does not fit into a long, then the page->ptl is used as a pointer that points to a dynamic allocated spinlock. As I said, this is a clever construction since it allow us to use that increases the size of a spinlock and there is no problem. Exemple when  sizeof spinlock does not fit is when using DEBUG_SPINLOCK, DEBUG_LOCK_ALLOC or applying the PREEMPT_RT patchset.

The spinlock_t is allocated in pgtable_page_ctor() for PTE tables and in pgtable_pmd_page_ctor for PMD tables. These function (and the corresponding *free-functions) should be called in *every* place that allocated/freeing pages. This is already done in mainline, but I know there is evil hardware vendors out there that do not. For example, if you use their evil code and apply the preempt_rt patchset (that increases the sizeof spinlock_t), you hace to verify that thier code behaves.

Also, pgtable_*page_ctor() can fail, this must be handled properly.
Remember that the page-ptl should *never* be accessed directly, use appropriate helper functions for that.

Example on such helper functions is:
pte_offset_map_lock()
pte_unmap_lock()
pte_alloc_map_lock()
pte_lockptr()
pmd_lock()
pmd_lockptr()

Bølgetrening ved Lyngør fyr

Av Linn Eikeland den 21 November 2014

BayesCamp- Bølgetrening ved Lyngør fyr Helgen

6. til 9. november var Combitech AS samlet til BayesCamp og kajakktrening ved Lyngør fyr.

Bølgetrening ved Lyngør fyrMestringen og gleden som oppleves når en utfordrer seg selv, opplever vi at gir gevinst både i arbeidet vi utfører, for samholdet i selskapet og for den enkeltes personlige utvikling. BayesCamp programmet handler om å gi de ansatte en mulighet for denne type utvikling, med mestringsfølelse og personlig utvikling som resultat.

I tidligere BayesCamp program har vi klatret opp Kjerag, vært på isklatring i alpene, satt seil i Lofoten og vært på brevandring. Blant annet.

Programmet for 2014 til 2016 har fått navnet «Hodet over vannet» og det handler om å padle kajakk. Tidligere i år har vi fått «Vått kort» på Fuerteventura og vært på bølgetrening i Nidelva. Det langsiktige målet er at samtlige ansatte skal delta på en flere dagers ekspedisjon i Isfjorden ved Svalbard. De aller tøffeste får også mulighet til å prøve seg i kajakk over Skagerak sommeren 2015. Formålet med «Hodet over vannet» er selvfølgelig at vi skal oppleve høy grad av trivsel, personlig utvikling og et sterkt fellesskap.

Vi jobber med risikoanalyser til daglig og stoler på egen fagkunnskap. Omfattende risikoanalyser ble derfor også gjennomført i forkant av turen til Lyngør. ,som ble gjennomgått med hele gruppen før kajakkene ble satt på sjøen. Combitech har utdannet en intern instruktørgruppe blant de ansatte som i forkant øvet på spesifikke momenter for forholdene vi padlet i. Jan Fasting er en av verdens mest erfarne kajakkpadlere, og vår hovedinstruktør på tur. Det er med andre ord i trygge rammer vi får utfordret oss i ekstreme forhold.

Vi har alle forskjellig nivå for når vi er utenfor komfortsonen. Turen ble derfor lagt opp slik at alle fikk utfordret seg, enten det innebar å surfe på bølgene i åpen sjø, eller kjenne krusninger innaskjærs.

Lyngør
Instruktørgruppen ankom torsdag ettermiddag for å gjøre seg kjent i området og finpusse på opplegget slik at alt lå til rette for en opplevelsesrik helg. Resten av deltakerne kom til kaien ved Lyngør fyr tidlig fredag kveld. Det var mørkt og 2-3 meter høye bølger når taxibåten fraktet deltakerne over til Lyngør fyr.

Lørdag morgen våknet deltakerne opp til kuling og høye bølger på sjøen. For flere satt det langt inne å legge kajakken på sjøen denne dagen men vinden løyet og gruppepadlingen ble gjennomført slik at alle deltakere følte seg trygge og bekvemme, selv om værforholdene til tider var røffe.

God mat og drikke er viktig både for fysisk aktivitet og trivsel. Desmond Ngoni Utete var kokk under hele samlingen og serverte fantastisk mat og drikke. Fredagsunderholdningen bestod av en quiz som trigget konkurranseinstinktet, mens lørdagskvelden ble løftet av Eskimåvisan – den foreløpig friskeste kajakksangen som har blitt sunget på en Combitechtur.

På under ett år har vi ved hjelp av tre samlingen og turer i nærmiljøet hatt en enorm utvikling. I forkant av turen til Fuerteventura var det få som hadde forsøkt kajakk tidligere og under turen til Lyngør var gruppen ute i grov sjø med full kontroll på kajakk, utstyr og teknikk. Gode forberedelser, kommunikasjon, samhold og støtte har bidratt sterkt til dette.

Selv i ruskevær var dette en fantastisk opplevelse.

Hello World

Av Erik Larsson den 19 November 2014

We are geeks, that means we have to start with a Hello World post! So here it is!

   std::cout << "Hello World!" << std::endl;
   printk("Hello world!");

We will blog about our work at the Linux Development Center located in Jönköping. It will be blog posts about Open Source, Embedded work, tips, trix and a hole lot more. Hope you like it!

.NET blir Open Source och gratis Visual Studio Community Edition!

Av Per Salmi den 12 November 2014

image

Jag spinner vidare på Mats Sjövalls betraktelser kring Microsoft och öppenhet… Bilden här ovan är ett klipp från Scott Guthries presentation på online konferensen Connect(); som Microsoft håller nu 12-13 november i New York respektive Redmond, den sammanfattar ganska väl vad som är på gång från Microsoft just nu.

Innovationen kanske är på högsta nivå inom molnplattformen Azures framsteg medan den aggresiva takten av nya releaser av produkter som kommer är spridd över fler områden liksom den nya öppenheten med vad man jobbar på och jobbet med att göra mer och mer av plattformarna till öppen källkod verkar genomsyra allt just nu.

Scott tillkännagav idag att .NET plattformen blir öppenkällkod och att man kommer att släppa officiella versioner av .NET för både Linux och Mac framöver. Detta innebär bland annat att hela .NET runtime och dess kompilatorer nu kommer att vara öppen källkod. Ännu finns inte hela .NET Core som det kommer att kallas upplagt  på Github men det kommer att läggas ut stegvis fram till BUILD 2015 konferensen som kommer att gå i månadsskiftet april-maj 2015. Läs mer om open source processen för .NET på .NET Core is Open Source

För att göra det lättare att jobba med .NET i projekt framöver kommer dessutom en ny Visual Studio Community Edition, en gratis utvecklingsmiljö som kan användas för all utveckling som inte klassas som enterprise-utveckling.

Nytt för denna gratis version är att nu kan man använda extensions även utan att ha en betald Visual Studio licens! Det är alltså en mer komplett utvecklingsmiljö än de tidigare Express utgåvorna.

Ladda ner Visual Studio Community 2013 här.

Community Edition har bland annat stöd för att utveckla mot Azure, devices med Cordova och mycket mer.