Tworzymy patch ze źródeł przechowywanych na platformie git.

Stworzenie patcha za pomocą oprogramowania Git jest niezwykle proste. Jeśli chcemy zaimplementować poprawki bądź nowe funkcjonalności do własnego projektu, musimy najpierw sklonować interesujące nas repozytorium na dysk twardy. W niniejszym poradniku zaprezentuję jak stworzyć patch na jądro Linuksa zawierający schedulery bfq-sq oraz bfq-mq.

Jak wspominałem, aby stworzyć patch musimy sklonować interesujące nas repozytorium. Jest to czynność niezwykle prosta:

git clone https://github.com/Algodev-github/bfq-mq

Następnie wchodzimy do sklonowanego katalogu bfq-mq poleceniem cd:

cd bfq-mq

Teraz musimy przejrzeć historię zmian w repozytorium, by wybrać tylko te, które potrzebujemy. Do tego posłużymy się komendą:

git log --oneline

Parametr –oneline wyświetli tylko i wyłącznie ID rewizji i krótki opis.

W naszym przypadku otrzymujemy następujący wynik:

[lucjan@archlinux bfq-mq]$ git log --oneline
5b5e52d2a620 (HEAD -> bfq-mq, origin/bfq-mq, origin/HEAD) bfq-sq, bfq-mq: fix unbalanced decrements of burst size
0f98137b1769 bfq-sq, bfq-mq: decrease burst size when queues in burst exit
964211adab45 bfq-sq, bfq-mq: let early-merged queues be weight-raised on split too
509765a31e63 bfq-sq, bfq-mq: check and switch back to interactive wr also on queue split
e64aeadb4f91 Fix commit "Unnest request-queue and ioc locks from scheduler locks"
d7840b6ac19c bfq-mq, bfq-sq: fix wrong init of saved start time for weight raising
42774e45b443 bfq-mq, bfq-sq: Disable writeback throttling
359c80c56b2e doc, block, bfq: fix some typos and stale sentences
44fecf589ba5 bfq-sq-mq: guarantee update_next_in_service always returns an eligible entity
05297eacb750 bfq-sq-mq: remove direct switch to an entity in higher class
b87ca02cf653 bfq-sq-mq: make lookup_next_entity push up vtime on expirations
27519a0610f4 bfq-sq: fix commit "Remove all get and put of I/O contexts" in branch bfq-mq
49122ffbec8b Improve most frequently used no-logging path
c090feba346e Add to documentation that bfq-mq and bfq-sq contain last fixes too
374540fba52b bfq-sq: fix prefix of names of cgroups parameters
7c495c47cd76 Add list of bfq instances to documentation
2c28129407ff Port of "blk-mq-sched: unify request prepare methods"
4174a95ced96 Port of "bfq-iosched: fix NULL ioc check in bfq_get_rq_private"
b4720a92ca88 Port of "blk-mq-sched: unify request finished methods"
361c2613e8fb bfq-mq: fix macro name in conditional invocation of policy_unregister
81882fae92ce block, bfq-mq: access and cache blkg data only when safe
474ea0ee6c7e Add tentative extra tests on groups, reqs and queues
e2966d2bea5e Change cgroup params prefix to bfq-mq for bfq-mq
bf017959d245 Fix wrong unlikely
e1f5689e3a33 BUGFIX: Remove unneeded and deadlock-causing lock in request_merged
74ca6136f416 Remove all get and put of I/O contexts
d639823a720d Complete support for cgroups
d77be8b4e86f TESTING: Check wrong invocation of merge and put_rq_priv functions
e62c99bd8559 Add checks and extra log messages - Part III
6f24bd54739c Fix unbalanced increment of rq_in_driver
8cb0e3a8ad27 Add checks and extra log messages - Part II
38a99fe33c65 Unnest request-queue and ioc locks from scheduler locks
37386409fc53 bfq-mq: execute exit_icq operations immediately
9c1dd12d07a9 Add lock check in bfq_allow_bio_merge
3ea0c2a028ba Add checks and extra log messages - Part I
9d86ef71114f Modify interface and operation to comply with blk-mq-sched
19b0b7883268 Embed bfq-ioc.c and add locking on request queue
e5205e54c10a Move thinktime from bic to bfqq
f2a5d7bbafcb Copy header file bfq.h as bfq-mq.h
19a3c98f7975 Increase max policies for io controller
32d3fb40756e Add config and build bits for bfq-mq-iosched
4d0266e390cd FIRST BFQ-MQ COMMIT: Copy bfq-sq-iosched.c as bfq-mq-iosched.c
7affa287d6de block, bfq: improve and refactor throughput-boosting logic
0289514e74ce block, bfq: consider also in_service_entity to state whether an entity is active
25833ce8a490 block, bfq: reset in_service_entity if it becomes idle
b3a96863cbba Add extra checks related to entity scheduling
958551133e0a Add BFQ-v8r12
0b07194bb55e Linux 4.14-rc7
19e12196da60 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
6c325f4eca9e Merge branch 'net_sched-fix-races-with-RCU-callbacks'
31c2611b66e0 selftests: Introduce a new test case to tc testsuite
7f071998474a selftests: Introduce a new script to generate tc batch file
46e235c15ca4 net_sched: fix call_rcu() race on act_sample module removal

Przechodząc do meritum – aby stworzyć patch musimy wybrać jako pierwszy commit POPRZEDZAJĄCY ten, który nas interesuje (więc w naszym wypadku będzie to 0b07194bb55e) oraz jako drugi ostatni interesujący nas commit (a więc będzie to 5b5e52d2a620).

Do stworzenia patcha posłużymy się poleceniem:

git format-patch --stdout

Parametr –stdout oznacza, iż wszystkie poprawki będą udostępnione w jednym, zbiorczym patchu. Bez użycia wyżej wymienionego parametru każda poprawka zostałaby wygenerowana jako oddzielny patch. Takie rozwiązanie ma swoje zalety, jednakże uważam, że im więcej łatek, tym ich nakładanie staje się bardziej czasochłonne i problematyczne.

Reasumując, polecenie którego użyjemy powinno przyjąć taką formę:

git format-patch --stdout 0b07194bb55e...5b5e52d2a620 > 4.14-bfq-sq-mq-git-20171030.patch

Jeśli wszystko wykonaliśmy poprawnie, nasz patch powinien wyglądać następująco:

4.14-bfq-sq-mq-git-20171030.patch

Dodaj komentarz